POJ 3695

可以用容斥原理来求。求两个矩形的并的时候可以使用条件

x1=max(p.x1,q.x1);
y1=max(p.y1,q.y1);
x2=min(p.x2,q.x2);
y2=min(p.y2,q.y2);

if(x2>x1&&y2>y1)可以并,否则,并不了。

。。。

开始时,我对每个询问都做一次容斥原理,TLE。可以这样改进一下。对每个询问,用了哪些矩形可以用一个二进制的数来存起来。对所有的矩形做一次DFS,然后判断当一个组合内的矩形均属于某个询问内(可用二进制或计算),则按照容斥原理公式计算即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define M 100005
using namespace std;

struct Rectangle{
	int x1,y1,x2,y2;
};
Rectangle r[25];
int status[1250000];
int choice[M];
int ans;

bool WhetherRec(int x1,int y1,int x2,int y2){
	if(x2>x1&&y2>y1)
	return true;
	return false;
}

void dfs(int i,int num,Rectangle p,int al,int sta,int ml){

	if(i>=al){
		if(num==0){
			for(int k=1;k<=ml;k++)
			status[choice[k]]=0;
		}
		else if(num&1){
			for(int k=1;k<=ml;k++){
				if((sta|choice[k])<=choice[k])
				status[choice[k]]+=(p.x2-p.x1)*(p.y2-p.y1);
			}
		}
		else{
			for(int k=1;k<=ml;k++){
				if((sta|choice[k])<=choice[k])
				status[choice[k]]-=(p.x2-p.x1)*(p.y2-p.y1);
			}
		}
		return ;
	}

	dfs(i+1,num,p,al,sta,ml);
	Rectangle tmp;
	int x1=max(p.x1,r[i].x1);
	int y1=max(p.y1,r[i].y1);
	int x2=min(p.x2,r[i].x2);
	int y2=min(p.y2,r[i].y2);
	if(WhetherRec(x1,y1,x2,y2)){
		tmp.x1=x1; tmp.x2=x2;
		tmp.y1=y1; tmp.y2=y2;
		dfs(i+1,num+1,tmp,al,sta|(1<<(i)),ml);
	}
}

void work(int n,int m){
	Rectangle p;
	p.x1=p.y1=0; p.x2=p.y2=1000;
	dfs(0,0,p,n,0,m);
}

int main(){
	int kase=0;
	int n,m,k,tmp,sta;
	while(scanf("%d%d",&n,&m),n||m){
		kase++;
		for(int i=0;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++){
			scanf("%d",&k);
			sta=0;
			for(int p=0;p<k;p++){
				scanf("%d",&tmp);
				sta=(sta|(1<<(tmp-1)));
			}
			choice[i]=sta;
		}
		work(n,m);
		printf("Case %d:\n",kase);
		for(int e=1;e<=m;e++){
			printf("Query %d: %d\n",e,status[choice[e]]);
		}
		printf("\n");
	}
	return 0;
}

  

时间: 2024-10-03 06:57:57

POJ 3695的相关文章

POJ 3695 Rectangles (矩形并 状压+容斥定理 好题)

Rectangles 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 w

POJ 3695 Rectangles 1w询问求20个矩阵面积并 容斥

题目链接:点击打开链接 一个详细的题解:点击打开链接 题目大意是给出若干个矩形(n <= 20) 然后m个询问(m <= 100000) 每个询问会给出一些矩形的编号,问这些矩形的面积并有多大 谈到矩形并,也许第一反应都是线段树 但是此题有一个特点,就是n非常小,m却非常大 用线段树很有可能会不行 于是换个思路,n很小,我们可以把所有的可能组合情况都考虑到,然后呢预处理出来,这样询问时就是O(1)的查询了 但是1<<20显然是远大于100000的 也就是说我们没必要把所有情况都考虑

[转] POJ几何分类

转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板.如果代码一片混乱,那么会严重影响做题正确率.4.注意精度控制.5.能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍,或扩大sqrt2).因为整数不用考虑浮点误差,而且运算比浮点快. 一.点

计算几何学习6

周末搞完了扫描线的部分 上次说的半平面交问题做法是没问题的 是按照中垂线划分平面 再求核的面积 因为是每加入一个直线就判断 所以n^2的好一点 扫描线板子(poj1177 周长并) #include <cstdio> #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #define lc(x) (x << 1) #define

【转】计算几何题目推荐

打算转下来好好做计算几何了. 原文地址:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行

【整理】线段树30题

1,poj 1151 Atlantis: 求矩形面积并. 2,poj 1177 Picture: 求矩形轮廓的周长. 3,poj 1389 Area of Simple Polygons :同第一题. 4,poj 1823 Hotel :线段树线段的插入删除求线段树中最长的线段长度 5,poj 2104 K-th Number:线段树维护归并排序树+三次二分查找   (区间第k大 ,主席树也行,前者可以练习试一下). 6,poj 2155 Matrix :求二维平面的矩形信息,二维线段树,或者二

hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)

Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/128000 K (Java/Others)Total Submission(s): 2578    Accepted Submission(s): 713 Problem Description Aliens on planet Pandora also write computer programs l

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)