Rectangles
Description You are developing a software for painting rectangles on the screen. The software supports drawing several rectangles and filling some of them with a color different from the color of the background. You are to implement an important function. The function answer such queries as what is the colored area if a subset of rectangles on the screen are filled. Input The input consists of multiple test cases. Each test case starts with a line containing two integers N(1 ≤ N ≤ 20) and M(1 ≤ M ≤ 100000), indicating the number of rectangles on the screen and the number of queries, respectively. The last test case is followed by a line containing two zeros. Output For each test case, print a line containing the test case number( beginning with 1). Sample Input 2 2 0 0 2 2 1 1 3 3 1 1 2 1 2 2 1 0 1 1 2 2 1 3 2 2 1 2 0 0 Sample Output Case 1: Query 1: 4 Query 2: 7 Case 2: Query 1: 2 Source
2008 Asia Hefei Regional Contest Online by USTC
|
题目:http://poj.org/problem?id=3695
题意:在一个平面上画矩形,给你n个矩形,每次从里面挑出若干个,问着几个矩形覆盖的面积,提问次数比较多
分析:这题提问数据比较多,不过矩行数比较少,个人感觉直接矩形切割就行了,所以写了个,居然1000ms过了,而且前20,刚好在ACRush前一名,离大神如此的近啊,膜拜中。。。这题的另一个做法就是线段树,不过最近太懒,不想写了= =
代码:
#include<cstdio> #include<iostream> using namespace std; const int mm=22; int sx[mm],sy[mm],tx[mm],ty[mm],d[mm]; int n,m,r,sum; void Cut(int i,int ax,int ay,int bx,int by) { while(i<r&&(ax>=tx[d[i]]||bx<=sx[d[i]]||ay>=ty[d[i]]||by<=sy[d[i]]))++i; if(i>=r)sum+=(bx-ax)*(by-ay); else { if(ax<sx[d[i]])Cut(i+1,ax,ay,sx[d[i]],by),ax=sx[d[i]]; if(bx>tx[d[i]])Cut(i+1,tx[d[i]],ay,bx,by),bx=tx[d[i]]; if(ay<sy[d[i]])Cut(i+1,ax,ay,bx,sy[d[i]]); if(by>ty[d[i]])Cut(i+1,ax,ty[d[i]],bx,by); } } int main() { int i,cs=0,t; while(scanf("%d%d",&n,&m),n+m) { for(i=1;i<=n;++i) scanf("%d%d%d%d",&sx[i],&sy[i],&tx[i],&ty[i]); printf("Case %d:\n",++cs); t=0; while(m--) { scanf("%d",&r); for(i=0;i<r;++i) scanf("%d",&d[i]); for(sum=i=0;i<r;++i) Cut(i+1,sx[d[i]],sy[d[i]],tx[d[i]],ty[d[i]]); printf("Query %d: %d\n",++t,sum); } puts(""); } return 0; }