码迷,mamicode.com
首页 > 其他好文 > 详细

P3913 车的攻击

时间:2020-05-08 00:25:03      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:mat   输出   put   ber   for   marked   国际象棋   keyword   str   

题目描述

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?,Ci?N。

本次小编为大家带来洛谷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));

 }

P3913 车的攻击

标签:mat   输出   put   ber   for   marked   国际象棋   keyword   str   

原文地址:https://www.cnblogs.com/tcwbob/p/12846827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!