### J. Most Valuable Good Segment

Author: Felix Halim
Prepared By: Felix Halim, Suhendry Effendy

This problem has the least number of accepted submission (together with problem D). I expected this one to be a hard problem in this contest.

It’s a bit hard to explain the solution to this problem, but I’ll try my best. There are a couple ways (which I know) to solve this problem, but most of them are differ only in the implementation detail. I’ll explain my solution in this post.

For each element X, we need to find the first element (Y) to the right which sum with X is 0 (mod M). We need a data structure which able to: (a) store all all elements between X and Y, (b) answer how many elements are there in the set which at most a certain value. BIT (Binary Indexed Tree) data structure can be used. So, a naive (and more stupid) answer would be iterating from A[X+1] to the right, push all elements into BIT, and stop when you found A[Y] where A[X] + A[Y] = 0 (mod M). The value for X then will be the number of elements in BIT (?). Of course this answer will get WA (as we haven’t handled the distinct elements), not to mention TLE.

First, to avoid the WA, we have to modify our BIT a bit. Instead of storing all elements, we should store indexes of distinct elements. Choose the one with lower index if there are two or more elements with the same number. Next, to avoid TLE, we should do two things: (1) compute NOMOD[] for each element in the array, and (2) compute all element’s value in decreasing order (from N to 1). NOMOD[X] is the largest index where there is no element between index X and N in which the sum with A[X] is 0 (mod M); in other word either NOMOD[X] = N or A[X] + A[NOMOD[X]+1] = 0 (mod M). NOMOD[] can be computed in O(N) for all elements – hint: start from the last element. Thus, each query on BIT should be made with NOMOD[X], i.e. how many elements are there which value is at most NOMOD[X]. Now, to handle the distinct elements part, we should process each X starting from the last element. When we process X, first we have to remove all indexes in BIT which number is the same as A[X]. You can do it such that there is at most one such indexes needed to be removed for each X, i.e. by removing only the lowest index to the right (which have the same number). If you keep doing this at each X in decreasing order, then your BIT will only contain indexes of distinct elements.

Now, the problem also asked the segment which have such value. Supposed we already know that X is the head of the most valuable segment. We can find the segment end with min(NOMOD[X],NODUP[X]), where NODUP[X] is the largest index in which increasing X will not increase the value of the segment. Similar to NOMOD[], we can compute NODUP[] in O(N) for all X.

There are 49 submissions have been made for this problem, in which 3 teams managed to get accepted. The first team who solve this problem is Sylph (minute 163) from Bina Nusantara University. The other two are: Panda Shu from Bina Nusantara University (after their 15th attempts) at minute 248, and BerinGAS from University of Indonesia (with 6 attempts) at minute 289.

### 27 Responses to “ACM-ICPC INC 2014”

1. “One popular approach was by first sorting all the strings and pair each succesive string whenever possible”, kode saya spt itu, hanya saja pasangkan dr yg terpanjang http://ideone.com/PGjPAq

2. komen untuk prob J

βOne popular approach was by first sorting all the strings and pair each succesive string whenever possibleβ, kode saya spt itu, hanya saja pasangkan dr yg terpanjang http://ideone.com/PGjPAq

• koreksi, prob G

• Ngga, kode kamu nggak seperti itu. Approach kamu itu jadi sama dengan approach greedy yang bener (pasangin dari leaves) — string yang paling panjang saat itu pasti leaf.

Yang dimaksud “pair each succesive string whenever possible” itu comparenya bener-bener cuma sama 1 string di sebelahnya aja (sorted); sedangkan kamu compare dengan yang panjangnya lebih pendek.

3. a bit curious about problem H. Did you use the real Kawal Pemilu data for judge’s test case? π

• According to the author: YES π

• Nice π

4. nice problem, nice editorial, pretty helpful, thx π

5. saya penasaran dgn problem yg blm sempat saya kerjakan (dan AC), apakah mungkin akan diupload ke situs online judge ?

saya dpt ide sederhana utk problem J dgn menelusuri apakah suatu nilai bisa jadi pivot (menjadi ‘L’), setelah itu cek apakah bs dr index tersebut menjadi good segment, jika tidak cetak impossible, kode saya : [[REMOVED]]

thx koreksinya π

• Lho, cara handle mod-nya (line 30, 41 – 43) jelas salah donk? Kenapa cuma consider pivot L yang ga punya pair-mod nya di dalam array input? Yang diminta kan pivot L yang segmentnya ga ada pair-mod nya.

contoh:
6 10
5 2 8 1 9 5

• karena “((SL + Si) mod M) ? 0, for all i where L ? i ? R.”

apakah mksdnya nilai di index L, jika dipasangkan dgn semua nilai dari L sampai R, modnya tdk akan 0 ?

utk input spt itu outputnya impossible bkn ?

• oh, bayangan sy sblmnya, segment L-R, jumlah bilangan yg berbeda harus sama dgn jml bilangan berbeda array 1 – N

• kelihatannya di situ kesalahannya, gara2 asumsi jml bil beda hrs sama dgn array input…

pertama baca merasa ada kemiripan dgn soal spoj DQUERY yg blm sy mengerti jg π

• Ho iya, “value” di soal J ini sama dengan nilai si d-query (number of distinct elements in a segment).

• “for all i where L <= i <= R" -- artinya cuma dipair dengan semua [L, R], bukan [1, N]; [L, R] itu segmentnya.

• permisi, mengganggu lagi :D, saya sdh mencoba membuat NOMOD utk range tertentu

semoga sudah benar :), [[REMOVED]]

hanya saja kompleksitasnya NOMOD tdk O(N) karena menggunakan map, kalau ada unsorted map spt c++ 11, mgkn bs π

membaca tutorial kadang jd pengen kerjain lg, apakah bs diupload soalnya ke OJ ?

• aduh msh ada salah ><, setelah di-fix, smg uda bener [[REMOVED]]

• Oit, maap beberapa hari ini lagi away, baru bisa cek messagenya.

Solusi yang pertama (SbojVj) masih salah, tapi solusi yang kedua (5i1Mvi) AC π

Anyway, soal sedang diupload ke JOJ, sebentar lagi selesai.

• terima kasih banyak π

• Soal INC sudah diupload ke JOJ. Kode soal: INC14A … INC14J

http://jollybee.binus.ac.id/oj/site/problemset/problem/code/INC14A/

• ok pak, terima kasih, di grup fb ada yg minta sekalian saya post ya link-nya π

• oh ya, apa komen saya yg menyertakan kode yg hampir AC dan AC bs diedit link-nya, takutnya dicopas buat JOJ (kalau boleh copas buat JOJ ya tidak diedit tidak apa2)

saya wkt nulis di ideone tdk login waktu itu, jd tdk bs edit kode di ideone

• Sip, udah diremoved semua link ke code nya π

6. How about ACM-ICPC 2014 Jakarta write up?? Will it be published?

• Yes, it will.

I “lost” one week due to other events after ICPC (and I’ve just come back to my home). So, expect a few more days delay π

7. How can I get input data ?

Thank you for sharing.

• Ah… I didn’t notice this comment before >.< I'll not share the input data publicly. You can test your solution in some online-judges, e.g., tokilearning or joj. (I think) I have sent the test data to the admin on those sites.