Logo zibenlun 的博客

博客

又是一道水题

...
zibenlun
2025-12-01 12:58:16
分块好啊

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2023-08-23 13:51:07

分析亿下

数组需要开很大所以不能开二维数组,询问的次数很多,所以不能通过遍历去求和。

打个表可以发现在原始状态下,第 $i$ 行或列的值为:

n*i+n*(n+1)\/2

所以每一行或列的值都是固定的,那么就只需要统计出减少的值。模拟一下可以发现,每一次行的减少,会对所有的列减少当前的行数加上这一列的列数,所以就可以用一个变量统计下所有行减少的当前行数,在统计一下一共减去了多少行,再在输出时将它乘上当前的列数。列的算法同样如此。

重点(代码)

#include<bits\/stdc++.h>
using namespace std;
long long n,q,C,R,sumr,sumc,visr[1000005],visc[1000005];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=q;i++) {
		char s;
		int x;
		cin>>s>>x;
		if(s=='R'){
			if(visr[x]){
				cout<<0<<'\n';
				continue;
			}
			cout<<n*(n+1+2*x)\/2-sumc*x-R<<"\n";
			visr[x]=1;
			C+=x;
			sumr++;
		}
		else {
			if(visc[x]){
				cout<<"0\n";
				continue;
			}
			cout<<n*(n+1+2*x)\/2-sumr*x-C<<"\n";
			visc[x]=1;
			R+=x;
			sumc++;
		}
	}
	return 0;
}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。