Poj 3695-Rectangles 矩形切割


Rectangles

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 3846   Accepted: 1124

Description

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

Source

2008 Asia Hefei Regional Contest Online by USTC

题意:给你一些矩形,编号为1~n。有一些询问,每次问你其中的一些矩形的面积并。

题解:

矩形切割

矩形切割裸题。。。当然也可以用线段树(大坑。。。)

直接挂个模版就过了。

看到Discuss中有人说矩形切割会TLE。可能是常数太大了吧。但我没有TLE呀,而且貌似跑的飞快(时间好像排32名,内存也很小。。。)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct node
 4 {
 5     int X1,Y1,X2,Y2;
 6 }R[26];
 7 int s1,cc[26],ans[26];
 8 int read()
 9 {
10     int s=0,fh=1;char ch=getchar();
11     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)fh=-1;ch=getchar();}
12     while(ch>=‘0‘&&ch<=‘9‘){s=s*10+(ch-‘0‘);ch=getchar();}
13     return s*fh;
14 }
15 void Cover(int X1,int Y1,int X2,int Y2,int k,int k1)
16 {
17     while(k<=s1&&(X1>=R[cc[k]].X2||X2<=R[cc[k]].X1||Y1>=R[cc[k]].Y2||Y2<=R[cc[k]].Y1))k++;
18     if(k>=s1+1){ans[k1]+=(X2-X1)*(Y2-Y1);return;}
19     if(X1<R[cc[k]].X1){Cover(X1,Y1,R[cc[k]].X1,Y2,k+1,k1);X1=R[cc[k]].X1;}
20     if(X2>R[cc[k]].X2){Cover(R[cc[k]].X2,Y1,X2,Y2,k+1,k1);X2=R[cc[k]].X2;}
21     if(Y1<R[cc[k]].Y1){Cover(X1,Y1,X2,R[cc[k]].Y1,k+1,k1);Y1=R[cc[k]].Y1;}
22     if(Y2>R[cc[k]].Y2){Cover(X1,R[cc[k]].Y2,X2,Y2,k+1,k1);Y2=R[cc[k]].Y2;}
23 }
24 int main()
25 {
26     int n,m,i,case1=0,C=0,j,sum;
27     while(1)
28     {
29         n=read();m=read();if(n==0&&m==0)break;
30         for(i=1;i<=n;i++){R[i].X1=read();R[i].Y1=read();R[i].X2=read();R[i].Y2=read();}
31         printf("Case %d:\n",++case1);
32         C=0;
33         for(i=1;i<=m;i++)
34         {
35             s1=read();
36             for(j=1;j<=s1;j++)cc[j]=read();
37             for(j=s1;j>=1;j--)Cover(R[cc[j]].X1,R[cc[j]].Y1,R[cc[j]].X2,R[cc[j]].Y2,j+1,j);//矩形切割法
38             sum=0;
39             for(j=1;j<=s1;j++){sum+=ans[j];ans[j]=0;}
40             printf("Query %d: %d\n",++C,sum);
41         }
42         printf("\n");
43     }
44     fclose(stdin);
45     fclose(stdout);
46     return 0;
47 }
时间: 2024-10-06 18:50:45

Poj 3695-Rectangles 矩形切割的相关文章

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的 也就是说我们没必要把所有情况都考虑

ural1147(Shaping Regions)矩形切割

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1147 题意:一个10000*10000的矩阵,初始颜色都为1,然后最多2500次涂色,每次涂色将一个矩形的面积涂成某个特定颜色,问涂完之后每种颜色最终的面积. 解法:倒序计算,矩形切割 代码: /****************************************************** * @author:xiefubao **************************

USACO5.3 IDDFS_强连通_二维树状数组_斐蜀定理_矩形切割

启发式搜索 启发式搜索的主要思想是通过评价一个状态有"多好"来改进对于解的搜索. 方法#1:启发式剪枝 估价函数最简单最普通的用法是进行剪枝.假设有一个求最小代价的一个搜索,使用一个可行的估价函数.如果搜到当前状态时代价为A,这个状态的估价函数是B,那么从这个状态开始搜所能得到的最小代价是A+B.如果当前最优解是C满足C 方法#2:最佳优先搜索 最佳搜索可以看成贪心的深度优先搜索. 与一般搜索随意扩展后继节点不同,最优优先搜索按照估价函数所给的他们的"好坏"的顺序扩

POJ 2155 Matrix (矩形)

date:公元2017年7月19日适逢周三: location:清北集训 杭州 point:二维树状数组/二维差分 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 28325   Accepted: 10341 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the

poj 1151(离散化+矩形面积并)

题目链接:http://poj.org/problem?id=1151 关于离散化,这篇博客讲的很好:http://www.cppblog.com/MiYu/archive/2010/10/15/129999.aspx 我线段树还是不会写这个.. 借个图: ///离散化 #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <cm

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,然后判断当一个组合内的矩形均属于某个询问内(可用二进制或计算),则按照

poj 1151 Atlantis(矩形面积并)

题意:每组给出矩形左上角和右下角坐标,求矩形面积并: 思路:沿水平方向计算面积并:(切成水平条): #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; const int maxn=500; struct node{ double x; int l,r,t; //t为上下边标志

poj 1151 求矩形面积并 (线段树扫描线)

题意: 给出n个矩形的左下角和右上角坐标,求这n个矩形所构成的面积 思路: 线段树扫描线 这是第一次做到线段树扫描线,刚开始也不懂 如果不懂,可以看: http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html 和 http://www.faceye.net/search/69289.html 我是看第一个链接弄懂的 然后学习了第二位的方法 代码上也有比较详细的注释,想可以帮到大家 code: #include<cstd