题目
北京城四四方方,你可以将其看作一个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;
}