【有关注为回报/dk】还 是 调 分 块 WA50pts
查看原帖
【有关注为回报/dk】还 是 调 分 块 WA50pts
253765
houpingze楼主2020/12/29 22:10
#include<bits/stdc++.h>
#define reg register int
#define INF (1<<30)
#define int long long 
using namespace std;
int read(){
    int res=0,fs=1; char c=getchar();
    while(!(c>='0' && c<='9')){ if(c=='-')fs=-1; c=getchar(); }
    while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
    return res*fs;
}
void print(int x){
    if(x<0) { putchar('-'); x=-x;}
    if(x>9) print(x/10);
    putchar(x%10+'0');
}
int S;
//int lazy[200005];  
bool flag[2005];
int a[202020],n,cnt,m,ans,tmp,l,r,k,z,x[200005],y[200005],id[200005],v[2010];
inline void sh(int l,int r){ //修改操作 
    int ll=id[l],rr=id[r]; 
    if(ll==rr){
        for(int i=l;i<=r;i++) {
        	v[ll]-=(a[i]-sqrt(a[i])); 
            a[i]=sqrt(a[i]); 
        }
        return ;
    } 
    for(int i=ll+1;i<=rr-1;++i) {  
    	if(flag[i]==0){
    		int fl=0;
    		v[i]=0;
    		for(int j=x[i];j<=y[i];j++){
    			v[i]+=sqrt(a[j]);
    			a[j]=sqrt(a[j]);
    			if(a[j]!=1) fl=1;
			}
			if(fl==0) flag[i]=1;
		} 
    } 
    for(int i=l;i<=y[ll];++i) { 
        v[ll]-=(a[i]-sqrt(a[i])); 
        a[i]=sqrt(a[i]); 
            
    }
    for(int i=x[rr];i<=r;++i){  
    	v[rr]-=(a[i]-sqrt(a[i])); 
        a[i]=sqrt(a[i]);   
    }
}
inline int cx(int l,int r){//查询操作
    //l~~r
    int ll=id[l],rr=id[r];
    int ret=0;
    if(ll==rr){
        for(int i=l;i<=r;i++) ret+=a[i];
        return ret;
    } 
    for(int i=ll+1;i<=rr-1;++i) ret+=v[i];

    for(int i=l;i<=y[ll];++i) ret+=a[i];
    for(int i=x[rr];i<=r;++i) ret+=a[i];
    return ret; 
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n;   
    S=sqrt(n); 
    for(int i=1;i<=n;i++) cin>>a[i];
    cin>>m; 
    for(int i=1;i<=S;i++){
        x[i]=(i-1)*S+1,y[i]=min(i*S,n);
    } 
    if(y[S]<n) S++,x[S]=y[S-1]+1,y[S]=n; 
    for(int i=1;i<=S;i++){ 
        for(int j=x[i];j<=y[i];j++) {
            id[j]=i; 
            v[i]+=a[j];
        }
    } 
    while(m--){
        int op;
        cin>>op;
        if(op==0){
            cin>>l>>r; 
//            if(l>r) tmp=l,l=r,r=tmp;
			if(l>r){
				tmp=l;
				l=r;
				r=tmp;
			} 
            sh(l,r); 
        }else if(op==1){
            cin>>l>>r; 
//            if(l>r) tmp=l,l=r,r=tmp;
			if(l>r){
				tmp=l;
				l=r;
				r=tmp;
			} 
            cout<<cx(l,r)<<endl;
        } 
    }
    return 0;
}
 
2020/12/29 22:10
加载中...