P2801 分块 #2 #10 TLE求调
查看原帖
P2801 分块 #2 #10 TLE求调
823122
guozhe6241楼主2024/7/29 21:23
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
inline int read(){
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
    return x*f;
}
inline void write(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
const int maxn=1e6+5;
int n,m,num,len;
int a[maxn],tag[maxn],loc[maxn],l[maxn],r[maxn];
vector<int> tmp[1001];
inline void reset(int pos){
	tmp[pos].clear();
	for(int i=l[pos];i<=r[pos];i++) tmp[pos].push_back(a[i]);
	sort(tmp[pos].begin(),tmp[pos].end());
}
inline void update(int x,int y,int k){
	if(loc[x]==loc[y]){
		for(int i=x;i<=y;i++) a[i]+=k;
		reset(loc[x]);
		return;
	}
	for(int i=x;i<=r[loc[x]];i++) a[i]+=k;
	reset(loc[x]);
	for(int i=l[loc[y]];i<=y;i++) a[i]+=k;
	reset(loc[y]);
	for(int i=loc[x]+1;i<loc[y];i++) tag[i]+=k;
}
inline int query(int x,int y,int k){
	int ans=0;
	if(loc[x]==loc[y]){
		for(int i=x;i<=y;i++) if(a[i]+tag[loc[i]]>=k) ans++;
		return ans;
	}
	for(int i=x;i<=r[loc[x]];i++) if(a[i]+tag[loc[i]]>=k) ans++;
	for(int i=l[loc[y]];i<=y;i++) if(a[i]+tag[loc[i]]>=k) ans++;
	for(int i=loc[x]+1;i<loc[y];i++) ans+=lower_bound(tmp[i].begin(),tmp[i].end(),k-tag[i])-tmp[i].begin();
	return ans;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	len=sqrt(n),num=n/len;
	if(n%len) num++;
	for(int i=1;i<=num;i++) l[i]=(i-1)*len+1,r[i]=i*len,tag[i]=0,reset(i);
	for(int i=1;i<=m;i++){
		char op;
		int x,y,k;
		cin>>op,x=read(),y=read(),k=read();
		if(op=='M') update(x,y,k);
		else cout<<query(x,y,k)<<endl;
	}
	return 0;
}
2024/7/29 21:23
加载中...