QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#224679#5441. Quartz CollectionZSH_ZSH#WA 1ms6012kbC++143.3kb2023-10-23 09:12:342023-10-23 09:12:35

Judging History

你现在查看的是最新测评结果

  • [2023-10-23 09:12:35]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:6012kb
  • [2023-10-23 09:12:34]
  • 提交

answer

#include<bits/stdc++.h>
#define rep(i,a,b) for (register int i=(a);i<=(b);i++)
#define drep(i,a,b) for (register int i=(a);i>=(b);i--)
typedef long long ll;
using namespace std;

const int N=300010;

int n,a[N],b[N],m;

struct info
{
	int ls,rs,rnd,tag,val,X,size;
	ll sum;
}t[N];
inline void push_up(int x)
{
	t[x].sum=t[x].val;
	if (t[x].ls) t[x].sum+=t[t[x].ls].sum;
	if (t[x].rs) t[x].sum+=t[t[x].rs].sum;
	t[x].size=1;
	if (t[x].ls) t[x].size+=t[t[x].ls].size;
	if (t[x].rs) t[x].size+=t[t[x].rs].size;
}
void setcov(int node)
{
	t[node].tag^=1;
	t[node].val=-t[node].val;
	t[node].sum=-t[node].sum;
}
inline void push_down(int x)
{
	if (t[x].tag)
	{
		if (t[x].ls) setcov(t[x].ls);
		if (t[x].rs) setcov(t[x].rs);
		t[x].tag=0;
	}
}
array<int,2> split(int x,int X)
{
	if (!x) return {0,0};
	push_down(x);
	if (t[x].X<=X)
	{
		auto rs=split(t[x].rs,X);
		t[x].rs=rs[0];
		push_up(x);
		return {x,rs[1]};
	}
	else
	{
		auto ls=split(t[x].ls,X);
		t[x].ls=ls[1];
		push_up(x);
		return {ls[0],x};
	}
}
array<int,2> splitsz(int x,int X)
{
	if (!x) return {0,0};
	push_down(x);
	if (t[t[x].ls].size+1<=X)
	{
		auto rs=split(t[x].rs,X-1-t[t[x].ls].size);
		t[x].rs=rs[0];
		push_up(x);
		return {x,rs[1]};
	}
	else
	{
		auto ls=split(t[x].ls,X);
		t[x].ls=ls[1];
		push_up(x);
		return {ls[0],x};
	}
}
int merge(int x,int y)
{
	if (!x||!y) return x+y;
	push_down(x);
	push_down(y);
	if (t[x].rnd<t[y].rnd)
	{
		t[x].rs=merge(t[x].rs,y);
		push_up(x);
		return x;
	}
	else
	{
		t[y].ls=merge(x,t[y].ls);
		push_up(y);
		return y;
	}
}
mt19937 rng(time(0));
int rt[5],cnt;

void ins(int x)
{
	if (x<=0)
	{
		array<int,2> s[4];
		rep(i,0,3) s[i]=split(rt[i],x);
		t[++cnt].rnd=rng();
		t[cnt].X=x;
		t[cnt].val=x;
		t[cnt].sum=x;
		t[cnt].size=1;
		int id=0;
		rep(i,0,3) id+=t[s[i][0]].size;
		id++; id%=4;
		s[id][0]=merge(s[id][0],cnt);
		rep(i,0,3) rt[i]=merge(s[i][0],s[(i+3)%4][1]);
	}
	else
	{
		auto s=split(rt[4],x);
		t[++cnt].rnd=rng();
		t[cnt].X=x;
		t[cnt].val=t[cnt].sum=((t[s[0]].size%2==1)?x:-x);
		t[cnt].size=1;
		if (s[1]) setcov(s[1]);
		rt[4]=merge(merge(s[0],cnt),s[1]);
	}
}
void del(int x)
{
	if (x<=0)
	{
		array<int,2> s[4];
		rep(i,0,3) s[i]=split(rt[i],x);
		int id=0;
		rep(i,0,3) id+=t[s[i][0]].size;
		id%=4;
		{
			auto ss=splitsz(s[id][0],t[s[id][0]].size-1);
			s[id][0]=ss[0];
		}
		rep(i,0,3) rt[i]=merge(s[i][0],s[(i+1)%4][1]);
	}
	else
	{
		auto s=split(rt[4],x);
		auto ss=splitsz(s[0],t[s[0]].size-1);
		if (s[1]) setcov(s[1]);
		rt[4]=merge(ss[0],s[1]);
	}
}

ll xns;
void solve()
{
	ll ans=xns;
	ans+=t[rt[0]].sum+t[rt[1]].sum; 
	ans-=t[rt[2]].sum+t[rt[3]].sum; 
	int sz=0;
	rep(i,0,3) sz+=t[rt[i]].size;
	sz%=2;
	if (sz==0)
	{
		ans-=t[rt[4]].sum;
	}
	else ans+=t[rt[4]].sum;
	printf("%lld\n",ans/2);
}

int main()
{
	ios::sync_with_stdio(false); cin.tie(0);
	
	cin>>n>>m;
	rep(i,1,n) cin>>a[i]>>b[i],a[i]*=2,b[i]*=2;
	
	rep(i,1,n)
	{
		xns+=(a[i]+b[i])/2;
		ins((a[i]-b[i])/2);
	}
	solve();
	rep(i,1,m)
	{
		int t,A,B; cin>>t>>A>>B;
		A*=2; B*=2;
		xns-=((a[t]+b[t])/2);
		del((a[t]-b[t])/2);
		a[t]=A,b[t]=B;
		xns+=((a[t]+b[t])/2);
		ins((a[t]-b[t])/2);
		solve();
	}
	
	return 0;
}
/*
4 5
2 4
5 7
1 7
2 1
4 5 2
1 6 2
4 4 3
2 1 3
3 6 6

*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 6004kb

input:

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

output:

13
14
15
14
10
13

result:

ok 6 numbers

Test #2:

score: 0
Accepted
time: 0ms
memory: 5932kb

input:

1 1
1 1
1 1 1

output:

1
1

result:

ok 2 number(s): "1 1"

Test #3:

score: -100
Wrong Answer
time: 1ms
memory: 6012kb

input:

100 100
6 7
100 8
5 61
5 75
59 65
51 47
83 37
34 54
87 46
4 26
21 87
12 97
86 68
60 11
62 76
14 83
29 31
91 62
57 80
47 75
85 97
62 77
91 86
14 25
48 77
83 65
39 61
78 77
45 46
90 74
100 91
86 98
55 5
84 42
91 69
100 4
74 98
60 37
75 44
41 12
15 34
36 1
99 16
7 87
36 26
79 42
41 84
17 98
72 16
38 55...

output:

5109
5084
5079
5025
4995
5019
4989
4961
4957
4960
5016
4952
4771
4727
4775
4876
4931
4877
4870
4791
4809
4700
4706
4666
4582
4641
4709
4780
4644
4664
4686
4677
4843
4715
4670
4616
4611
4706
4760
4823
4859
4792
4809
4807
4792
4739
4684
4593
4792
4661
4666
4533
4566
4568
4646
4646
4521
4476
4461
4518
...

result:

wrong answer 2nd numbers differ - expected: '5065', found: '5084'