MnZn珂朵莉树求助
查看原帖
MnZn珂朵莉树求助
560006
yzq_yzq楼主2023/1/16 23:49

原本的代码RE了,现在照着标程改结果T了,改了4h多了qwq

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct _odt{
	int l,r;
	mutable int v;
	_odt(int il,int ir=0,int iv=0):l(il),r(ir),v(iv){}
	bool operator<(const _odt &x) const{ return l<x.l;}
};
set<_odt> st;
const int MAXN=10000000;
int n,m,cnt,p[MAXN+100];
bool vis[MAXN+100];
set<_odt>::iterator split(int x){
	set<_odt>::iterator it=st.lower_bound(_odt(x));
	if(it!=st.end()&&it->l==x) return it; --it;
	if (it->r<x) return st.end();
	int l=it->l,r=it->r,v=it->v;
	st.erase(it);
	st.insert(_odt(l,x-1,v));
	return st.insert(_odt(x,r,v)).first;
}
void add(int l,int r,int val){
	set<_odt>::iterator itr=split(r+1),itl=split(l);
	st.erase(itl,itr);
	st.insert(_odt(l,r,val));
}
void init(){
	vis[0]=vis[1]=1;
	for(int i=2;i<=MAXN;i++){
		if(!vis[i]) p[cnt++]=i;
		for(int j=0;p[j]*i<=MAXN;j++){
			vis[p[j]*i]=true;
			if(i%p[j]==0) break;
		}
	}
}
signed main(){ 
	init();
	scanf("%lld%lld",&n,&m);
	for(int i=1,x;i<=n;i++){
		scanf("%lld",&x);
		st.insert(_odt(i,i,x));
	}
	while(m--){
		int x,y,z; 	char ch[3];
		scanf("%s%lld%lld",ch,&x,&y);
		if(ch[0]=='A') swap(x,y),split(x+1),split(x)->v+=y;
		else{
			if(ch[0]=='R'){
				scanf("%lld",&z);
				add(y,z,x);
			} else {
				set<_odt>::iterator itl=split(x),itr=split(y+1);
				int ans=0;
				for(;itl!=itr;++itl) if((itl->v)<=10000000&&!vis[itl->v]) ans+=((itl->r)-(itl->l)+1);
				printf("%lld\n",ans); 
			}
		}
//		set<_odt>::iterator itr=split(n+1),itl=split(1);
//		for(;itl!=itr;itl++)
//		{
//			printf("%d %d:%d\n",itl->l,itl->r,itl->v);
//		}
	}
	return 0;
}

原本以为是namespace封装常数大,但改了还是TLE

2023/1/16 23:49
加载中...