听灌佬多
  • 板块灌水区
  • 楼主Sexy_Foxy
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/3 22:14
  • 上次更新2024/12/4 15:51:31
查看原帖
听灌佬多
781352
Sexy_Foxy楼主2024/12/3 22:14
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e2+10,M=1e5+10;
struct question{int l1,r1,l2,r2,id;}furry[M];
struct furry_kuai{
	int by[N],blen;
	void init(int n){
		blen=sqrt(n);
		for(int i=1;i<=n;i++) by[i]=(i-1)/blen+1;
	}
	inline int id(int x){return by[x];}
}f1,f2;
int a[N][N],sum[M],temp[M],l1,r1,l2,r2,n,m,q,cnt;
ll Furry[M],ans;
inline bool cmp(question x,question y){
	if(f1.id(x.l1)^f2.id(y.l1)) return f1.id(x.l1)<f2.id(y.l1);
	if(f2.id(x.r1)^f2.id(y.r1)) return f2.id(x.r1)<f2.id(y.r1);
	if(f1.id(x.l2)^f1.id(x.l2)) return f1.id(x.l2)<f1.id(x.l2);
	return x.r2<y.r2;
}
void update(int x,int y,int z,int val,int opt){
	if(opt==1){
		if(!x) return;
		for(int i=y;i<=z;i++){
			int c=a[x][i];
			if(!i) continue;
			ans-=1ll*sum[c]*sum[c],sum[c]+=val;
			ans+=1ll*sum[c]*sum[c];
		}		
	}
	else{
		if(!z) return;
		for(int i=x;i<=y;i++){
			int c=a[i][z];
			if(!i) continue;
			ans-=1ll*sum[c]*sum[c],sum[c]+=val;
			ans+=1ll*sum[c]*sum[c];
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	f1.init(n),f2.init(m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&a[i][j]);
			temp[++cnt]=a[i][j];
		}
	}
	sort(temp+1,temp+cnt+1),cnt=unique(temp+1,temp+cnt+1)-temp-1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			a[i][j]=lower_bound(temp+1,temp+cnt+1,a[i][j])-temp;
		}
	}
	scanf("%d",&q);
	for(int i=1;i<=q;i++){
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		furry[i].l1=min(l1,l2),furry[i].l2=max(l1,l2);
		furry[i].r1=min(r1,r2),furry[i].r2=max(r1,r2);
		furry[i].id=i;
	}
	sort(furry+1,furry+q+1,cmp);
	l1=1,l2=0,r1=1,r2=0;
	for(int i=1;i<=q;i++){
		while(l1>furry[i].l1) update(--l1,r1,r2,1,1);
		while(r1>furry[i].r1) update(l1,l2,--r1,1,2);
		while(l2<furry[i].l2) update(++l2,r1,r2,1,1);
		while(r2<furry[i].r2) update(l1,l2,++r2,1,2);
		while(l1<furry[i].l1) update(l1++,r1,r2,-1,1);
		while(r1<furry[i].r1) update(l1,l2,r1++,-1,2);
		while(l2>furry[i].l2) update(l2--,r1,r2,-1,1);
		while(r2>furry[i].r2) update(l1,l2,r2--,-1,2);
		Furry[furry[i].id]=ans;
	}
	for(int i=1;i<=q;i++) printf("%lld\n",Furry[i]);
	return 0;
}

二维莫队RE,求调

2024/12/3 22:14
加载中...