#39WA求助
查看原帖
#39WA求助
760776
zzy_zzy楼主2023/10/1 22:04

RT.代码如下:

#include<bits/stdc++.h>
#define has(i) d[i]
#pragma GCC optimize(3,"Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,fma,popcnt,tune=native")
using namespace std;
int a[300010],ks[300010];
struct node{
    int l,r;
	long long sum;
    bool flag;
}fk[548];
int d[3000010];
inline void query(int l,int r){
    int ll=ks[l],rr=ks[r];
    if(ll==rr){
        for(int i=l;i<=r;i++){
        	if(a[i]>2){
        		fk[ll].sum-=a[i];
	            a[i]=has(a[i]);
	            fk[ll].sum+=a[i];
			}
        }
        return;
    }
    for(int i=l;i<=fk[ll].r;i++){
    	if(a[i]>2){
    		fk[ll].sum-=a[i];
	        a[i]=has(a[i]);
	        fk[ll].sum+=a[i];
		}
    }
    for(int i=fk[rr].l;i<=r;i++){
    	if(a[i]>2){
	        fk[rr].sum-=a[i];
	        a[i]=has(a[i]);
	        fk[rr].sum+=a[i];
		}
    }
    for(int i=ll+1;i<rr;i++){
        if(fk[i].flag){
            continue;
        }
        fk[i].flag=1;
        fk[i].sum=0;
        for(int j=fk[i].l;j<=fk[i].r;j++){
            a[j]=has(a[j]);
            fk[i].sum+=a[j];
            if(a[j]>2){
                fk[i].flag=0;
            }
        }
    }
}
inline long long ask(int l,int r){
    int ll=ks[l],rr=ks[r];
	long long sum=0;
    if(ll==rr){
        for(int i=l;i<=r;i++){
            sum+=a[i];
        }
        return sum;
    }
    for(int i=l;i<=fk[ll].r;i++){
        sum+=a[i];
    }
    for(int i=fk[rr].l;i<=r;i++){
        sum+=a[i];
    }
    for(int i=ll+1;i<rr;i++){
        sum+=fk[i].sum;
    }
    return sum;
}
 
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
    int n,m,cnt=0,len;
    cin>>n>>m;
    len=sqrt(n);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        ks[i]=(i-1)/len+1;
        fk[ks[i]].sum+=a[i];
        if((i-1)%len==0){
            fk[++cnt].l=i;
        }
        if(i%len==0){
            fk[cnt].r=i;
        }
    }
    for(int i=1;i<=1e6;i++){
    	for(int j=i;j<=1e6;j+=i){
    		d[j]++;
		}
	}
    while(m--){
        int opt,l,r;
        cin>>opt>>l>>r;
        if(opt==1){
            query(l,r);
        }
        else{
            cout<<ask(l,r)<<endl;
        }
    }
    return 0;
}

提示第119个数错了

2023/10/1 22:04
加载中...