社区讨论

找不同

P4054[JSOI2009] 计数问题参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mi1vcdd7
此快照首次捕获于
2025/11/16 23:26
3 个月前
此快照最后确认于
2025/11/18 10:33
3 个月前
查看原帖
求大佬解答:两份代码运行逻辑一样,为何 Code2Code2 可以通过本题,但 Code1Code1 连样例都过不了(区别在于 queryqueryupdateupdate 函数)
Code1Code1CPP
#include<bits/stdc++.h>
using namespace std;
int lowbit(const int x){
	return x&(-x);
}
const int N = 306;
int n,m,a[N][N],w[106][N][N]={ };
void update(const int k,int x,int y,const int num){
	for(;x<=n;x+=lowbit(x)){
		for(;y<=m;y+=lowbit(y)){
			w[k][x][y]+=num;
		}
	}
}
int query(const int k,int x,int y){
	int ans = 0;
	for(;x;x-=lowbit(x)){
		for(;y;y-=lowbit(y)){
			ans+=w[k][x][y];
		}
	}
	return ans;
}
int main(){
	scanf("%d %d",&n,&m);
	for(int i = 1;i<=n;i++){
		for(int j = 1;j<=m;j++){
			scanf("%d",&a[i][j]);
			update(a[i][j],i,j,1);
		}
	}
	int q;
	scanf("%d",&q);
	while(q--){
		int op;
		scanf("%d",&op);
		if(op&1){
			int x,y,c;
			scanf("%d %d %d",&x,&y,&c);
			update(a[x][y],x,y,-1);
			a[x][y] = c;
			update(c,x,y,1);
		}else{
			int x1,x2,y1,y2,c;
			scanf("%d %d %d %d %d",&x1,&x2,&y1,&y2,&c);
			printf("%d\n",query(c,x2,y2)+query(c,x1-1,y1-1)-query(c,x2,y1-1)-query(c,x1-1,y2));
		}
	}
	return 0;
}
Code2Code2CPP
#include<bits/stdc++.h>
using namespace std;
int lowbit(const int x){
	return x&(-x);
}
const int N = 306;
int n,m,a[N][N],w[106][N][N]={ };
void update(const int k,const int x,const int y,const int num){
	for(int i = x;i<=n;i+=lowbit(i)){
		for(int j = y;j<=m;j+=lowbit(j)){
			w[k][i][j]+=num;
		}
	}
}
int query(const int k,const int x,const int y){
	int ans = 0;
	for(int i = x;i>0;i-=lowbit(i)){
		for(int j = y;j>0;j-=lowbit(j)){
			ans+=w[k][i][j];
		}
	}
	return ans;
}
int main(){
	scanf("%d %d",&n,&m);
	for(int i = 1;i<=n;i++){
		for(int j = 1;j<=m;j++){
			scanf("%d",&a[i][j]);
			update(a[i][j],i,j,1);
		}
	}
	int q;
	scanf("%d",&q);
	while(q--){
		int op;
		scanf("%d",&op);
		if(op&1){
			int x,y,c;
			scanf("%d %d %d",&x,&y,&c);
			update(a[x][y],x,y,-1);
			a[x][y] = c;
			update(c,x,y,1);
		}else{
			int x1,x2,y1,y2,c;
			scanf("%d %d %d %d %d",&x1,&x2,&y1,&y2,&c);
			printf("%d\n",query(c,x2,y2)+query(c,x1-1,y1-1)-query(c,x2,y1-1)-query(c,x1-1,y2));
		}
	}
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...