扫描线:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html

看图,图中的数字是横坐标离散后对应的下标,计算时左端点不变,右端点加1,所以总的更新的区间是l到r-1。

也可以理解为1代表的是(1到2这一段),2代表的是(2到3这一段),3代表的是(3到4这一段)。。。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define ls rt<<1,l,m
#define rs rt<<1|1,m+1,r
#define mem(a,b) memset(a,b,sizeof(a))const int N=1e5+5;
struct line
{int x1,x2;int h;int cover;bool operator < (const line &t){return h<t.h;}
};
vector<line>l;
vector<int>w;
struct Tree
{int l,r;int sum;int cover;
}tree[N*8];void push_up(int rt)
{if(tree[rt].cover){tree[rt].sum=w[tree[rt].r+1]-w[tree[rt].l];}else{if(tree[rt].l==tree[rt].r)tree[rt].sum=0;else tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;}
}void build(int rt,int l,int r)
{tree[rt].sum=tree[rt].cover=0;tree[rt].l=l,tree[rt].r=r;if(l==r)return ;int m=(l+r)>>1;build(ls);build(rs);
}void Update(int L,int R,int delta,int rt,int l,int r)
{if(L<=l&&r<=R){tree[rt].cover+=delta;push_up(rt);return ;}int m=(l+r)>>1;if(L<=m)Update(L,R,delta,ls);if(R>m)Update(L,R,delta,rs);push_up(rt);
}int binasrh(int val,int l,int r)
{int m;while(l<=r){m=(l+r)>>1;if(w[m]==val)return m;else if(w[m]<val)l=m+1;else r=m-1;}return -1;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);int n,x1,x2,y1,y2;cin>>n;for(int i=0;i<n;i++){cin>>x1>>y1>>x2>>y2;if(x1>x2||y1>y2){swap(x1,x2);swap(y1,y2); }x2++;y2++;l.pb(line{x1,x2,y1,1});l.pb(line{x1,x2,y2,-1});w.pb(x1);w.pb(x2);} sort(w.begin(),w.end());sort(l.begin(),l.end());w.erase(unique(w.begin(),w.end()),w.end());ll ans=0;build(1,0,w.size()-1);for(int i=0;i<l.size()-1;i++){int L=binasrh(l[i].x1,0,w.size()-1);int R=binasrh(l[i].x2,0,w.size()-1);if(L<R)Update(L,R-1,l[i].cover,1,0,w.size()-1);ans+=(ll)tree[1].sum*(l[i+1].h-l[i].h);}cout<<ans<<endl;return 0;
} 

转载于:https://www.cnblogs.com/widsom/p/7575633.html

610D - Vika and Segments(线段树+扫描线+离散化)相关推荐

  1. 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 ...

  2. 亚特兰蒂斯【线段树+扫描线+离散化】

    亚特兰蒂斯[线段树+扫描线+离散化] POJ1151.ACwing247 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包括岛屿部分地图. 但不幸的是,这些地图描述了亚特 ...

  3. 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化

    F - 郭大侠与"有何贵干?" 就是给一个三维空间,和N个长方体,问覆盖K次的体积 x和y都是1e9,但是z是[1,3],所以可以把这个分为两个二维平面,求被覆盖K次的面积,最后加 ...

  4. 线段树 + 扫描线 + 离散化:亚特兰蒂斯

    题目链接:https://www.acwing.com/problem/content/description/249/ 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包 ...

  5. POJ1151-Atlantis【线段树,扫描线,离散化】

    正题 题目链接:http://poj.org/problem?id=1151 题目大意 有n个矩形,求所以矩形的覆盖面积. 解题思路 我们用离散化一个坐标,然后每次用线段树维护这个宽度内覆盖高度和,然 ...

  6. POJ2482-Stars in Your Window【线段树,扫描线,离散化】

    正题 题目链接:http://poj.org/problem?id=2482 题目大意 有若干个点,每个点有不同的权值,求用一个h*w的矩阵扩起来的权值最大. 解题思路 先离散化一个坐标,然后另一个坐 ...

  7. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

  8. hdu 1542 Atlantis (线段树+扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...

  9. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

最新文章

  1. Samba如何配置共享资源
  2. 都是套路:盘点 Java 面试中链表的几大解题模板方法!
  3. android jar 包 意见反馈功能,android重点jar包详解.docx
  4. hdu 3671 Boonie and Clyde
  5. ASP.NET WebAPI String 传值问题
  6. css样式子绝父相,子绝父相_HTML+CSS前端基础知识教程_腾讯视频
  7. Hi3519V101 Uboot和Kernel编译
  8. JavaScript学习(七十七)—统计字符串中出现次数最多的字符和每个字符出现的次数
  9. 祝贺 Java 走过创新的 25 年
  10. 当微信遇上 10 万战绩的「跳一跳」外挂,程序员还能“逍遥”多久?
  11. ReactNative从零到完整项目-Flexbox使用
  12. 【Python 2.7】xlrd读取Excel文件
  13. 正在发生的景象--从大众消费到圈层经济
  14. python数据采集卡_高速数据采集卡在雷达信号的采集与分析中的应用笔记
  15. DM6437(DSP)图像处理常用操作源码
  16. C++primer plus第六版课后编程题答案14.3(仅供参考)
  17. 夏天宝宝晚上睡觉不踏实怎么办?
  18. 人人都是创业者:视屏和企业合并连接怎么制作
  19. java-IO流(4)-对象流及其序列化介绍
  20. 基于豆瓣哈哈哈哈哈哈小组的数据分析研究

热门文章

  1. 浏览器内核Trident/Gecko/WebKit/Presto
  2. 如何使得按确定和取消按纽转到两个不同的页面!
  3. linux平台的链接与加载
  4. Caffe源码中syncedmem文件分析
  5. 【Qt】编译QtCreator
  6. 【Qt】Qt Creator中文输入设置
  7. linux线程join的用法,join用法
  8. Java学习总结:42(字节流和字符流)
  9. Java学习总结:36(日期处理类)
  10. java中注解的使用_java中注解的使用