2017-09-24 20:11:21

writer:pprp

找到的大神的代码,直接过了

采用了扫描线+线段树的算法,先码了,作为模板也不错啊

题目链接:https://nanti.jisuanke.com/t/17313

题意:给你很多个矩形,让你得到矩形的面积,重叠部分只算一次

代码如下:

  1. //ac F
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <iostream>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9. typedef long long ll;
  10. const int maxn=1e6+;
  11.  
  12. #define mm(a) memset(a,0,sizeof(a))
  13.  
  14. int num1[maxn*];
  15. int num[maxn*],X[maxn*];
  16. struct edge
  17. {
  18. int l,r,h;
  19. int s;//s为1是下边,s为-1是上边
  20. edge() {};
  21. edge(int a,int b,int c,int d) : l(a),r(b),h(c),s(d) {}
  22. bool operator<(const edge &n)const
  23. {
  24. return h<n.h;
  25. }
  26. } ss[maxn];
  27.  
  28. void pushup(int le,int ri,int node)
  29. {
  30. if(num1[node])
  31. num[node]=X[ri+]-X[le];//在更新的时候,可能两个矩阵有重叠,这样就不能像以前那么更新,而是将le和ri传入
  32. else if(le==ri)
  33. num[node]=; //然后将X[ri+1]-X[le]的值进行更新,避免了重复的长度
  34. else
  35. num[node]=num[node<<]+num[node<<|];
  36. }
  37. void update(int l,int r,int add,int le,int ri,int node)
  38. {
  39. if(l<=le&&ri<=r)
  40. {
  41. num1[node]+=add;//与懒惰标记类似
  42. pushup(le,ri,node);
  43. return ;
  44. }
  45. int t=(le+ri)>>;
  46. if(l<=t) update(l,r,add,le,t,node<<);
  47. if(r>t) update(l,r,add,t+,ri,node<<|);
  48. pushup(le,ri,node);
  49. }
  50. int main()
  51. {
  52. int n;
  53. while(scanf("%d",&n) != EOF)
  54. {
  55. if(n == )
  56. {
  57. cout << "*" << endl;
  58. break;
  59. }
  60. int a,b,c,d;
  61. int k=;
  62. for(int i=; i<n; i++)
  63. {
  64. scanf("%d%d%d%d",&a,&b,&c,&d);
  65. X[k]=a;
  66. ss[k++]=edge(a,c,b,);
  67. X[k]=c;
  68. ss[k++]=edge(a,c,d,-);
  69. }
  70. sort(X,X+k);
  71. sort(ss,ss+k);
  72. int k1=;
  73. for(int i=; i<k; i++) //对X进行离散化
  74. {
  75. if(X[i]!=X[i-]) X[k1++]=X[i];
  76. }
  77. mm(num);
  78. mm(num1);
  79. int ans=;
  80. for(int i=; i<k-; i++)
  81. {
  82. int l=lower_bound(X,X+k1,ss[i].l)-X;
  83. int r=lower_bound(X,X+k1,ss[i].r)-X-;
  84. update(l,r,ss[i].s,,k1-,);
  85. ans+=num[]*(ss[i+].h-ss[i].h);//num[1]为当前横坐标的总长度
  86. }
  87. cout << ans << endl;
  88. }
  89. return ;
  90. }

2017 ACM/ICPC 南宁区 网络赛 Overlapping Rectangles的更多相关文章

  1. 【2017 ACM/ICPC 乌鲁木齐赛区网络赛环境测试赛 E】蒜头君的排序

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] 莫队算法+树状数组. 区间增加1或减少1. 对逆序对的影响是固定的. (用冒泡排序变成升序的交换次数,就是逆序对的个数) [错的次数] 0 [ ...

  2. 2017ICPC南宁赛区网络赛 Overlapping Rectangles(重叠矩阵面积和=离散化模板)

    There are nnn rectangles on the plane. The problem is to find the area of the union of these rectang ...

  3. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 M. Frequent Subsets Problem【状态压缩】

    2017 ACM-ICPC 亚洲区(南宁赛区)网络赛  M. Frequent Subsets Problem 题意:给定N和α还有M个U={1,2,3,...N}的子集,求子集X个数,X满足:X是U ...

  4. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Overlapping Rectangles

    There are nn rectangles on the plane. The problem is to find the area of the union of these rectangl ...

  5. 2014 ACM/ICPC 鞍山赛区网络赛(清华命题)

    为迎接10月17号清华命题的鞍山现场赛 杭电上的题目 Biconnected(hdu4997)     状态压缩DP Rotate(hdu4998)    相对任一点的旋转 Overt(hdu4999 ...

  6. 2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest

    2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest A - Arranging Wine 题目描述:有\(R\)个红箱和\(W\)个白箱,将这 ...

  7. 2017 ACM/ICPC Asia Regional Shenyang Online spfa+最长路

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  8. 2017 ACM ICPC Asia Regional - Daejeon

    2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...

  9. 2017 ACM/ICPC Shenyang Online SPFA+无向图最长路

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

随机推荐

  1. 剑指Offer——二叉搜索树的后序遍历序列

    题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉查找树(Binary Search ...

  2. What’s wrong with virtual methods called through an interface

    May 31, 2016 Calling a virtual method through an interface always was a lot slower than calling a st ...

  3. java基础07 循环结构

    public class While02 { public static void main(String[] args) { /** * while(循环条件){ * 循环体(循环操作) * } * ...

  4. python常见模块之random模块

    import random print(random.random()) #随机产生一个0-1之间的小数 print(random.randint(1,3)) #随机产生一个1-3之间的整数,包括1和 ...

  5. ftp 服务器搭建

    一.安装 yum -y install vsftpd //通过yum来安装vsftpd chkconfig vsftpd on //设置为开机启动 vi /etc/vsftpd/vsftpd.conf ...

  6. python web框架 django 工程 创建 目录介绍

    # 创建Django工程django-admin startproject [工程名称] 默认创建django 项目都会自带这些东西 django setting 配置文件 django可以配置缓存 ...

  7. 宏表达式与函数、#undef、条件编译、

    宏表达式在预编译期被处理,编译器不知道宏表达式的存在. 宏表达式没有任何的调用开销 宏表达式中不能出现递归定义. C语言中强大的内置宏 __FILE__:被编译的文件名 //双底线 __LINE__: ...

  8. 闪回事务(Flashback Transaction)

    到目前为止,介绍的所有功能均不会直接将数据恢复为“以前”的样子.闪回查询只是查看,闪回数据归档只是延伸了闪回查询的时间窗口,闪回事务查询虽然提供了撤销SQL,但是否执行及如何执行还需要管理员进一步手动 ...

  9. web Servlet 3.0 新特性之web模块化编程,web-fragment.xml编写及打jar包

    web Servlet 3.0 模块化 原本一个web应用的任何配置都需要在web.xml中进行,因此会使得web.xml变得很混乱,而且灵活性差,因此Servlet 3.0可以将每个Servlet. ...

  10. C++基础之头文件和源文件的关系

    今天找了个解析xml的开源C++项目tinyxml,按照网上的说法去编译,但是一直编译不通过,"无法打开头文件tinyxml.h",但是明明我在工程底下有了这个文件,对于我这种初学 ...