参考着崔神写的 离散化为小矩形 再依次判断是否在所给矩形中 之前比赛做过一道类似的
1 /* 2 ID:shangca2 3 PROG:rect1 4 LANG:C++ 5 */ 6 #include <iostream> 7 #include<cstdio> 8 #include<cstring> 9 #include<algorithm> 10 #include<stdlib.h> 11 #include<cmath> 12 using namespace std; 13 int x1[1010],x2[1010],y2[1010]; 14 int x[3010],y[3010],co[1010],cou[3010],fx[10010],fy[10010]; 15 int main() 16 { 17 freopen("rect1.in","r",stdin); 18 freopen("rect1.out","w",stdout); 19 int i,j,a,b,k,n,y1[1010]; 20 cin>>a>>b>>n; 21 for(i = 1 ; i <= n ;i++) 22 { 23 cin>>x1[i]>>y1[i]>>x2[i]>>y2[i]>>co[i]; 24 x[i*2-1] = x1[i]; 25 x[i*2] = x2[i]; 26 y[i*2-1] = y1[i]; 27 y[i*2] = y2[i]; 28 } 29 sort(x+1,x+2*n+1); 30 sort(y+1,y+2*n+1); 31 int num=2; 32 fx[0] = 1; 33 for(i = 1; i <= 2*n ; i++) 34 { 35 if(!fx[x[i]]) 36 fx[x[i]] = num++; 37 } 38 if(!fx[a]) 39 fx[a] = num++; 40 int xx = num-1; 41 num = 2; 42 fy[0] = 1; 43 for(i = 1; i <= 2*n ; i++) 44 { 45 if(!fy[y[i]]) 46 fy[y[i]] = num++; 47 } 48 if(!fy[b]) 49 fy[b]=num++; 50 int yy = num-1,r=1,c=1; 51 for(i = 0 ; i <= 10000 ; i++) 52 { 53 if(fx[i]) 54 x[r++] = i; 55 if(fy[i]) 56 y[c++] = i; 57 } 58 for(i = 1 ; i < xx ; i++) 59 for(j=1 ; j < yy ; j++) 60 { 61 for(k = n ; k >=1 ; k--) 62 { 63 if(x1[k]<=x[i]&&y1[k]<=y[j]&&x2[k]>=x[i+1]&&y2[k]>=y[j+1]) 64 { 65 cou[co[k]]+=(x[i+1]-x[i])*(y[j+1]-y[j]); 66 break; 67 } 68 } 69 if(k==0) 70 cou[1]+=(x[i+1]-x[i])*(y[j+1]-y[j]); 71 } 72 for(i = 1 ; i <= 2500 ; i++) 73 if(cou[i]!=0) 74 cout<<i<<" "<<cou[i]<<endl; 75 return 0; 76 }