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 |
题目: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;
}