• 蓝桥杯 奇偶覆盖 模拟


    题目描述

    在平面内有一些矩形,它们的两条边都平行于坐标轴。

    我们称一个点被某个矩形覆盖,是指这个点在矩形的内部或者边界上。

    请问,被奇数个矩形覆盖和被偶数 (≥ 2)(≥2) 个矩形覆盖的点的面积分别是多少?

    输入描述

    输入的第一行包含一个整数 nn,表示矩形的个数。

    接下来 nn 行描述这些矩形,其中第 ii 行包含四个整数 l_i,b_i, r_i, t_ili​,bi​,ri​,ti​,表示矩形的两个对角坐标分别为 (l_i, b_i),(r_i, t_i)(li​,bi​),(ri​,ti​)。

    其中,1 ≤ n ≤ 10^5, 0 ≤ l_i < r_i ≤ 10^9, 0 ≤ b_i < t_i ≤ 10^91≤n≤105,0≤li​

    输出描述

    输出两行。

    第一行包含一个整数,表示被奇数个矩形覆盖的点的面积。

    第二行包含一个整数,表示被偶数 (≥ 2)(≥2) 个矩形覆盖的点的面积。

    输入输出样例

    示例 1

    输入

    1. 3
    2. 1 1 3 3
    3. 2 2 4 4
    4. 3 3 5 5

    输出

    1. 8
    2. 2

    运行限制

    • 最大运行时间:1s
    • 最大运行内存: 128M

    精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课

    ==================================

    只通过了样例、提交检测未通过?为什么呢?

    做法:模拟

    1. import java.util.Scanner;
    2. // 1:无需package
    3. // 2: 类名必须Main, 不可修改
    4. public class Main {
    5. public static void main(String[] args) {
    6. Scanner scan = new Scanner(System.in);
    7. // 在此输入您的代码...
    8. int n = scan.nextInt();
    9. int[][] rectangles = new int[n][4];
    10. int minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE,
    11. maxX = Integer.MIN_VALUE, maxY = Integer.MIN_VALUE;
    12. for (int i = 0; i < n; i++) {
    13. rectangles[i][0] = scan.nextInt();
    14. rectangles[i][1] = scan.nextInt();
    15. rectangles[i][2] = scan.nextInt();
    16. rectangles[i][3] = scan.nextInt();
    17. int x1 = rectangles[i][0], y1 = rectangles[i][1], x2 = rectangles[i][2], y2 = rectangles[i][3];
    18. minX = Math.min(minX, x1);
    19. minY = Math.min(minY, y1);
    20. maxX = Math.max(maxX, x2);
    21. maxY = Math.max(maxY, y2);
    22. }
    23. // 注意题目说的是面积
    24. int[][] pos = new int[maxX][maxY];
    25. int cntJ = 0, cntO = 0;
    26. // 填充面积
    27. for (int i = 0; i < n; i++) {
    28. int x1 = rectangles[i][0], y1 = rectangles[i][1], x2 = rectangles[i][2], y2 = rectangles[i][3];
    29. for (int x = x1; x < x2; x++) {
    30. for (int y = y1; y < y2; y++) {
    31. pos[x][y]++;
    32. }
    33. }
    34. }
    35. // 奇偶查看
    36. for (int i = minX; i < maxX; i++) {
    37. for (int j = minY; j < maxY; j++) {
    38. if (pos[i][j] == 0) continue;
    39. if (pos[i][j] % 2 == 1) cntJ++;
    40. else if (pos[i][j] != 0) cntO++;
    41. }
    42. }
    43. System.out.println(cntJ);
    44. System.out.println(cntO);
    45. scan.close();
    46. }
    47. }

    C++代码(题解提供的)

    1. #include
    2. #define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    3. typedef long long ll;
    4. using namespace std;
    5. #define int long long
    6. const int N = 300010;
    7. vector<int>v;
    8. struct Seg{
    9. int x;
    10. int l;
    11. int r;
    12. int k;
    13. bool operator<(const Seg&w)const
    14. {
    15. if(x!=w.x)
    16. return x
    17. return k>w.k;
    18. }
    19. }seg[N<<1];
    20. struct node{
    21. int l;
    22. int r;
    23. int len1;
    24. int len2;
    25. int cnt;
    26. }tr[N<<2];
    27. int get(int x)
    28. {
    29. return lower_bound(v.begin(),v.end(),x)-v.begin();
    30. }
    31. void pushup(int u)
    32. {
    33. if(tr[u].cnt)
    34. {
    35. if(tr[u].cnt&1)
    36. {
    37. tr[u].len1=tr[u<<1].len2+tr[u<<1|1].len2;
    38. tr[u].len2=tr[u<<1].len1+tr[u<<1|1].len1;
    39. tr[u].len1+=v[tr[u].r+1]-v[tr[u].l]-tr[u].len1-tr[u].len2;
    40. }
    41. else
    42. {
    43. tr[u].len1=tr[u<<1].len1+tr[u<<1|1].len1;
    44. tr[u].len2=tr[u<<1].len2+tr[u<<1|1].len2;
    45. tr[u].len2+=v[tr[u].r+1]-v[tr[u].l]-tr[u].len1-tr[u].len2;
    46. }
    47. }
    48. else if(tr[u].l!=tr[u].r)
    49. {
    50. tr[u].len1=tr[u<<1].len1+tr[u<<1|1].len1;
    51. tr[u].len2=tr[u<<1].len2+tr[u<<1|1].len2;
    52. }
    53. else
    54. {
    55. tr[u].len1=tr[u].len2 = 0;
    56. }
    57. }
    58. void build(int u,int l,int r)
    59. {
    60. tr[u] ={l,r};
    61. if(l==r)
    62. return ;
    63. int mid=l+r>>1;
    64. build(u<<1,l,mid);
    65. build(u<<1|1,mid+1,r);
    66. }
    67. void mdf(int u,int l,int r,int k){
    68. if(tr[u].l>=l && tr[u].r<=r)
    69. {
    70. tr[u].cnt+=k;
    71. pushup(u);
    72. return ;
    73. }
    74. int mid=tr[u].l+tr[u].r>>1;
    75. if(l<=mid) mdf(u<<1,l,r,k);
    76. if(r>mid) mdf(u<<1|1,l,r,k);
    77. pushup(u);
    78. }
    79. signed main()
    80. {
    81. ios;
    82. int n;
    83. ll res1=0;
    84. ll res2=0;
    85. int cnt=0;
    86. cin >> n;
    87. for(int i=1;i<=n;i++)
    88. {
    89. int a,b,c,d;
    90. cin>>a>>b>>c>>d;
    91. v.push_back(b);
    92. v.push_back(d);
    93. seg[cnt++]={a,b,d,1};
    94. seg[cnt++]={c,b,d,-1};
    95. }
    96. sort(v.begin(),v.end());
    97. v.erase(unique(v.begin(),v.end()),v.end());
    98. build(1,0,(int)v.size()-2);
    99. sort(seg,seg+cnt);
    100. // return 0;
    101. for(int i=0;i
    102. {
    103. if(i)
    104. {
    105. res1+=1ll*(seg[i].x-seg[i-1].x)*tr[1].len1;
    106. res2+=1ll*(seg[i].x-seg[i-1].x)*tr[1].len2;
    107. }
    108. mdf(1,get(seg[i].l),get(seg[i].r)-1,seg[i].k);
    109. }
    110. cout<
    111. return 0;
    112. }

  • 相关阅读:
    Cryptocell-712安全引擎概述
    MySQL InnoDB 引擎底层解析(三)
    npm ERR! exited with error code: 128
    【文件系统】如何在ubi之上运行squashfs
    C语言学习/复习32--位段内存分配/枚举与联合体在内存中的特点
    linux第四课:改变文件的权限和属性(内含:1.修改权限命令chmod+2.临时切换用户用 sudo+3.chowm:改变文件所有者)
    ZooKeeper的Linux端安装步骤(内含Java的Linux端安装)
    在进行自动化测试,遇到验证码的问题,怎么办?
    如何撰写一份优秀的活动策划与执行方案?这些步骤和技巧请收好
    测试/开发程序员的思考,突破变得更强......
  • 原文地址:https://blog.csdn.net/weixin_45322373/article/details/127705933