本文章由 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;
}

鲁ICP备2025150228号