阳历过了,但RE
查看原帖
阳历过了,但RE
809371
Love_Natsu楼主2024/8/7 14:08
#include <bits/stdc++.h>
#define N 100005
#define int long long
using namespace std;
int n,m,a[N],ta[N][5],lst1,lst2,ew,num;
struct node{
	int cnt[3];
	int tot[3][3];
}ans[N*4];
int ls[N*4];
int rs[N*4];
void push_up(int x){
	for(int i=0;i<3;i++) ans[x].cnt[i]=ans[ls[x]].cnt[i]+ans[rs[x]].cnt[i];
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			ans[x].tot[i][j]=ans[ls[x]].tot[i][j]+ans[rs[x]].tot[i][j]+ans[ls[x]].cnt[i]*ans[rs[x]].cnt[j];
		}
	}
}
void build(int x,int l,int r){
    if(l==r){
	    ans[x].cnt[a[l]]++;
	    return ;
	}
    int mid=(l+r)/2;
    build(ls[x],l,mid);
    build(rs[x],mid+1,r);
    push_up(x);
} 
void da(int x,int l,int r,int s,int t,int u){
	int ac[3]={0},tmp[3];
    int res[3][3]={0};
    for(int i=0;i<3;i++){
      ac[i]=0;
      for(int j=0;j<3;j++)res[i][j]=0;
    }
    tmp[0]=s;tmp[1]=t;tmp[2]=u;
    for(int i=0;i<3;i++){
      ac[tmp[i]]+=ans[x].cnt[i];
      for(int j=0;j<3;j++)res[tmp[i]][tmp[j]]+=ans[x].tot[i][j];
    }
    for(int i=0;i<3;i++)ans[x].cnt[i]=ac[i];
    for(int i=0;i<3;i++)for(int j=0;j<3;j++)ans[x].tot[i][j]=res[i][j];
    if(ta[x][0]==-1)ta[x][0]=s,ta[x][1]=t,ta[x][2]=u;
    else{
      ta[x][0]=tmp[ta[x][0]];
      ta[x][1]=tmp[ta[x][1]];
      ta[x][2]=tmp[ta[x][2]];
    }
}
int he(node x){
	return x.tot[1][0]+x.tot[2][0]+x.tot[2][1];
}
void push_down(int x,int l,int r){
	int mid=(l+r)/2;
    int s=ta[x][0],u=ta[x][1],t=ta[x][2];
    da(ls[x],l,mid,s,t,u);
    da(rs[x],mid+1,r,s,t,u);
    ta[x][0]=ta[x][1]=ta[x][2]=-1;
}
int q(int l,int r,int a,int b,int &x){
	if(!x)x=++num;
	if(l>=a&&r<=b){
		ew+=lst2*(ans[x].cnt[0]+ans[x].cnt[1])+lst1*ans[x].cnt[0];
        lst1+=ans[x].cnt[1];
		lst2+=ans[x].cnt[2];
        return he(ans[x]);
	}
	if(ta[x][0]!=-1)push_down(x,l,r);
	int mid=(l+r)/2;
	int rt=0;
	if(a<=mid)rt+=q(l,mid,a,b,ls[x]);
	if(b>mid)rt+=q(mid+1,r,a,b,rs[x]);
	return rt;
}
void add(int l,int r,int a,int b,int &x,int s,int t,int u){
	if(!x)x=++num;
	if(l>=a&&r<=b){
		da(x,l,r,s,t,u);
		return;
	}
	if(ta[x][0]!=-1)push_down(x,l,r);
	int mid=(l+r)/2;
	if(a<=mid)add(l,mid,a,b,ls[x],s,t,u);
	if(b>mid)add(mid+1,r,a,b,rs[x],s,t,u);
	push_up(x);
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	memset(ta,-1,sizeof(ta));
	cin>>n>>m;
	for(int i=1;i<=4*n;i++){
		ls[i]=(i<<1);
		rs[i]=ls[i]+1;
	}
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
//	for(int i=1;i<=n;i++)for(int j:{0,1,2})cout<<ans[i].cnt[j]<<" ";
//	cout<<"\n";
	while(m--){
		int op,a,b,s,t,u,r=1;
		ew=lst1=lst2=0;
		cin>>op;
		if(op==2){
			cin>>a>>b>>s>>t>>u;
			add(1,n,a,b,r,s,t,u);
		}
		else {
			cin>>a>>b;
			cout<<q(1,n,a,b,r)+ew<<"\n";
		}
//    		for(int i=1;i<=n;i++)for(int j:{0,1,2})cout<<ans[i].cnt[j]<<" ";
//	        cout<<"\n";
//		    for(int i=1;i<=n;i++)for(int j:{0,1,2})cout<<ta[i][j]<<" ";
//		    cout<<"\n";
	}
	return 0;
}
2024/8/7 14:08
加载中...