610D - Vika and Segments(线段树+扫描线+离散化)
扫描线: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(线段树+扫描线+离散化)相关推荐
- 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 ...
- 亚特兰蒂斯【线段树+扫描线+离散化】
亚特兰蒂斯[线段树+扫描线+离散化] POJ1151.ACwing247 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包括岛屿部分地图. 但不幸的是,这些地图描述了亚特 ...
- 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化
F - 郭大侠与"有何贵干?" 就是给一个三维空间,和N个长方体,问覆盖K次的体积 x和y都是1e9,但是z是[1,3],所以可以把这个分为两个二维平面,求被覆盖K次的面积,最后加 ...
- 线段树 + 扫描线 + 离散化:亚特兰蒂斯
题目链接:https://www.acwing.com/problem/content/description/249/ 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包 ...
- POJ1151-Atlantis【线段树,扫描线,离散化】
正题 题目链接:http://poj.org/problem?id=1151 题目大意 有n个矩形,求所以矩形的覆盖面积. 解题思路 我们用离散化一个坐标,然后每次用线段树维护这个宽度内覆盖高度和,然 ...
- POJ2482-Stars in Your Window【线段树,扫描线,离散化】
正题 题目链接:http://poj.org/problem?id=2482 题目大意 有若干个点,每个点有不同的权值,求用一个h*w的矩阵扩起来的权值最大. 解题思路 先离散化一个坐标,然后另一个坐 ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- hdu 1542 Atlantis (线段树+扫描线)
http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...
- HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...
最新文章
- Samba如何配置共享资源
- 都是套路:盘点 Java 面试中链表的几大解题模板方法!
- android jar 包 意见反馈功能,android重点jar包详解.docx
- hdu 3671 Boonie and Clyde
- ASP.NET WebAPI String 传值问题
- css样式子绝父相,子绝父相_HTML+CSS前端基础知识教程_腾讯视频
- Hi3519V101 Uboot和Kernel编译
- JavaScript学习(七十七)—统计字符串中出现次数最多的字符和每个字符出现的次数
- 祝贺 Java 走过创新的 25 年
- 当微信遇上 10 万战绩的「跳一跳」外挂,程序员还能“逍遥”多久?
- ReactNative从零到完整项目-Flexbox使用
- 【Python 2.7】xlrd读取Excel文件
- 正在发生的景象--从大众消费到圈层经济
- python数据采集卡_高速数据采集卡在雷达信号的采集与分析中的应用笔记
- DM6437(DSP)图像处理常用操作源码
- C++primer plus第六版课后编程题答案14.3(仅供参考)
- 夏天宝宝晚上睡觉不踏实怎么办?
- 人人都是创业者:视屏和企业合并连接怎么制作
- java-IO流(4)-对象流及其序列化介绍
- 基于豆瓣哈哈哈哈哈哈小组的数据分析研究