UVAlive 7466

题目大意是:给你一个n*n的矩阵,每一个元素等于行数加列数,要求按照R或者C的操作,对行或者列的数字进行求和,输出这个和,并且对求过的数字变为0,
在最开始的时候,想的就是模拟,然而卡在了数据大小上。。。。

这是最开始的代码(有问题ban):
看到博客上别人的思路:每一行,每一列都是一个等差数组,所以我们只用知道开头的元素以及元素个数就ok了(以后遇到这种卡壳的地方要想下自己的思路是不是太麻烦了,有什么规律可以找的吗?)

这是别人ac之后的代码....

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
const int MAXN=1e6+10;
bool x[MAXN], y[MAXN];
int N,N2;
int main()
{
    while(~scanf("%d%d",&N,&N2))
    {
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        char str; int k;
        LL sum1=0, sum2=0, cnt1=0, cnt2=0;
        for(int i=0; i<N2; i++)
        {
            scanf(" %c%d",&str,&k);
            if(str=='R')
            {
                if(x[k])
                {
                    printf("0");
                }
                else
                {
                    cnt1++;
                    sum1=sum1+k;
                    x[k]=1;
                    LL o=(LL)k*N+(LL)N*(N+1)/2-(LL)cnt2*k-sum2;
                    cout<<o<<endl;
                }
            }
            else
            {
                if(y[k]) puts("0");
                else
                {
                    cnt2++;
                    sum2=sum2+k;
                    y[k]=1;
                    LL o2=(LL)k*N+(LL)N*(N+1)/2-(LL)cnt1*k-sum1;
                    cout<<o2<<endl;
                }
            }
        }
    }
    return 0;
}
下次不能这么简单暴力不动脑去做题了(知道怎么用规律之后简直要被自己给蠢哭了.....)

原文地址:https://www.cnblogs.com/renxin123/p/8419791.html