hdu 3874(セグメントツリーポイント更新)

2298 ワード

Necklace
Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3000    Accepted Submission(s): 1023
Problem Description
Mery has a beautiful necklace. The necklace is made up of N magic balls. Each ball has a beautiful value. The balls with the same beautiful value look the same, so if two or more balls have the same beautiful value, we just count it once. We define the beautiful value of some interval [x,y] as F(x,y). F(x,y) is calculated as the sum of the beautiful value from the xth ball to the yth ball and the same value is ONLY COUNTED ONCE. For example, if the necklace is 1 1 1 2 3 1, we have F(1,3)=1, F(2,4)=3, F(2,6)=6.
Now Mery thinks the necklace is too long. She plans to take some continuous part of the necklace to build a new one. She wants to know each of the beautiful value of M continuous parts of the necklace. She will give you M intervals [L,R] (1<=L<=R<=N) and you must tell her F(L,R) of them.
 
Input
The first line is T(T<=10), representing the number of test cases.
  For each case, the first line is a number N,1 <=N <=50000, indicating the number of the magic balls. The second line contains N non-negative integer numbers not greater 1000000, representing the beautiful value of the N balls. The third line has a number M, 1 <=M <=200000, meaning the nunber of the queries. Each of the next M lines contains L and R, the query.
 
Output
For each query, output a line contains an integer number, representing the result of the query.
 
Sample Input

    
    
    
    
2 6 1 2 3 4 3 5 3 1 2 3 5 2 6 6 1 1 1 2 3 5 3 1 1 2 4 3 5

 
Sample Output

    
    
    
    
3 7 14 1 3 6

标题:区間の和を求めるが、同じ数は1回しか加算できない
考え方:この問題は簡単そうに見えますが、離散的に処理すると思います.
まず区間を区間右端点で小さいから大きいまで並べ替えて、それからfor一回
次に1つの数を入力順に線分ツリーに挿入しますが、その数を挿入する前に前に表示されたかどうかを確認し、表示された場合は前回表示された位置を削除し、新しい位置を挿入します
現在の区間の右端に更新した時に停止して、それから現在の区間の和を調べることができて、終わりました~