线段树求助
查看原帖
线段树求助
229366
Fast_IO楼主2022/4/28 21:25

RT 样例过了,提交 WA

#include<bits/stdc++.h>
using namespace std;
#define INF 0x7f7f7f7f
#define map unorded_map
#define re register
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define Mod 998244353
#define F1(i,a,b,k) for(re int i=a;i<=b;i+=k)
#define F2(i,a,b,k) for(re int i=a;i>=b;i-=k)
namespace Fast_Io{
	template<typename T> inline void read(T &t){
	    t=0;
	    char c=getchar();
	    int f=1;
	    while(!isdigit(c)){
	        if(c=='-') f=-f;
	        c=getchar();
	    }
	    while(isdigit(c)){
	        t=(t<<3)+(t<<1)+(c^'0');
	        c=getchar();
	    }
	    t*=f;
	}
	template<typename T,typename ... Args> inline void read(T &t,Args&... args){
	    read(t);
	    read(args...);
	}
	template<typename T> inline void print(T x,char c='\0'){
	    if(x<0){
	        x=-x;
	        putchar('-');
	    }
	    if(x>9){
	        print(x/10);
	    }
		putchar(x%10+'0');
		if(c!='\0'){
			putchar(c);
		}
	}
	template<typename T> inline T abs(T x){return x<0?-x:x;}
	inline int lowbit(int x){return x&(-x);}
}
using namespace Fast_Io;
const int N = 1e5+5;
int n,m,a[N],sz;
struct Tree{
	int l,r,sum,lazy_tag;
}tr[N*4];
const int M = 1e7+5;
bool prime[M];
int loc[M];
inline void Prime(int n){
	memset(prime,1,sizeof(prime));
	prime[0]=prime[1]=0;
	F1(i,2,n-1,1){
		if(prime[i]) loc[++sz]=i;
		for(int j=1;j<=sz && i*loc[j]<=n;j++){
			prime[i*loc[j]]=0;
			if(i%loc[j]==0) break;
		}
	}
}
inline void pushup(int p){tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;}
inline bool check(int p){return p<=(1e7)&&prime[p];}
inline void bulid(int p,int l,int r){
	tr[p].l=l,tr[p].r=r;
	if(l==r){
		tr[p].lazy_tag=a[l];
		tr[p].sum=check(a[l]);
		return ;
	}
	int mid=l+r>>1;
	bulid(p*2,l,mid);
	bulid(p*2+1,mid+1,r);
	pushup(p);
}
inline void pushdown(int p){
	if(tr[p].lazy_tag){
		int mid=tr[p].l+tr[p].r>>1;
		tr[p*2].sum=(tr[p].sum>0)*(mid-tr[p].l+1);
		tr[p*2+1].sum=(tr[p].sum>0)*(tr[p].r-mid);
		tr[p*2].lazy_tag=tr[p].lazy_tag;
		tr[p*2+1].lazy_tag=tr[p].lazy_tag;
		tr[p].lazy_tag=0;
	}
	return ;
}
inline int query(int p,int ql,int qr){
	if((ql<=tr[p].l && tr[p].r<=qr) || !tr[p].sum) return tr[p].sum;
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1,ans=0;
	if(ql<=mid) ans+=query(p*2,ql,qr);
	if(qr>mid) ans+=query(p*2+1,ql,qr);
	return ans;
}
inline void update(int p,int id,int k){
	if(tr[p].l==tr[p].r){
		tr[p].lazy_tag+=k;
		tr[p].sum=check(tr[p].lazy_tag);
		return ;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(id<=mid) update(p*2,id,k);
	else update(p*2+1,id,k);
	pushup(p);
}
inline void update2(int p,int ul,int ur,int k){
	if(ul<=tr[p].l && tr[p].r<=ur){
		tr[p].sum=tr[p].r-tr[p].l+1*check(k);
		tr[p].lazy_tag=k;
		return ;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(ul<=mid) update2(p*2,ul,ur,k);
	if(ur>mid) update2(p*2+1,ul,ur,k);
	pushup(p);
}
int main(){
	Prime(M);
	read(n,m);
	F1(i,1,n,1) read(a[i]);
	bulid(1,1,n);
	while(m--){
		int l,r,k;
		char op;
		cin>>op;
		if(op=='A'){
			read(k,l);
			update(1,l,k);
		}else if(op=='R'){
			read(k,l,r);
			update2(1,l,r,k);
		}else{
			read(l,r);
			print(query(1,l,r),'\n');
		}
	}
	return 0;
}

2022/4/28 21:25
加载中...