P3913 车的攻击

题目描述

N \times NN×N 的国际象棋棋盘上有KK 个车,第ii个车位于第R_iRi行,第C_iCi 列。求至少被一个车攻击的格子数量。

车可以攻击所有同一行或者同一列的地方。

输入格式

第1 行,2 个整数N,KN,K。

接下来K 行,每行2 个整数R_i,C_iRi,Ci

输出格式

1 个整数,表示被攻击的格子数量。

输入输出样例

输入 #1
3 2
1 2
2 2
输出 #1
7

说明/提示

• 对于30% 的数据,1 \le N \le 10^3; 1 \le K \le 10^31N103;1K103;

• 对于60% 的数据,1 \le N \le 10^6; 1 \le K \le 10^61N106;1K106;

• 对于100% 的数据,1 \le N \le 10^9; 1 \le K \le 10^6; 1 \le R_i , C_i \le N1N109;1K106;1Ri,CiN。

解题思路

本次小编为大家带来洛谷P3913车的攻击 题解。

这题看这十分麻烦,一开始小编也绕晕了,用二维数组遍历枚举,后来因方法太笨(其实也有TIE的原因)放弃了,看到了一位大佬的思路才有了思路。

这题分为三步:

      {

        1.运用sort的排序将所有的车集合再左上角。

        2.通过车载左上角后,统计出行不重复的数量s;及列不重复的数量s1.

        3.利用得出的公式n*n-(n-s)*(n-s1)。算出被攻击的格子数量

      }

举个大佬举过的例子:假设车的坐标在1,2与3,4.

          一三,二四行的格子就被攻击了。

          把被攻击的放在左上角。

          没被攻击的就为(n-2)*(n-2)。

          再求出没被求出的格子个数。

感谢那位大佬的思路提供,小编一定会成为你那样的大佬。

上代码!

#include<iostream>

#include<cstdio>

#include<algorithm>

using namespace std;

long long n,k,a[1000002]={0},b[1000002]={0},i,s=0,s1=0;

int main()

{

  scanf("%lld %lld",&n,&k);

  for(i=1;i<=k;i++)

   {

     scanf("%lld %lld",&a[i],&b[i]);

   }

  sort(a+1,a+k+1);

  sort(b+1,b+k+1);

   for(i=1;i<=k;i++)

   {

     if(a[i]!=a[i+1])

    {

      s++;

     }

    if(b[i]!=b[i+1])

     {

       s1++;

     }

  }

  printf("%lld",n*n-(n-s)*(n-s1));

 }

posted on 2020-05-08 00:09  田宸玮  阅读(368)  评论(0编辑  收藏  举报

导航