->题目请戳这里<-
题目大意:略
题目分析:简单求矩形面积并,不懂的可以看其他几篇博客。这题就是拿来练一下1Y率和敲代码速度。果然小手一抖,把i和j敲反了卡了一下,BS一下自己。。。
详情请见代码:
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 1005; int hash[N + N]; struct node { int x,y1,y2,flag; }line[N + N]; struct nd { int cover,len; } tree[N<<3]; int cmp(struct node a,struct node b) { return a.x < b.x; } int gety(int x,int len) { int l = 1; int r = len; int mid; while(l <= r) { mid = (l + r)>>1; if(hash[mid] == x) return mid; else { if(hash[mid] > x) r = mid - 1; else l = mid + 1; } } return -1; } void build(int num,int s,int e) { tree[num].cover = tree[num].len = 0; if(s == e) return; int mid = (s + e)>>1; build(num<<1,s,mid); build(num<<1|1,mid + 1,e); } void insert(int num,int s,int e,int l,int r,int add) { if(s == e) { tree[num].cover += add; if(tree[num].cover) tree[num].len = hash[e + 1] - hash[s]; else tree[num].len = 0; return; } if(s == l && r == e) { tree[num].cover += add; if(tree[num].cover) tree[num].len = hash[e + 1] - hash[s]; else tree[num].len = tree[num<<1].len + tree[num<<1|1].len; return; } int mid = (s + e)>>1; if(r <= mid) insert(num<<1,s,mid,l,r,add); else { if(l > mid) insert(num<<1|1,mid + 1,e,l,r,add); else { insert(num<<1,s,mid,l,mid,add); insert(num<<1|1,mid + 1,e,mid + 1,r,add); } } if(tree[num].cover) tree[num].len = hash[e + 1] - hash[s]; else tree[num].len = tree[num<<1].len + tree[num<<1|1].len; } int main() { int x1,x2,y1,y2,i,j,m,n; while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2) != EOF) { if(x1 == -1 && x2 == -1 && y1 == -1 && y2 == -1) break; line[1].x = x1; line[1].y1 = y1; line[1].y2 = y2; line[1].flag = 1; line[2].x = x2; line[2].y1 = y1; line[2].y2 = y2; line[2].flag = -1; hash[1] = y1; hash[2] = y2; i = 2; while(~scanf("%d%d%d%d",&x1,&y1,&x2,&y2)) { if(x1 == -1 && x2 == -1 && y1 == -1 && y2 == -1) break; line[i + 1].x = x1; line[i + 1].y1 = y1; line[i + 1].y2 = y2; line[i + 1].flag = 1; line[i + 2].x = x2; line[i + 2].y1 = y1; line[i + 2].y2 = y2; line[i + 2].flag = -1; hash[i + 1] = y1; hash[i + 2] = y2; i += 2; } sort(hash + 1,hash + i + 1); m = 2; for(j = 2;j <= i;j ++) if(hash[j] != hash[j - 1]) hash[m ++] = hash[j]; m --; build(1,1,m); int l,r; sort(line + 1,line + i + 1,cmp); l = gety(line[1].y1,m); r = gety(line[1].y2,m) - 1; insert(1,1,m,l,r,line[1].flag); int ans = 0; for(j = 2;j <= i;j ++) { ans += (line[j].x - line[j - 1].x) * tree[1].len; l = gety(line[j].y1,m); r = gety(line[j].y2,m) - 1; insert(1,1,m,l,r,line[j].flag); } printf("%d\n",ans); } return 0; } //228K 16MS