Atlantis hdu 1542 线段树 扫面线 区间合并
来源:互联网 发布:黑马程序员基础测试题 编辑:程序博客网 时间:2024/06/08 09:55
扫描线第一题,第一次交上去居然PE了,好吧,有傻逼了,少加个了个回车.
注意点:
1. 区间分段的时候要分成 [l,mid] 和[mid,r]不是平常一样的[l,mid]和[mid+1,r](因为我们要算的一段线段的长度,也就是说得连续,比如我们要算这一段[1,10],应该把他分成[1,5][5,10],不能[1,5][6,10]);
2.由于上面的mid和平时的线段树不同,所以判断退出的时候是(l+1==r)才退出,因为我们表示的是一段线段,每个值是一个点,如果l等于r的话,就是一个点了,也没意义了.
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>#include <map>#define lc idx<<1#define rc idx<<1|1#define mid ((l+r)>>1)#define lson lc,l,mid#define rson rc,mid,r#define whole idx,l,rusing namespace std;const int MAXN=100000+10;int k;class Line{ public: double x,yu,yd; int type; Line(){} Line(double a,double b,double c,int d) :x(a),yu(b),yd(c),type(d) {} bool operator <(const Line &a) const { return x<a.x; }};vector<Line> line;vector<double> cor_y;map<double,int> pj;class SGtree{ public: double len[MAXN<<2]; int cnt[MAXN<<2]; void build(int idx,int l,int r) { len[idx]=cnt[idx]=0; if(l+1==r) return ; build(lson); build(rson); } void maintain(int idx,int l,int r) { if(cnt[idx]>0) len[idx]=cor_y[r]-cor_y[l]; else { if(l+1==r) len[idx]=0; else len[idx]=len[lc]+len[rc]; } } void update(int idx,int l,int r,int x,int y,int v) { if(x<=l && r<=y) cnt[idx]+=v; else { if(x<mid) update(lson,x,y,v); if(y>mid) update(rson,x,y,v); } maintain(whole); }};SGtree tree;int main(){// freopen("in","r",stdin); int n,kcase=1; while(~scanf("%d",&n) && n) { line.clear(); cor_y.clear(); pj.clear(); double a,b,c,d; for(int i =0; i<n; i++) { scanf("%lf %lf %lf %lf",&a,&b,&c,&d); line.push_back(Line(a,d,b,1)); line.push_back(Line(c,d,b,-1)); cor_y.push_back(b); cor_y.push_back(d); } cor_y.push_back(-100000000); sort(line.begin(),line.end()); sort(cor_y.begin(),cor_y.end()); k=1; for(int i=1; i<cor_y.size(); i++) { if(cor_y[i]!=cor_y[i-1]) { pj[cor_y[i]]=k; cor_y[k++]=cor_y[i]; } } double ans=0; tree.build(1,1,k-1); tree.update(1,1,k-1,pj[line[0].yd],pj[line[0].yu],line[0].type); for(int i=1; i<line.size(); i++) { ans+=(line[i].x-line[i-1].x)*(tree.len[1]); tree.update(1,1,k-1,pj[line[i].yd],pj[line[i].yu],line[i].type); } printf("Test case #%d\n",kcase++); printf("Total explored area: %.2f\n\n",ans) ; } return 0;}
0 0
- Atlantis hdu 1542 线段树 扫面线 区间合并
- hdu-1542-Atlantis 线段树
- hdu 1542 Atlantis(线段树)
- |Hdu 1542|线段树|Atlantis
- hdu 1542 Atlantis 二维线段树
- hdu 1542 Atlantis 线段树扫描线
- HDU 1542 Atlantis(线段树:扫描线)
- HDU - 1542 Atlantis (线段树)
- 【HDU】1542 Atlantis 线段树+扫描线
- HDU 1542 Atlantis(线段树扫描线)
- hdu 1542 Atlantis(线段树+扫描线)
- hdu 1542 Atlantis 线段树 + 扫描线
- HDU 1542 Atlantis 线段树+扫描线
- HDU - 1542 Atlantis(线段树 扫描线)
- HDU 1542 Atlantis(线段树矩形覆盖)
- HDU 1542 Atlantis 【线段树+扫描线】
- HDU 1542 Atlantis 线段树+扫描线
- hdu 3397(线段树区间合并)
- 设置TextView中的部分位置可以点击,颜色不同
- jquery学习笔记2(W3School学习)
- getPhysicalNumberOfCells 与 getLastCellNum的差异
- hdu 1029 Ignatius and the Princess IV 快排
- Java 程序员们最常犯的10个错误
- Atlantis hdu 1542 线段树 扫面线 区间合并
- jquery使用attr访问自定义属性
- HDU--4784 Dinner Coming Soon DP+BFS
- hibernate连接本机数据源的简便写法:
- 关于embedded linux的使用、开发、学习的一点自已的体会
- Linux代码风格整理
- Objective-C declared @property attributes (nonatomic, copy, strong, weak)
- 【Jena使用手册】用Python访问Apache Jena数据库 利用Fuseki搭建HTTP访问服务器
- 单片机,简单吗?