线段树扫描线模板
来源:互联网 发布:阿里云售后自助服务 编辑:程序博客网 时间:2024/06/06 02:40
#include <cstdio>//hdu1542 求平面矩形面积交#include <algorithm>#include <vector>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int N=1222;using namespace std;int n,cnt;struct node{ double l,r,h; int f; node(double _l=0,double _r=0,double _h=0,int _f=0):l(_l),r(_r),h(_h),f(_f){};}a[N];bool cmp(node a,node b){return a.h<b.h;}double sum[N<<2];int flag[N<<2];vector<double> vt;int Getid(double x) {return lower_bound(vt.begin(),vt.end(),x)-vt.begin()+1;}void Pushup(int l,int r,int rt){ if(flag[rt]) sum[rt]=vt[r]-vt[l-1]; else if(l==r) sum[rt]=0; else sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void Update(int L,int R,int x,int l,int r,int rt){ if(L<=l&&r<=R) { flag[rt]+=x; Pushup(l,r,rt); return; } int m=l+r>>1; if(L<=m) Update(L,R,x,lson); if(m<R) Update(L,R,x,rson); Pushup(l,r,rt);}int main(){ int i,cas=0; while(~scanf("%d",&n)&&n) { vt.clear(); cnt=0; for(i=1;i<=n;i++) { double x1,x2,y1,y2; scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); vt.push_back(x1);vt.push_back(x2); a[++cnt]=node(x1,x2,y1,1); a[++cnt]=node(x1,x2,y2,-1); } sort(vt.begin(),vt.end()); vt.erase(unique(vt.begin(),vt.end()),vt.end()); sort(a+1,a+1+cnt,cmp); double ans=0; for(i=1;i<=cnt;i++) { int l=Getid(a[i].l); int r=Getid(a[i].r)-1; Update(l,r,a[i].f,1,(int)vt.size(),1); ans+=sum[1]*(a[i+1].h-a[i].h); } printf("Test case #%d\n",++cas); printf("Total explored area: %.2f\n\n",ans); }}/*********************************************/#include <cstdio>//hdu1828求矩形周长交#include <algorithm>#include <vector>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int N=100010;using namespace std;int n,cnt,sum[N<<2],flag[N<<2],num[N<<2],nl[N<<2],nr[N<<2];struct node{ int l,r,h,f; node(int _l=0,int _r=0,int _h=0,int _f=0):l(_l),r(_r),h(_h),f(_f){}}a[N];bool Cmp(node a,node b){ if(a.h!=b.h) return a.h<b.h; return a.f>b.f;}vector<int> vt;int Getid(int x) {return lower_bound(vt.begin(),vt.end(),x)-vt.begin()+1;}void pushup(int l,int r,int rt){ if(flag[rt]) { sum[rt]=vt[r]-vt[l-1]; num[rt]=nl[rt]=nr[rt]=1; } else if(l==r) sum[rt]=num[rt]=nl[rt]=nr[rt]=0; else { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; nl[rt]=nl[rt<<1]; nr[rt]=nr[rt<<1|1]; num[rt]=num[rt<<1]+num[rt<<1|1]-nl[rt<<1|1]*nr[rt<<1]; }}void Update(int L,int R,int x,int l,int r,int rt){ if(L<=l&&r<=R) { flag[rt]+=x; Pushup(l,r,rt); return; } int m=l+r>>1; if(L<=m) Update(L,R,x,lson); if(m<R) Update(L,R,x,rson); Pushup(l,r,rt);}int main(){ int i; while(~scanf("%d",&n)) { vt.clear(); cnt=0; int x1,x2,y1,y2; for(i=1;i<=n;i++) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); vt.push_back(x1),vt.push_back(x2); a[++cnt]=node(x1,x2,y1,1); a[++cnt]=node(x1,x2,y2,-1); } sort(vt.begin(),vt.end()); vt.erase(unique(vt.begin(),vt.end()),vt.end()); sort(a+1,a+1+cnt,Cmp); int ans=0,last=0; for(i=1;i<=cnt;i++) { int l=Getid(a[i].l); int r=Getid(a[i].r)-1; Update(l,r,a[i].f,1,(int)vt.size(),1); ans+=abs(sum[1]-last)+num[1]*(a[i+1].h-a[i].h)*2; last=sum[1]; } printf("%d\n",ans); }}
0 0
- 线段树扫描线模板
- Lightoj1120线段树扫描线【模板】
- POJ 1151 线段树 扫描线 模板题
- POJ 1177 线段树 扫描线 模板题
- 线段树[扫描线]
- 线段树+扫描线
- 线段树 扫描线
- 线段树扫描线
- 线段树-扫描线
- hdu4007 线段树扫描线
- poj2482 线段树扫描线
- poj2464 线段树扫描线
- ural1707 线段树扫描线
- hdu4419 线段树扫描线
- hdu1828线段树+扫描线
- POJ1177+线段树+扫描线
- POJ1151+线段树+扫描线
- HDU3255(线段树+扫描线)
- Jenkins使用场景
- spring-security学习
- java注解式开发基础
- 【交易日记】2016-11-28
- 【机器视觉】【百度】突然想到程序要工作这个市场
- 线段树扫描线模板
- MYsql备份数据库如何导入到新数据库!
- unity中出现UriFormatException: URI scheme must start with a letter and must consist of one of alphabet,
- map
- iOS开发之跑马灯
- raml-for-jax-rs插件
- 参加第三届国家信息安全与国产化战略高层论坛有感
- 宋小宝通过哪几个人可以找到詹妮弗劳伦斯——利用Web Scraping测试“六度分隔假说”
- String s1 = new String("abc");这句话创建了几个对象?