0%

SP18185 GIVEAWAY - Give Away(单点修改)(纯纯的分块,享受纯粹的暴力快乐)(三倍经验)

思路讲解

思路就是根号分治

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
FOR(_,1,Q){
ll op,a,b,c;
cin>>op;
if(op==0){
cin>>a>>b>>c;
ll ida=upper_bound(L+1,L+1+idx,a)-L;
ida-=1;
ll idb=upper_bound(L+1,L+1+idx,b)-L;
idb-=1;
ll ans=0;
FOR(i,0,SZ(g[ida])-1){
if(g[ida][i][1]>=a && g[ida][i][1]<=b && g[ida][i][0]>=c){
++ans;
}
}
if(ida!=idb){ // 注意这个地方,小心相同重复统计导致WA
FOR(i,0,SZ(g[idb])-1){
if(g[idb][i][1]>=a && g[idb][i][1]<=b && g[idb][i][0]>=c){
++ans;
}
}
}
FOR(i,ida+1,idb-1){
ll id=lower_bound(all(g[i]),(arr2){c,0})-g[i].begin();
ans+=SZ(g[i])-id;
}
cout<<ans<<"\n";
}else{
cin>>a>>b;
ll id=upper_bound(L+1,L+1+idx,a)-L;
id-=1;
FOR(i,0,SZ(g[id])-1){
if(g[id][i][1]==a){
g[id][i][0]=b;
break;
}
}
sort(all(g[id]));
}
}

如果问小于等于c的可以这么写。

1
2
3
4
FOR(i,ida+1,idb-1){
ll id=upper_bound(all(g[i]),(arr2){c,INF})-g[i].begin();
ans+=id;
}

AC代码

https://www.luogu.com.cn/record/220963190

https://www.luogu.com.cn/record/220973015 双倍经验,SP3261 RACETIME - Race Against Time

https://www.luogu.com.cn/record/220977711 三倍经验,UVA12003 Array Transformer

心路历程(WA,TLE,MLE……)