题目:
思路:
不考虑数据范围的情况下,考虑先计算出没有被攻击到的格子,数量=未被被标记的x*未被被标记的y
可以搞个bool数组来记录x是否被标记过
对应代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=111111111;
int n,k;
bool visitedx[maxn],visitedy[maxn];
int main()
{
cin>>n>>k;
int tempx=n,tempy=n;
for(int i=1;i<=k;i++)
{
int x,y;
cin>>x>>y;
if(!visitedx[x])
{
visitedx[x]=1;
tempx--;
}
if(!visitedy[y])
{
visitedy[y]=1;
tempy--;
}
}
long long ans=(long long)n*n-(long long)tempx*tempy;
cout<<ans<<endl;
return 0;
}
然后考虑如何区优化
虽然1<n<10^9,
但是1<k<10^6,是个比较合适做数组的大小。
因此我们可以考虑把输进来的x,y都存起来,排序后计算有多少x,y是被标记过的
ans=n*n-(n-cntx)*(n-cnty)
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1111111;
long long n,k;
int x[maxn],y[maxn];
int main()
{
cin>>n>>k;
for(int i=1;i<=k;i++) cin>>x[i]>>y[i];
sort(x+1,x+k+1);
sort(y+1,y+k+1);
long long cntx=1,cnty=1;
/*for(int i=1;i<=k;i++) cout<<x[i]<<" ";
cout<<endl;
for(int i=1;i<=k;i++) cout<<y[i]<<" ";
cout<<endl;*/
for(int i=2;i<=k;i++)
{
if(x[i]!=x[i-1]) cntx++;
if(y[i]!=y[i-1]) cnty++;
}
//cout<<"cntx="<<cntx<<" "<<"cnty="<<cnty<<endl;
long long ans=n*n-(n-cntx)*(n-cnty);
cout<<ans<<endl;
return 0;
}