//poj 3695
#include <iostream>
using namespace std;
int n,m;
int st[1200000],ask[120000];
struct REC
{
int x1,y1,x2,y2;
}p[32];
void dfs(int xa,int ya,int xb,int yb,int deep,int flag,int sta)
{
if(xa>=xb||ya>=yb) return ;
if(deep==n){
if(sta){
for(int i=1;i<=m;++i)
if((ask[i]|sta)==ask[i])
st[ask[i]]+=flag*(xb-xa)*(yb-ya);
}
return ;
}
dfs(xa,ya,xb,yb,deep+1,flag,sta);
dfs(max(xa,p[deep+1].x1),max(ya,p[deep+1].y1),min(xb,p[deep+1].x2),min(yb,p[deep+1].y2),
deep+1,-flag,sta|(1<<deep));
}
int main()
{
int cases=0;
while(scanf("%d%d",&n,&m)==2){
if(n==0&&m==0)
break;
memset(st,0,sizeof(st));
memset(ask,0,sizeof(ask));
for(int i=1;i<=n;++i)
scanf("%d%d%d%d",&p[i].x1,&p[i].y1,&p[i].x2,&p[i].y2);
for(int i=1;i<=m;++i){
int t;
scanf("%d",&t);
while(t--){
int x;
scanf("%d",&x);
ask[i]|=(1<<(x-1));
}
}
dfs(0,0,INT_MAX,INT_MAX,0,-1,0);
printf("Case %d:\n",++cases);
for(int i=1;i<=m;++i)
printf("Query %d: %d\n",i,st[ask[i]]);
puts("");
}
return 0;
} poj 3695 Rectangles 容斥原理解矩形面积并
最新推荐文章于 2021-09-13 09:48:36 发布
本文提供了一个解决POJ3695问题的C++实现方案,通过递归深度优先搜索算法来计算给定区域内的重叠矩形面积,并针对特定查询返回结果。
481

被折叠的 条评论
为什么被折叠?



