90pts求助
查看原帖
90pts求助
800499
suzhikz楼主2024/12/26 21:44
#include<bits/stdc++.h>
#define ll long long
#define reg register
#define db double
#define il inline
using namespace std;
void read(int &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
void read(ll &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
const int N=150005,blo=200000;
int n,m,q;
int cnt[N],c[N],a[N],mark[N];
vector<int>v,pos[N];ll sumpre[N],sumsuf[N];
int fpre[N],fsuf[N];
ll summ[blo+5],id[N],R[blo+5];
int chan[N];
ll ans[N];
ll query(int l,int r){
	ll re=0;
	if(id[l]==id[r]){
		for(int i=l;i<=r;i++)re+=a[i];
	}else{
		for(int i=l;i<=R[id[l]];i++){
			if(mark[c[i]]==0)
			re+=a[i];
		}
		for(int i=id[l]+1;i<id[r];i++)re+=summ[i];
		for(int i=R[id[r]-1]+1;i<=r;i++)if(mark[c[i]]==0)re+=a[i];
	}
	return re;
}
int l[N],r[N],op[N];
signed main(){
	read(n);read(m);read(q);
	for(int i=1;i<=n;i++){
		read(c[i]);cnt[c[i]]++;pos[c[i]].push_back(i);chan[i]=pos[c[i]].size()-1;
	}
	for(int i=1;i<=n;i++)read(a[i]);
	for(int i=1;i<=m;i++){
		if(cnt[i]>=blo){
			mark[i]=v.size()+1;v.push_back(i);
		}
	}
	for(int i=1;i<=q;i++){
		read(op[i]);
		if(op[i]==1){
			read(l[i]),read(r[i]);
		}else read(l[i]);
	}
	memset(cnt,0,sizeof(cnt));
	for(int i=0;i<v.size();i++){
		int la=0;
		for(int j=1;j<=n;j++){
			sumpre[j]=0;
			if(c[j]==v[i]){
				la=j;sumpre[j]=a[j];
			}fpre[j]=la;sumpre[j]+=sumpre[j-1];
		}
		for(int j=1;j<=n;j++){
			if(fpre[j]==0)fpre[j]=la;
			else break;
		}
		la=0;
		for(int j=n;j>=1;j--){
			sumsuf[j]=0;
			if(c[j]==v[i]){
				la=j;sumsuf[j]=a[j];
			}
			sumsuf[j]+=sumsuf[j+1];
			fsuf[j]=la;
		}
		for(int j=n;j>=1;j--){
			if(fsuf[j]==0)fsuf[j]=la;
			else break;
		}
		for(int j=1;j<=q;j++){
			if(op[j]==2){
				if(l[j]==v[i])cnt[l[j]]++;
			}else{
				int ql=l[j],qr=r[j];
				if(fpre[qr]<ql||fpre[qr]>qr)continue;
				int fl=fsuf[ql],fr=fpre[qr];
				fl=chan[fl];fr=chan[fr];
				fl-=cnt[v[i]];fr-=cnt[v[i]];
				if(fl<0){
					fl=-fl;fl%=pos[v[i]].size();fl=-fl;
				}else fl%=pos[v[i]].size();
				if(fr<0){
					fr=-fr;fr%=pos[v[i]].size();fr=-fr;
				}else fr%=pos[v[i]].size();
				
				fl=(fl+pos[v[i]].size())%pos[v[i]].size();
				fr=(fr+pos[v[i]].size())%pos[v[i]].size();
				if(fl>fr){
					ans[j]+=sumsuf[pos[v[i]][fl]]+sumpre[pos[v[i]][fr]];
				}else{
					ans[j]+=sumpre[pos[v[i]][fr]];if(fl)ans[j]-=sumpre[pos[v[i]][fl-1]];
				}
			}
			
		}
	}
	for(int i=1;i<=n;i++){
		id[i]=(i-1)/blo+1;R[id[i]]=i;
		if(mark[c[i]]==0){
			summ[id[i]]+=a[i];
		}
	}
	memset(cnt,0,sizeof(cnt));
	for(int i=1;i<=q;i++){
		if(op[i]==2){
			if(mark[l[i]]==0){
				int len=pos[l[i]].size(),tmp=a[pos[l[i]][len-1]];
				for(int j=len-1;j>=0;j--){
					int u=pos[l[i]][j],v;if(j)v=pos[l[i]][j-1];
					if(j!=0){
						summ[id[u]]-=a[u];a[u]=a[v];summ[id[u]]+=a[u];
					}else{
						summ[id[u]]-=a[u];a[u]=tmp;summ[id[u]]+=a[u];
					}
				}
			}
		}else{
			ans[i]+=query(l[i],r[i]);
		}
	}
	for(int i=1;i<=q;i++){
		if(op[i]==1)cout<<ans[i]<<endl;
	}
	return 0;
}

2024/12/26 21:44
加载中...