可以转变成上一题(hdu1542)的形式,把每条线段变成宽为1的矩形,求矩形面积并

要注意的就是转化为右下角的点需要x+1,y-1,画一条线就能看出来了

  1. #include<bits/stdc++.h>
  2. #define pi acos(-1.0)
  3. #define ll long long
  4. #define mod 1000000007
  5. #define ls l,m,rt<<1
  6. #define rs m+1,r,rt<<1|1
  7. #pragma comment(linker, "/STACK:1024000000,1024000000")
  8.  
  9. using namespace std;
  10.  
  11. const double g=10.0,eps=1e-;
  12. const int N=+,maxn=+,inf=0x3f3f3f;
  13.  
  14. int mark[N<<];//某区间下底边个数
  15. ll sum[N<<];//某区间下底边总长度
  16. ll Hash[N];//离散化数组
  17. //把横坐标作为线段进行扫描
  18. //扫描是为了更新下底边个数和下底边总长度,记录答案
  19. struct tree{
  20. ll l,r,h;//l,r左右端点,h从x轴到该边的高
  21. int d;//-1上底边/1下底边
  22. tree(){}
  23. tree(ll x,ll y,ll z,int a):l(x),r(y),h(z),d(a){}
  24. bool operator <(const tree &a)const
  25. {
  26. return h<a.h;
  27. }
  28. }s[N];
  29. void pushup(int l,int r,int rt)
  30. {
  31. if(mark[rt])sum[rt]=Hash[r+]-Hash[l];
  32. else if(l==r)sum[rt]=;
  33. else sum[rt]=sum[rt<<]+sum[rt<<|];
  34. }
  35. void update(int L,int R,int d,int l,int r,int rt)
  36. {
  37. if(L<=l&&r<=R)
  38. {
  39. mark[rt]+=d;//如果是上底边mark-1,下底边mark+1
  40. pushup(l,r,rt);
  41. return ;
  42. }
  43. int m=(l+r)>>;
  44. if(L<=m)update(L,R,d,ls);
  45. if(R>m)update(L,R,d,rs);
  46. pushup(l,r,rt);
  47. }
  48. int Search(ll key,int n)
  49. {
  50. int l=,r=n-;
  51. while(l<=r)
  52. {
  53. int m=(l+r)/;
  54. if(Hash[m]==key)return m;
  55. if(Hash[m]>key)r=m-;
  56. else l=m+;
  57. }
  58. return -;
  59. }
  60. int main()
  61. {
  62. ios::sync_with_stdio(false);
  63. cin.tie();
  64. cout<<setiosflags(ios::fixed)<<setprecision();
  65. int n;
  66. cin>>n;
  67. int k=;
  68. for(int i=; i<n; i++)
  69. {
  70. ll x1,x2,y1,y2;
  71. cin>>x1>>y1>>x2>>y2;
  72. if(x1==x2)
  73. {
  74. if(y1<y2)swap(y1,y2);
  75. x2++;
  76. y2--;
  77. }
  78. else
  79. {
  80. if(x1>x2)swap(x1,x2);
  81. x2++;
  82. y2--;
  83. }
  84. Hash[k]=x1;
  85. s[k++]= {x1,x2,y1,}; //上底边
  86. Hash[k]=x2;
  87. s[k++]= {x1,x2,y2,-}; //下底边
  88. }
  89. sort(Hash,Hash+k);
  90. sort(s,s+k);
  91. int m=;
  92. for(int i=; i<k; i++) //离散化
  93. if(Hash[i]!=Hash[i-])
  94. Hash[m++]=Hash[i];
  95. ll ans=;
  96. memset(sum,,sizeof sum);
  97. memset(mark,,sizeof mark);
  98. for(int i=; i<k; i++) //如果两个下底边重合,但是上底边可能不一样,必须更新mark,而sum不会改变
  99. {
  100. int l=Search(s[i].l,m);//利用hash表查找
  101. int r=Search(s[i].r,m)-;//这里的l,r实际上是Hash表的标号
  102. update(l,r,s[i].d,,m-,);//维护mark和sum的值
  103. ans+=sum[]*(s[i+].h-s[i].h);//sum[1]当前的下底边长度总和
  104. }
  105. cout<<ans<<endl;
  106. return ;
  107. }
  108. /*********************
  109.  
  110. *********************/

Codeforces 610D Vika and Segments 线段树+离散化+扫描线的更多相关文章

  1. hdu1542 矩形面积并(线段树+离散化+扫描线)

    题意: 给你n个矩形,输入每个矩形的左上角坐标和右下角坐标. 然后求矩形的总面积.(矩形可能相交). 题解: 前言: 先说说做这道题的感受: 刚看到这道题顿时就懵逼了,几何 烂的渣渣.后来从网上搜题解 ...

  2. 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

    [POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  3. Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)

    题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...

  4. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线

    D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...

  5. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树 矩阵面积并

    D. Vika and Segments     Vika has an infinite sheet of squared paper. Initially all squares are whit ...

  6. Codeforces 1108E (Array and Segments) 线段树

    题意:给你一个长度为n的序列和m组区间操作,每组区间操作可以把区间[l, r]中的数字都-1,请选择一些操作(可以都不选),使得序列的最大值和最小值的差值尽量的大. 思路:容易发现如果最大值和最小值都 ...

  7. POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]

    Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21734   Accepted: 8179 Descrip ...

  8. POJ 1151Atlantis 矩形面积并[线段树 离散化 扫描线]

    Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21734   Accepted: 8179 Descrip ...

  9. hdu1542线段树+离散化+扫描线

    参考博客: http://blog.csdn.net/xingyeyongheng/article/details/8927732 总的来说就是用一条(假想的)线段去平行x轴从下往上扫描,扫描的过程中 ...

随机推荐

  1. Python线程包装器

    import threading import subprocess import time def need_thread(func, *args, **kwargs): def fun(): pr ...

  2. Can’t connect to local MySQL server through socket 解决办法

    启动mysql 报错: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/m ...

  3. 20170413 F110学习

                  F110 学习: Tcode: F110  自动付款业务, FBZP   维护收付程序设置 FBL1N   供应商行项目 XK03   显示供应商(银行信息维护) F110 ...

  4. (扫盲)DTO数据传输对象

    DTO即数据传输对象.但从定义上看就是简单的用来传递数据的.主要用途是在框架中定义DTO来绑定表现层中的数据.学过MVC.EF实体模型的都应该知道,我们可以定义一个Model实体来实现前后台数据的交互 ...

  5. 【AWS】订阅AWS论坛的RSS消息获取最新公告

    背景:AWS在遇到系统升级.系统故障等问题的时候,会在其官方论坛发布通知,并同步到RSS 前言:我们在项目中遇到几次AWS的RDS出现故障导致系统受影响,当系统故障时,我们的监控系统会发送一堆告警出来 ...

  6. LeetCode:二叉树的层次遍历||【107】

    LeetCode:二叉树的层次遍历||[107] 题目描述 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如:给定二叉树 [3,9,2 ...

  7. LeetCode:对角线遍历【498】

    LeetCode:对角线遍历[498] 题目描述 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ ...

  8. 防止基本的XSS攻击 滤掉HTML标签

    /** * 防止基本的XSS攻击 滤掉HTML标签 * 将HTML的特殊字符转换为了HTML实体 htmlentities * 将#和%转换为他们对应的实体符号 * 加上了$length参数来限制提交 ...

  9. Mac 环境 下使用Charles 抓包Http/Https请求

    实现目标 在Mac 上 对 iOS  真机 和 模拟器 进行 Http/Https抓包 使用工具 Mac 上 Charles 4.2  安装 参考链接 1. 和 链接 2. 抓包 http 请求 (1 ...

  10. Linux下32位与64位数据类型大小

    Redhat Enterprise Linux 32 Redhat Enterprise Linux 64