引领天下 @ 2018-12-01 20:11:28
RT,我打了个分块,原先是这样的:
https://www.luogu.org/record/show?rid=14142181
T了1个点。。。
吸了O2之后:
https://www.luogu.org/record/show?rid=14142930
229msAC……汗……
难道是因为我代码太丑了?
代码:
#include <bits/stdc++.h>
using namespace std;
#define maxn 1000005
int n,m,a[maxn],kuai,num,belong[maxn],atag[1005],l[1005],r[1005];
vector<int> Kuai[1005];
void updata(int x){
Kuai[x].clear();
for (int i=l[x];i<=r[x];i++)Kuai[x].push_back(a[i]);
sort(Kuai[x].begin(),Kuai[x].end());
}
void add(int b,int c,int k){
for (int i=b;i<=min(r[belong[b]],c);i++)a[i]+=k;
updata(belong[b]);
if (belong[b]!=belong[c]){
for (int i=l[belong[c]];i<=c;i++)a[i]+=k;
updata(belong[c]);
}
for (int i=belong[b]+1;i<belong[c];i++)atag[i]+=k;
}
int query(int b,int c,int k){
int result=0;
for (int i=b;i<=min(r[belong[b]],c);i++)if (a[i]+atag[belong[i]]>=k)result++;
if (belong[b]!=belong[c])for (int i=l[belong[c]];i<=c;i++)if (a[i]+atag[belong[i]]>=k)result++;
for (int i=belong[b]+1;i<belong[c];i++)result+=Kuai[i].end()-lower_bound(Kuai[i].begin(),Kuai[i].end(),k-atag[i]);
return result;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for (int i=1;i<=n;i++)cin>>a[i];
kuai=sqrt(n);
num=n/kuai+((n%kuai)>0);
for (int i=1;i<=n;i++){
belong[i]=(i-1)/kuai+1;
Kuai[belong[i]].push_back(a[i]);
}
for (int i=1;i<=num;i++){
sort(Kuai[i].begin(),Kuai[i].end());
l[i]=(i-1)*kuai+1;
r[i]=i*kuai;
}
r[num]=n;
while (m--){
char flag;
int l,r,w;
cin>>flag>>l>>r>>w;
if (flag=='M')add(l,r,w);
else cout<<query(l,r,w)<<endl;
}
}
by ddwqwq @ 2018-12-01 20:14:17
@引领天下 不知道为什么,O2对分块的优化特别明显,这种情况我也遇见过好几次
by 引领天下 @ 2018-12-01 20:14:58
@杜岱玮 恐怕是因为我用了STL
by ddwqwq @ 2018-12-01 20:15:56
@引领天下 但我当时没用STL啊。。可能是因为分块单纯的循环比较多
by 引领天下 @ 2018-12-01 20:17:21
@杜岱玮 会不会O2内置了分块啊(大雾
by ddwqwq @ 2018-12-01 20:18:17
QwQ
by Imakf @ 2018-12-01 20:46:34
@引领天下 自带巨大常数
by 水军带你飞 @ 2018-12-01 20:57:29
怕不是测评姬累了