标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3412 | Accepted: 1763 |
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
题意:矩形面积交.
只用了离散化没用线段树也 47MS AC。。就是耗费的空间大了点,,不过将vis数组开成bool类型应该可以少很多空间..
///离散化 #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <cmath> using namespace std; const int N = 2005; struct Rec{ int x1,y1,x2,y2; }rec[N]; int x[N],y[N]; int vis[N][N]; int k,t; int binary1(int value){ int mid,l=0,r=k-1; while(l<r){ mid = (l+r)>>1; if(x[mid]==value) return mid; if(x[mid]<value) l = mid+1; else r = mid-1; } return l; } int binary2(int value){ int mid,l=0,r=k-1; while(l<r){ mid = (l+r)>>1; if(y[mid]==value) return mid; if(y[mid]<value) l = mid+1; else r = mid-1; } return l; } void input(){ int x1,y1,x2,y2; while(true){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(x1==-1&&x2==-1&&y1==-1&&y2==-1) break; rec[t].x1 = x1,rec[t].y1 = y1,rec[t].x2=x2,rec[t++].y2 = y2; x[k] = x1,y[k++] = y1; x[k] = x2,y[k++] = y2; } sort(x,x+k); sort(y,y+k); } void solve(){ int t1,t2,t3,t4; for(int i=0;i<t;i++){ t1 = binary1(rec[i].x1); t2 = binary1(rec[i].x2); t3 = binary2(rec[i].y1); t4 = binary2(rec[i].y2); for(int j=t1;j<t2;j++){ for(int l = t3;l<t4;l++){ vis[j][l] = 1; } } } int area = 0; for(int i=0;i<k;i++){ for(int j=0;j<k;j++){ area+=vis[i][j]*(x[i+1]-x[i])*(y[j+1]-y[j]); } } printf("%d\n",area); } int main() { int x1,y1,x2,y2; while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2)!=EOF){ if(x1==-1&&x2==-1&&y1==-1&&y2==-1) break; memset(vis,0,sizeof(vis)); k=0,t=0; rec[t].x1 = x1,rec[t].y1 = y1,rec[t].x2=x2,rec[t++].y2 = y2; x[k] = x1,y[k++] = y1; x[k] = x2,y[k++] = y2; input(); solve(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/liyinggang/p/5462452.html