玄关,简单分块求调
  • 板块学术版
  • 楼主weiy_
  • 当前回复5
  • 已保存回复5
  • 发布时间2025/7/22 10:14
  • 上次更新2025/7/22 14:46:35
查看原帖
玄关,简单分块求调
946180
weiy_楼主2025/7/22 10:14

RT,洛谷上题目在这里:颜色

#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e4+5,MAXM=2e4+5;
int n,m,q,col[MAXN];
int block,sum,pos[MAXN]; 
int t[35][MAXM],val[35][35][MAXM],tn[MAXN],ans,lst_ans=0;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>m>>q;
	block=1700;
	sum=(n%block==0?n/block:(n/block)+1);
	for(int i=1;i<=n;i++){
		cin>>col[i];
		pos[i]=(i%block==0?i/block:(i/block)+1);
	}
	for(int i=1;i<=sum;i++){
		for(int j=(i-1)*block+1;j<=min(i*block,n);j++){
			t[i][col[j]]++; 
		}
		for(int j=1;j<=m;j++){
			t[i][j]+=t[i-1][j];
		}
	}
	for(int i=1;i<=sum;i++){
		for(int j=i;j<=sum;j++){
			for(int k=1;k<=m;k++){
				val[i][j][k]=val[i][j][k-1];
				val[i][j][k]+=(t[j][k]-t[i-1][k])*(t[j][k]-t[i-1][k]);
			}
		}
	}
	for(int i=1,l,r,a,b;i<=q;i++){
		memset(tn,0,sizeof tn);
		cin>>l>>r>>a>>b;
		l^=lst_ans,r^=lst_ans;
		a^=lst_ans,b^=lst_ans;
//		cout<<l<<" "<<r<<" "<<a<<" "<<b<<"\n";
		ans=0;
		if(pos[r]-pos[l]<=1){
			for(int j=l;j<=r;j++){
				if(col[j]<a||col[j]>b) continue;
				ans+=(2*tn[col[j]])+1;
				tn[col[j]]++;
			}
			cout<<ans<<"\n";
		}
		else{
			for(int j=a;j<=b;j++)
				ans+=val[pos[l]+1][pos[r]-1][j];
			for(int j=l;j<=pos[l]*block;j++){
				if(col[j]<a||col[j]>b) continue;
				ans+=2*(t[pos[r]-1][col[j]]-t[pos[l]][col[j]]+tn[col[j]])+1;
				tn[col[j]]++;
			}
			for(int j=(pos[r]-1)*block;j<=r;j++){
				if(col[j]<a||col[j]>b) continue;
				ans+=2*(t[pos[r]-1][col[j]]-t[pos[l]][col[j]]+tn[col[j]])+1;
				tn[col[j]]++;
			}
			cout<<ans<<"\n";
		}
		lst_ans=ans;
	}
	return 0;
} 
2025/7/22 10:14
加载中...