zoukankan      html  css  js  c++  java
  • 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));

     }

  • 相关阅读:
    Regexp
    Qt Customize QVariant
    Paradox
    Write File
    Division of Line Segment
    How to Get Vertical Line from Point and Line
    IOPS-百度百科
    磁盘的读写-想起了SGA PGA DBWR LGWR...
    记一次备份发起时间延后问题
    V$RMAN_BACKUP_JOB_DETAILS
  • 原文地址:https://www.cnblogs.com/tcwbob/p/12846827.html
Copyright © 2011-2022 走看看