51 nod 1394差と問題(アルゴリズムマラソン8)
集合Sがあり、初期状態でn個の要素があり、彼に対して以下の操作を行う.
1、Sにvの値を持つ要素を追加します.入力形式は1 v
2、Sにvの値を持つ要素を削除します.入力フォーマットは2 v
3、Sの中の要素の2つの差の絶対値の和を尋ねる.入力形式は3
サンプルの場合、
操作3,|1-2|+|1-3|+|2-3|=4
操作1 4の後,集合中の数字は1 2 3 4である.
操作3,|1-2|+|1-3|+|2-3|+|1-4|+|2-4|+|3-4|=10
操作2 2 2の後,集合中の数字は1 3 4である.
操作3,|1-3|+|1-4|+|3-4|=6
Input
Output
Input例
Outputの例
問題を解く構想.
離散化+ツリー配列、1,2操作ごとにツリー配列でそれより大きい個数とそれより小さい個数を統計します
コード:
1、Sにvの値を持つ要素を追加します.入力形式は1 v
2、Sにvの値を持つ要素を削除します.入力フォーマットは2 v
3、Sの中の要素の2つの差の絶対値の和を尋ねる.入力形式は3
サンプルの場合、
操作3,|1-2|+|1-3|+|2-3|=4
操作1 4の後,集合中の数字は1 2 3 4である.
操作3,|1-2|+|1-3|+|2-3|+|1-4|+|2-4|+|3-4|=10
操作2 2 2の後,集合中の数字は1 3 4である.
操作3,|1-3|+|1-4|+|3-4|=6
Input
n,Q 。(1<=n,Q<=100,000)
n a[0],a[1],a[2],…,a[n-1], 。(0<=a[i]<=1,000,000,000)
Q , 。(0<=v<=1,000,000,000)
Output
2 , v , -1。
3 , 。
Input例
3 5
1 2 3
3
1 4
3
2 2
3
Outputの例
4
10
6
問題を解く構想.
離散化+ツリー配列、1,2操作ごとにツリー配列でそれより大きい個数とそれより小さい個数を統計します
コード:
#include
#include
#include
#include
using namespace std;
const int maxn=200000+100;
struct node
{
int id;
long long v;
}q[maxn];
long long a[maxn*4];
int b[maxn*4];
long long t[maxn];
long long cur[maxn];
int cou[maxn];
long long low(int k)
{
return k&(-k);
}
void update(int k,long long v,int v2)
{
while(k0)
{
anss+=a[k];
ansn+=b[k];
k-=low(k);
}
}
int main()
{
int n,qu;
while(~scanf("%d%d",&n,&qu))
{
for(int i=0; i