标签:
一样的题:HDU 1542
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 18148 | Accepted: 6902 |
Description
Input
Output
Sample Input
2 10 10 20 20 15 15 25 25.5 0
Sample Output
Test case #1 Total explored area: 180.00
求矩形并、线段树+扫描线
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 210 int n; int tot; double sum; double y[N]; double yl[N<<2]; double yr[N<<2]; int cover[N<<2]; double height[N<<2]; struct X { int pos; double x,y1,y2; bool operator <(const X &t)const { return x<t.x; } }x[N]; void pushup(int l,int r,int rt) { if(cover[rt]>0) height[rt]=yr[rt]-yl[rt]; else if(l+1==r) height[rt]=0; else height[rt]=height[rt<<1]+height[rt<<1|1]; } void build(int l,int r,int rt) { cover[rt]=0; yl[rt]=y[l]; yr[rt]=y[r]; if(l+1==r) return; int m=(l+r)>>1; build(l,m,rt<<1); build(m,r,rt<<1|1); } void update(int l,int r,int rt,double L,double R,int c) { if(yl[rt]==L && yr[rt]==R) { cover[rt]+=c; pushup(l,r,rt); return; } int m=(l+r)>>1; if(R<=y[m]) update(l,m,rt<<1,L,R,c); else if(L>=y[m]) update(m,r,rt<<1|1,L,R,c); else { update(l,m,rt<<1,L,y[m],c); update(m,r,rt<<1|1,y[m],R,c); } pushup(l,r,rt); } int main() { int i,iCase=1; while(scanf("%d",&n),n) { tot=0; sum=0; memset(height,0,sizeof(height)); for(i=0;i<n;i++) { double x1,y1,x2,y2; scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); y[tot]=y1; x[tot].x=x1;x[tot].y1=y1;x[tot].y2=y2;x[tot++].pos=1; y[tot]=y2; x[tot].x=x2;x[tot].y1=y1;x[tot].y2=y2;x[tot++].pos=-1; } sort(x,x+tot); sort(y,y+tot); build(0,tot-1,1); for(i=1;i<tot;i++) { update(0,tot-1,1,x[i-1].y1,x[i-1].y2,x[i-1].pos); sum+=height[1]*(x[i].x-x[i-1].x); } printf("Test case #%d\nTotal explored area: %.2f\n\n",iCase++,sum); } return 0; }
一样的题:POJ 1389
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3193 | Accepted: 1627 |
Description
Input
Output
Sample Input
0 0 4 4 1 1 5 2 1 1 2 5 -1 -1 -1 -1 0 0 2 2 1 1 3 3 2 2 4 4 -1 -1 -1 -1 -1 -1 -1 -1
Sample Output
18 10
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 210 int n; int tot; double sum; double y[N]; double yl[N<<2]; double yr[N<<2]; int cover[N<<2]; double height[N<<2]; struct X { int pos; double x,y1,y2; bool operator <(const X &t)const { return x<t.x; } }x[N]; void pushup(int l,int r,int rt) { if(cover[rt]>0) height[rt]=yr[rt]-yl[rt]; else if(l+1==r) height[rt]=0; else height[rt]=height[rt<<1]+height[rt<<1|1]; } void build(int l,int r,int rt) { cover[rt]=0; yl[rt]=y[l]; yr[rt]=y[r]; if(l+1==r) return; int m=(l+r)>>1; build(l,m,rt<<1); build(m,r,rt<<1|1); } void update(int l,int r,int rt,double L,double R,int c) { if(yl[rt]==L && yr[rt]==R) { cover[rt]+=c; pushup(l,r,rt); return; } int m=(l+r)>>1; if(R<=y[m]) update(l,m,rt<<1,L,R,c); else if(L>=y[m]) update(m,r,rt<<1|1,L,R,c); else { update(l,m,rt<<1,L,y[m],c); update(m,r,rt<<1|1,y[m],R,c); } pushup(l,r,rt); } int main() { int i; while(1) { tot=0; sum=0; memset(height,0,sizeof(height)); n=0; double x1,y1,x2,y2; while(scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2) && x1+x2+y1+y2!=-4) { y[tot]=y1; x[tot].x=x1;x[tot].y1=y1;x[tot].y2=y2;x[tot++].pos=1; y[tot]=y2; x[tot].x=x2;x[tot].y1=y1;x[tot].y2=y2;x[tot++].pos=-1; n++; } if(n==0) break; sort(x,x+tot); sort(y,y+tot); build(0,tot-1,1); for(i=1;i<tot;i++) { update(0,tot-1,1,x[i-1].y1,x[i-1].y2,x[i-1].pos); sum+=height[1]*(x[i].x-x[i-1].x); } printf("%.0f\n",sum); } return 0; }
标签:
原文地址:http://www.cnblogs.com/hate13/p/4192142.html