题目大意:
输入n,q; 矩阵大小为n*n 每个位置的值为该位置的行数+列数
接下来q行
“R m”表示输出第m行的总和并整行消去
“C m”表示输出第m列的总和并整列消去
Sample Input
3 7
R 2
C 3
R 2
R 1
C 2
C 1
R 3
Sample Output
12
10
0
5
5
4
0
即 3*3的矩阵
2 3 4 | 9
3 4 5 | 12
4 5 6 | 15
9 12 15
R 2 输出12 后 sumr=2,r=1
2 3 4 | 9
0 0 0 | 0
4 5 6 | 15
6 8 10
C 3 输出10 后 suml=3,l=1
2 3 0 | 9
0 0 0 | 0
4 5 0 | 15
6 8 0
......
可发现在C 3时 时可由15-r*3-sumr得出
因为每个位置对应的值为 行数加列数
则 整列的总和 = 行的总数*列数+行数总和
则整列的值 = 原本的总和 - 消去的行的总数*列数 - 消去的行数总和
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; long long row[1000010],col[1000010]; int main() { long long n,q; while(~scanf("%lld%lld",&n,&q)){ long long sum=n+(n+1)*n/2; for(int i=1; i<=n; i++) { row[i]=col[i]=sum; sum+=n; } long long sumc,sumr,l,r,c; sumc=sumr=c=r=0; char op; for(int i=1; i<=q; i++) { scanf(" %c%lld",&op,&l); if(op=='R') { if(row[l]==0) printf("0 "); else { printf("%lld ",row[l]-sumc-l*c); sumr+=l; r++; /// 记录消去的行的 总和 和 数量 row[l]=0; /// 标记为已消去的行 } } else if(op=='C') { if(col[l]==0) printf("0 "); else { printf("%lld ",col[l]-sumr-r*l); sumc+=l; c++; /// 记录消去的列的 总和 和数量 col[l]=0; /// 标记为已消去的列 } } } } return 0; }