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
题意 给你几个矩形 判断他们重合之后的新图形的面积
首先你要判断两个矩形是否相交
然后就是深搜每一个矩形i ,将其与矩形[i+1…n]进行判断是否融合求出其面积 而求面积的思想就是容斥定理
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
#include <list>
using namespace std;
int n,num[50],s,ans;
struct node
{
int x[2],y[2],area; //左下角 (x1,y1) 右上角(x2,y2) area为面积
}ju[50];
bool intersection(node a,node b) //判段是否相交
{
int zxa[2],zxb[2],lx[2],ly[2];
lx[0]=a.x[1]-a.x[0],ly[0]=a.y[1]-a.y[0]; //矩形a宽,长
lx[1]=b.x[1]-b.x[0],ly[1]=b.y[1]-b.y[0]; //矩形b宽,长
zxa[0]=a.x[1]+a.x[0],zxa[1]=a.y[1]+a.y[0]; //矩形 a重心
zxb[0]=b.x[1]+b.x[0],zxb[1]=b.y[1]+b.y[0]; //矩形 b重心
if(abs(zxa[0]-zxb[0])<(lx[0]+lx[1])&&abs(zxa[1]-zxb[1])<(ly[0]+ly[1]))
return true;
return false;
}
void dfs(node r,int id,int k)
{
node temp,t;
if(id>=s)
return ;
for(int i=id+1; i<s; i++)
{
t=ju[num[i]];
if(intersection(r,t))
{
temp.x[0]=max(r.x[0],t.x[0]); //相交之后的参数,自己可以动手花花
temp.y[0]=max(r.y[0],t.y[0]);
temp.x[1]=min(r.x[1],t.x[1]);
temp.y[1]=min(r.y[1],t.y[1]);
temp.area=(temp.y[1]-temp.y[0])*(temp.x[1]-temp.x[0]);
if(k&1) //奇加偶减
ans+=temp.area;
else
ans-=temp.area;
dfs(temp,i,k+1);
}
}
}
int main()
{
int m,k=1;
while(~scanf("%d %d",&n,&m))
{
if(n==0&&m==0)
break;
for(int i=0; i<n; i++)
{
for(int j=0; j<2; j++)
scanf("%d%d",&ju[i].x[j],&ju[i].y[j]);
ju[i].area=(ju[i].x[1]-ju[i].x[0])*(ju[i].y[1]-ju[i].y[0]);
}
printf("Case %d:\n",k++);
int t=1;
while(m--)
{
ans=0;
scanf("%d",&s);
for(int i=0; i<s; i++)
{
scanf("%d",&num[i]);
num[i]--;
ans+=ju[num[i]].area;
}
for(int i=0; i<s; i++)
{
dfs(ju[num[i]],i,0);
}
printf("Query %d: %d\n",t++,ans);
}
printf("\n");
}
return 0;
}