NEERC 2015 Adjustment Office /// oj25993

题目大意:

输入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;
}
View Code
原文地址:https://www.cnblogs.com/zquzjx/p/8876418.html