| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 3730 | Accepted: 1082 |
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 i-th line of the following N lines contains four integers
X1,Y1,X2,Y2 (0 ≤
X1 < X2 ≤ 1000, 0 ≤ Y1 < Y2 ≤ 1000), which indicate that the lower-left and upper-right coordinates of the
i-th rectangle are (X1, Y1) and (X2, Y2). Rectangles are numbered from 1 to
N.
The last M lines of each test case describe M queries. Each query starts with a integer
R(1<=R ≤ N), which is the number of rectangles the query is supposed to fill. The following list of
R integers in the same line gives the rectangles the query is supposed to fill, each integer of which will be between 1 and
N, inclusive.
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).
For each query in the input, print a line containing the query number (beginning with 1) followed by the corresponding answer for the query. Print a blank line after the output for each test case.
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
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const INF = 0x3fffffff;
int const MAX = 1 << 21;
int q[MAX], ans[MAX];
int n, m;
struct R
{
int x1, y1;
int x2, y2;
}r[25];
void DFS(int x1, int y1, int x2, int y2, int pos, int sgin, int sta)
{
if(x1 >= x2 || y1 >= y2)
return;
if(pos == n + 1)
{
if(sta)
for(int i = 1; i <= m; i++)
if((q[i] & sta) == sta)
ans[q[i]] += sgin * (x2 - x1) * (y2 - y1);
return;
}
int xx1 = max(x1, r[pos + 1].x1);
int yy1 = max(y1, r[pos + 1].y1);
int xx2 = min(x2, r[pos + 1].x2);
int yy2 = min(y2, r[pos + 1].y2);
DFS(x1, y1, x2, y2, pos + 1, sgin, sta);
DFS(xx1, yy1, xx2, yy2, pos + 1, -sgin, sta | (1 << pos));
return;
}
int main()
{
int ca = 1;
while(scanf("%d %d", &n, &m) != EOF && (n + m))
{
memset(q, 0, sizeof(q));
memset(ans, 0, sizeof(ans));
printf("Case %d:\n", ca++);
for(int i = 1; i <= n; i++)
scanf("%d %d %d %d", &r[i].x1, &r[i].y1, &r[i].x2, &r[i].y2);
for(int i = 1; i <= m; i++)
{
int num;
scanf("%d", &num);
while(num --)
{
int tmp;
scanf("%d", &tmp);
q[i] |= (1 << (tmp - 1));
}
}
DFS(0, 0, INF, INF, 0, -1, 0);
for(int i = 1; i <= m; i++)
printf("Query %d: %d\n", i, ans[q[i]]);
printf("\n");
}
}版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 3695 Rectangles (矩形并 状压+容斥定理 好题)
原文:http://blog.csdn.net/tc_to_top/article/details/47266711