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

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;
}

  

POJ 3695的更多相关文章

  1. hdu 2461(AC) & poj 3695(TLE)(离散化+矩形并)

    Rectangles Time Limit: 5000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. [转] POJ计算几何

    转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板 ...

  3. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  4. HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)

    Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...

  5. HDU 3695 / POJ 3987 Computer Virus on Planet Pandora

      Computer Virus on Planet Pandora Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1353 ...

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

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  7. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  8. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

  9. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

随机推荐

  1. 开启WIFI

    C:\Windows\system32>netsh wlan set hostednetwork mode=allow ssid=wuyechun-wifi k ey= 承载网络模式已设置为允许 ...

  2. COCOS2DX 3.0 优化提升渲染速度 Auto-batching

    COCOS2DX 3.0 优化提升渲染速度 Auto-batching 近期在看COCOS2DX 3.0的Auto-batching合批与Auto Culling动态缩减功能以下就来细致看看吧:整合好 ...

  3. 略微复杂的sql逻辑(从数据库逆序查找有限条记录(limit))并按相反顺序输出

    项目中有一个业务需求是:默认载入15条历史记录(按时间顺序从早到晚). 以下是我构造的sql逻辑,mark一下,亲測可行. SELECT * FROM (SELECT *FROM group_chat ...

  4. insmod: error inserting &#39;hello.ko&#39;: -1 Invalid module format

    在学习编写linux驱动程序的时候,一般都是从写一个helloworld的模块開始. 可是在编译完毕后,进行模块载入的时候,有时会出现例如以下错误: insmod: error inserting ' ...

  5. android:padding 与 android:margin的差别

    android:padding    Padding 为内边框,指该控件内部内容,如文本/图片距离该控件的边距 android:margin   Margin 为外边框,指该控件距离边父控件的边距

  6. 初学ToggleButton 点击button,更换button背景图片;再次点击,恢复之前背景图

    上方的图标,R.drawable.register_checked  是选中图片 下方的图标,   R.drawable.register_unchecked 是未选中图片 默认是上方的选中效果.点击 ...

  7. (转)c++ typedef 函数指针详细说明

    转自:http://blog.csdn.net/future200x/article/details/5350134 一个函数在编译时被分配一个入口地址,将这个入口地址称为函数的指针,可以用一个指针变 ...

  8. [yueqian_scut]Android多点触控技术和应用框架

    Android多点触控技术跟Linux输入子系统紧密相关.本文将从应用的角度说明Android多点触控技术的接口和应用. 一.多点触控场景分析 网络上有关Android多点触控技术的文章多见于两点拉伸 ...

  9. Android系统驱动【转】

    本文转载自:http://www.hovercool.com/en/%E6%B7%BB%E5%8A%A0%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9D%97#a_.E5.9B.9B ...

  10. notepad++ 插件推荐——快速定位文件

    介绍Notepad++的文章很多,我这里就不赘述了.简言之,是一个轻便的文本编辑工具.结合丰富的插件,可以实现很多功能,可以成为一个轻量级的IDE,用来做脚本开发非常合适. 这里介绍几个插件可以用来进 ...