苣蒻从花神游历各国来的,极限卡常结果在第一个点WA了,有大佬能帮忙看一下吗?
查看原帖
苣蒻从花神游历各国来的,极限卡常结果在第一个点WA了,有大佬能帮忙看一下吗?
648772
Liyuqiao11楼主2023/7/14 19:43
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,m,k,l,r,len,id[N],b[N],t;
unsigned long long a[N],sum[N];
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
void add(int l,int r){
    int sid=id[l],eid=id[r];
    unsigned long long cnt=0;
    if(sid==eid){
        for(int i=l;i<=r;i++){
            sum[sid]-=a[i];
            a[i]=sqrt(a[i]);
            sum[sid]+=a[i];
        }
        return;
    }
    for(int i=l;id[i]==sid;i++){
        sum[sid]-=a[i];
        a[i]=sqrt(a[i]);
        sum[sid]+=a[i];
    }
    for(int i=sid+1;i<eid;i++){
        if(b[i]==0){
            cnt=0;
            for(int j=1;j<=len;j++){
                sum[i]-=a[j+(i-1)*len];
                a[j+(i-1)*len]=sqrt(a[j+(i-1)*len]);
                if(a[j+(i-1)*len]==1){
                    cnt++;
                }
                sum[i]+=a[j+(i-1)*len];
            }
            if(cnt==len){
                b[i]=1; 
                sum[i]=len;
            }
        }
    }
    for(int i=r;id[i]==eid;i--){
        sum[eid]-=a[i];
        a[i]=sqrt(a[i]);
        sum[eid]+=a[i];
    }
    return;
}
unsigned long long query(int l,int r){
    int sid=id[l],eid=id[r];
    unsigned long long ans=0;
    if(sid==eid){
        for(int i=l;i<=r;i++){
            ans+=a[i];
        }
        return ans;
    }
    for(int i=l;id[i]==sid;i++){
        ans+=a[i];
    }
    for(int i=sid+1;i<eid;i++){
        ans+=sum[i];
    }
    for(int i=r;id[i]==eid;i--){
        ans+=a[i];
    }
    return ans;
}
signed main(){
    ios::sync_with_stdio(false);
    while(cin){
        n=read();
        t++;
        memset(sum,0,sizeof(sum));
        len=sqrt(n);
        for(int i=1;i<=n;i++){
            a[i]=read();
            id[i]=(i-1)/len+1;
            sum[id[i]]+=a[i];
        }
        m=read();
        cout<<"Case #"<<t<<":"<<endl;
        for(int i=1;i<=m;i++){
            cin>>k>>l>>r;
            if(l>r){
                swap(l,r);
            }
            if(k==0){
                add(l,r);
            }
            if(k==1){
                cout<<query(l,r)<<endl;
            }
        }
        cout<<endl;
    }
    return 0;
}
2023/7/14 19:43
加载中...