ABC-D求调
  • 板块学术版
  • 楼主xxxxxzy
  • 当前回复9
  • 已保存回复10
  • 发布时间2023/12/2 21:45
  • 上次更新2023/12/3 08:46:17
查看原帖
ABC-D求调
770611
xxxxxzy楼主2023/12/2 21:45

二维树状数组,一直卡在这题

#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x&-x)
using namespace std;
int n,m,c[(1<<13)][(1<<13)],tot;
void add(int x,int y,int k){
	for(int i=x;i<=n;i+=lowbit(i)){
		for(int j=y;j<=n;j+=lowbit(j)){
			c[i][j]+=k;
		}
	}
}
int ask(int x,int y){
	int ans=0;
	for(int i=x;i;i-=lowbit(i)){
		for(int j=y;j;j-=lowbit(j)){
			ans+=c[i][j];
		}
	}
	return ans;
}
int query(int x,int y,int x2,int y2){
	x++,y++,x2++,y2++;
	return ask(x2,y2)-ask(x-1,y2)-ask(x2,y-1)+ask(x-1,y-1);
}
int op,x,y,x2,y2,k,q;
char ch;
signed main(){
	cin>>n>>q;
	m=n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>ch;
			if(ch=='B') add(i,j,1),tot++;
		}
	}
	for(int i=1;i<=q;i++){
		int ans=0;
		scanf("%lld%lld%lld%lld",&x,&y,&x2,&y2);
		int lux=x/n,luy=y/n,rdx=x2/n,rdy=y2/n;
		int fx=x%n,fy=y%n,fx2=x2%n,fy2=y2%n;
//		cout<<lux<<" "<<luy<<" "<<rdx<<" "<<rdy<<" "<<fx<<" "<<fy<<" "<<fx2<<" "<<fy2<<endl;
		if(lux==rdx&&luy==rdy) ans=query(fx,fy,fx2,fy2);
		else if(lux==rdx){
			ans+=query(fx,fy,fx2,n-1)+query(fx,0,fx2,fy2);
			ans+=query(fx,0,fx2,n-1)*(rdy-luy-1);
		}else if(luy==rdy){
			ans+=query(fx,fy,n-1,fy2)+query(0,fy,fx2,fy2);
			ans+=query(0,fy,n-1,fy2)*(rdx-lux-1);
		}else{
			ans+=query(fx,fy,n-1,n-1)+query(fx,0,n-1,fy2)+query(0,fy,fx2,n-1)+query(0,0,fx2,fy2);
			ans+=query(fx,0,n-1,n-1)*(rdx-lux-1);
			ans+=query(0,fy,n-1,n-1)*(rdy-luy-1);
			ans+=query(0,0,n-1,fy2)*(rdy-luy-1);
			ans+=query(0,0,fx2,n-1)*(rdx-lux-1);
			ans+=tot*(rdy-luy-1)*(rdx-lux-1);
		}
		cout<<ans<<endl;
	}
}
2023/12/2 21:45
加载中...