SPOJ AMR12J Escape from the Mines 解题报告
来源:互联网 发布:单反拍淘宝 编辑:程序博客网 时间:2024/05/20 09:09
题目
Summer Training 06 - Amritapuri 2012 总结
题意:
有很多个房间,之间没有交叉和重叠。求每个房间外面是空地还是别的房间。
题解:
扫描线,将横坐标离散,线段树表示当前横坐标范围内哪些纵坐标是哪些房间。插入新房间时查一下这一段内是哪个房间或空地(因为没有交叉所以查一个点就行),到房间的右边界就把原来查询得到的房间编号覆盖回去。
//Time:1510ms//Memory:21504KB//Length:2303B#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;#define MAXN 200005#define MAXM 400010#define MP(x,y) make_pair(x,y)#define FI first#define SE secondint tree[MAXN<<2],lazy[MAXN<<2];void down(int p,int la){ if (la!=-1) { lazy[p<<1]=la; lazy[p<<1|1]=la; tree[p<<1]=la; tree[p<<1|1]=la; lazy[p]=-1; }}void insert(int p,int L,int R,int l,int r,int w){ if (l==L&&r==R) { tree[p]=w; lazy[p]=w; return; } down(p,lazy[p]); int mid=(L+R)>>1; if (r<=mid) insert(p<<1,L,mid,l,r,w); else if (l>mid) insert(p<<1|1,mid+1,R,l,r,w); else { insert(p<<1,L,mid,l,mid,w); insert(p<<1|1,mid+1,R,mid+1,r,w); } tree[p]=-1;}int cal(int p,int L,int R,int k){ if (tree[p]!=-1) return tree[p]; down(p,lazy[p]); int mid=(L+R)>>1; if (k<=mid) return cal(p<<1,L,mid,k); else return cal(p<<1|1,mid+1,R,k);}pair<int,int> pa[MAXM],x[MAXM],y[MAXM];int lis[MAXM],ans[MAXN];int bs(int key,int r){ int l=0,mid; while(l<r) { mid=(l+r)/2; if(lis[mid]<key) l=mid+1; else r=mid; } return l;}int main(){ //freopen("/home/moor/Code/input","r",stdin); int top,ltop,n; while (scanf("%d",&n)==1) { top=ltop=0; memset(tree,0,sizeof(tree)); memset(lazy,-1,sizeof(lazy)); for(int i=1;i<=n;++i) { scanf("%d%d%d%d",&x[i].FI,&y[i].FI,&x[i].SE,&y[i].SE); pa[top++]=MP(x[i].FI,i); pa[top++]=MP(x[i].SE,-i); lis[ltop++]=y[i].FI; lis[ltop++]=y[i].SE; } sort(lis,lis+ltop); sort(pa,pa+top); ltop=unique(lis,lis+ltop)-lis; for(int i=0;i<top;++i) if(pa[i].SE>0) { int a=bs(y[pa[i].SE].FI,ltop)+1,b=bs(y[pa[i].SE].SE,ltop)+1; ans[pa[i].SE]=cal(1,1,ltop,a); insert(1,1,ltop,a,b,pa[i].SE); } else { int a=bs(y[-pa[i].SE].FI,ltop)+1,b=bs(y[-pa[i].SE].SE,ltop)+1; insert(1,1,ltop,a,b,ans[-pa[i].SE]); } for(int i=1;i<=n;++i) printf("%d\n",ans[i]-1); } return 0;}
- SPOJ AMR12J Escape from the Mines 解题报告
- SPOJ AMR12A The Black Riders 解题报告
- SPOJ AMR12J 题解
- 解题报告:HDU_1813 Escape from Tetris 综合搜索IDA*
- SPOJ AMR12K The Loyalty of the Orcs 解题报告
- 解题报告:SPOJ
- SPOJ AMR12G The Glittering Caves of Aglarond 解题报告
- SPOJ AMR12B Gandalf vs the Balrog 解题报告
- SPOJ AMR12D The Mirror of Galadriel 解题报告
- ZOJ 3431 Escape! 解题报告
- Spoj数论专场解题报告
- SPOJ AMR12C Entmoot 解题报告
- Aizu 1315 Gift from the Goddess of Programming 解题报告
- SPOJ AMR12E Dyslexic Gollum 解题报告
- SPOJ AMR12H Wormtongues Mind 解题报告
- SPOJ 694 后缀数组 解题报告
- Escape from the Hell(暴力瞎搞)
- 【解题报告】 ZOJ 3640 Help Me Escape - 期望dp
- struts1和struts2 action中获得参数方法粗解
- 动态定义数组
- IOS开发之路三(XML解析之GDataXML的使用)
- hdu2489 Minimal Ratio Tree dfs+最小生成树
- Introduction to Algorithms Chapter 12: Binary Search Tree
- SPOJ AMR12J Escape from the Mines 解题报告
- Maya: 菜单 编辑曲线 > 曲线圆角
- Openfire 性能优化【转载内容】
- c++ 中使用ChartDirector输出图表的网页
- Maya: 菜单 编辑曲线 > 插入结
- Codeforces 315C
- Maya: 菜单 编辑曲线 > 延伸 >延伸曲线
- ubuntu/centos printk 终端中不能打印信息及解决办法
- spring 中JdbcTemplate的使用