闷声发大财

题目
北京城四四方方,你可以将其看作一个n*n​的网格。2000年10月的一天,这座古都的平静突然被打破。

不知为什么,很多香港的记者在这一天陆续到来,她们会分别选择一个格子作为 自己的基地,然后持续观察她们所在行或所在列是否有你的身影出现。也就是说,如 果有一名记者选择了(x,y) ​ 作为基地,那么第 ​y 列的每一个格子与第 ​ x 行的每一个格子都会被这名记者看到(自然也包括 ​ (x,y)本身)。一旦看到你,她们便会立即对你提出无休止的问题。

你坚信你就什么话也不讲,就是最好的。所以你要找一个不被任何记者看到的地方作为藏身之所。你想知道每来到一个记者后,还有多少个地方可以作为你的藏身之所。

输入

在这里插入图片描述

输出
输出 ​ m 个整数,第 ​ i 个整数代表前 ​ i 名记者到达后仍可以选作藏身之所的格子的个数。

样例

3 3
1 1
3 1
2 2

4 2 0

反思

这个题难度不大,代码实现起来也不难,不过要主要开 ll 不然会 wa

AC代码

#include<cstdio>
#include<iostream>
#define Max 100009
using namespace std;
typedef long long ll;
ll x[Max];
ll y[Max];
ll  n, m;
ll  a, b;
ll  cnt1;
ll cnt2;
ll da[Max];
int main()
{
    
    
    cin >> n >> m;
    ll ans = n*n;

    //printf("ans = %d\n",ans);

    for(ll  i = 0; i < m ; i++)
    {
    
    
        scanf("%lld %lld",&a, &b);
        if(!x[a] && !y[b] ){
    
    
                //printf("cnt1 = %d cnt2 = %d\n",cnt1,cnt2);
            ans -=   (2*n-1 - cnt1 - cnt2);
            x[a] = 1;y[b] = 1;
            cnt1++;
            cnt2++;
        }
        else if(!x[a] && y[b]){
    
    
            //printf("cnt1 = %d cnt2 = %d\n",cnt1,cnt2);
            ans = ans -  (n - cnt2 );
            cnt1++;
            x[a] = 1;

        }
        else if(x[a] && !y[b]){
    
    
                //printf("cnt1 = %d cnt2 = %d\n",cnt1,cnt2);
            ans = ans -  (n - cnt1);
            cnt2++;
            y[b] = 1;
        }
        else if(x[a] && y[b]);

    da[i] = ans;
    }
    for(ll i = 0; i < m; i++)
    {
    
    
        printf("%lld",da[i]);
        if(i!=m-1) printf(" ");
    }
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/cosx_/article/details/109747914