您的位置:首页 > 其它

hdu 2461 Rectangles

2014-03-25 17:22 239 查看
求矩形的并 矩形个数 1...20
m次询问 回答要求的r个矩形的并
容斥原理
dfs优化: 遇到面积交为0时 这个dfs分支可以不下去了

#include <iostream>
#include <string>
#include<sstream>
#include <cmath>
#include <map>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
//#define  LL long long
#define LL __int64
struct Rectan
{
int x1,y1;
int x2,y2;
Rectan jiao(Rectan &R)
{
Rectan t;
t.x1=max(x1,R.x1);
t.y1=max(y1,R.y1);
t.x2=min(x2,R.x2);
t.y2=min(y2,R.y2);
return t;
}
int area()
{
if(x1>=x2||y1>=y2) return 0;
return (x2-x1)*(y2-y1);
}
}ar[30];
int rc[30],r;
int ans;
void dfs(int deep,Rectan R,int index)
{
Rectan t;
int i;
for(i=index;i<=r;i++)
{
t=R.jiao(ar[rc[i]]);
if(t.area())
{
if(deep&1) ans-=t.area();
else       ans+=t.area();
dfs(deep+1,t,i+1);
}
}
}
int main()
{
int n,m;
int i,Case=1,q;
while(scanf("%d %d",&n,&m),n|m)
{
for(i=1;i<=n;i++)
scanf("%d %d %d %d",&ar[i].x1,&ar[i].y1,&ar[i].x2,&ar[i].y2);
printf("Case %d:\n",Case++);
for(q=1;q<=m;q++)
{
ans=0;
scanf("%d",&r);
for(i=1;i<=r;i++)
scanf("%d",&rc[i]);
for(i=1;i<=r;i++)
{
ans+=ar[rc[i]].area();
dfs(1,ar[rc[i]],i+1);
}
printf("Query %d: %d\n",q,ans);
}
printf("\n");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: