• P3913 车的攻击


    题目描述

    N imes 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));

     }

  • 相关阅读:
    让iis支持中文文件名(转)
    为你的mail server增加SPF记录
    sql清除事务日志命令
    收集的ASP.NET中常用正则表达式
    在线支付类封装
    提供一个操作Windows服务类库(基本函数)
    简单测试Newtonsoft.json JObject内存占用分配
    图片和文字同行 对齐方式
    常用的css(持续跟新中....)
    Effective Ways to Develop Web Part
  • 原文地址:https://www.cnblogs.com/tcwbob/p/12846827.html
Copyright © 2020-2023  润新知