社区讨论

线段树全wa求调

P4247[清华集训 2012] 序列操作参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m06hl21l
此快照首次捕获于
2024/08/23 17:05
去年
此快照最后确认于
2025/11/04 22:38
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
#define MOD 19940417
using namespace std;

ll n,Q,a[50005],C[50005][22];

inline ll Mod(ll k){return (k%MOD+MOD)%MOD;}

class{
	public:
		ll pow[22]={1};
		struct Point{
			ll L,R,lz_ad,lz_ml,cse[22];
		}po[200005];
		inline void print(){
			cout<<endl<<"print"<<endl;
			for(ll i=1;i<=9;i++){
				cout<<"i = "<<i<<"   L = "<<po[i].L<<"   R = "<<po[i].R<<"   lz_ad = "<<po[i].lz_ad<<"   lz_ml = "<<po[i].lz_ml<<endl;
				cout<<"cse = ";for(ll j=0;j<=20;j++)cout<<po[i].cse[j]<<" ";cout<<endl;
			}
		}
		void build(ll x,ll y,ll p=1){
			po[p]={x,y,0,0};po[p].cse[0]=1;
			for(ll i=1;i<=20;i++)po[p].cse[i]=0;
			if(x==y)return;
			ll mid=(x+y)>>1;
			build(x,mid,p<<1);
			build(mid+1,y,p<<1|1);
		}
		inline void add(ll p,ll k){
			if(!k)return;
//			cout<<"add_i("<<p<<","<<k<<")"<<endl;
			ll len=min(20ll,po[p].R-po[p].L+1);
			pow[0]=1;
			for(ll i=1;i<=len;i++)pow[i]=Mod(pow[i-1]*k);
			for(ll i=len;i>=1;i--){
//				cout<<"i = "<<i<<endl;
				for(ll j=0;j<i;j++){
					po[p].cse[i]=Mod(po[p].cse[i]+Mod(Mod(po[p].cse[j]*pow[i-j])*C[len-j][i-j]));
//					cout<<"j = "<<j<<"   po[p].cse[i] += "<<po[p].cse[j]<<" * "<<pow[i-j]<<" * "<<C[len-j][i-j]<<endl;
				}
			}
			po[p].lz_ad=Mod(po[p].lz_ad+k);
		}
		inline void mul(ll p,ll k){
			if(!k)return;
//			cout<<"mul("<<p<<","<<k<<")"<<endl;
			po[p].lz_ml^=1;
			po[p].lz_ad=Mod(-po[p].lz_ad);
			for(ll i=1;i<=20;i+=2)
				po[p].cse[i]=Mod(-po[p].cse[i]);
//			cout<<"cse = ";for(ll i=1;i<=20;i++)cout<<po[p].cse[i]<<" ";cout<<endl;
		}
		inline void pushdown(ll p){
			mul(p<<1,po[p].lz_ml);
			mul(p<<1|1,po[p].lz_ml);
			add(p<<1,po[p].lz_ad);
			add(p<<1|1,po[p].lz_ad);
		}
		inline void pushup(ll p){
//			cout<<"pushup("<<p<<")"<<endl;
			for(ll i=1;i<=20;i++){
//				cout<<"i = "<<i<<endl;
				ll res=0;
				for(ll j=0;j<=i;j++){
					res=Mod(res+Mod(po[p<<1].cse[j]*po[p<<1|1].cse[i-j]));
//					cout<<"j = "<<j<<"   res += "<<po[p<<1].cse[j]<<" * "<<po[p<<1|1].cse[i-j]<<endl;
				}
				po[p].cse[i]=res;
			}
		}
		void modify_ad(ll x,ll y,ll k,ll p=1){
			if(po[p].R<x||po[p].L>y)return;
			if(po[p].L>=x&&po[p].R<=y){
//				cout<<"app("<<p<<","<<k<<")"<<endl;
				return add(p,k);
			}
			pushdown(p);
			modify_ad(x,y,k,p<<1);
			modify_ad(x,y,k,p<<1|1);
			pushup(p);
		}
		void modify_ml(ll x,ll y,ll p=1){
			if(po[p].R<x||po[p].L>y)return;
			if(po[p].L>=x&&po[p].R<=y)return mul(p,1);
			pushdown(p);
			modify_ml(x,y,p<<1);
			modify_ml(x,y,p<<1|1);
			pushup(p);
		}
		ll ans[22],csk,out[22];
		inline void bforquery(){
			csk=0;
			memset(ans,0,sizeof(ans));
			ans[0]=1;
		}
		void query(ll x,ll y,ll p=1){
			if(po[p].R<x||po[p].L>y)return;
			if(po[p].L>=x&&po[p].R<=y){
//				cout<<"query_p = "<<p<<endl;
				if(!csk){
					for(ll i=1;i<=20;i++)
						ans[i]=po[p].cse[i];
					csk=1;
				}
				else{
					memset(out,0,sizeof(out));
					for(ll i=0;i<=20;i++)
						for(ll j=0;j<=20;j++){
							if(i+j==0||i+j>20)continue;
							out[i+j]=Mod(out[i+j]+Mod(ans[i]*po[p].cse[j]));
//							cout<<"i = "<<i<<"   j = "<<j<<"   ans[i] = "<<ans[i]<<"   cse[j] = "<<po[p].cse[j]<<"   out["<<i+j<<"] += "<<ans[i]*po[p].cse[j]<<endl;
						}
					for(ll i=1;i<=20;i++)ans[i]=out[i];
				}
//				cout<<"ans = ";for(ll i=1;i<=20;i++)cout<<ans[i]<<" ";cout<<endl;
				return;
			}
			pushdown(p);
			query(x,y,p<<1);
			query(x,y,p<<1|1);
		}
}tr;

signed main(){
	ios::sync_with_stdio(false);
	
	C[0][0]=1;
	for(ll i=1;i<=50005;i++){
		C[i][0]=1;
		for(ll j=1;j<=20;j++)
			C[i][j]=Mod(C[i-1][j]+C[i-1][j-1]);
	}
		
	cin>>n>>Q;
	for(ll i=1;i<=n;i++)cin>>a[i],a[i]=Mod(a[i]);
	
	tr.build(1,n);
//	tr.print();
	for(ll i=1;i<=n;i++){
//		cout<<"tr.modify("<<i<<","<<i<<","<<a[i]<<")"<<endl;
		tr.modify_ad(i,i,a[i]);
//		tr.print();
	}
	
	while(Q--){
		char op;ll x,y,k;
		cin>>op>>x>>y;
		if(op=='I'){
			cin>>k;k=Mod(k);
			tr.modify_ad(x,y,k);
		}
		else if(op=='R')tr.modify_ml(x,y);
		else{
			cin>>k;
			tr.bforquery();
			tr.query(x,y);
			cout<<tr.ans[k]<<endl;
		}
//		tr.print();
	}
	
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...