[BZOJ1790][AHOI2008]Rectangle 矩形藏宝地(四维偏序,CDQ+线段树)

摘要:
接下来的N行描述了一个具有四个整数x1、y1、x2和y2的矩形。其中,表示矩形左下角和右上角的坐标。xi值或yi值最多只能出现一次。输出仅包含一个整数,它表示必须埋藏宝藏的矩形土地的数量。SampleInput3005512342143SampleOutput2HINT100%的数据,N˂=20000070%的数据,N˂=5000030%的数据,N+=5000的所有数据,x值或Y值最多出现一次SourceDay2[Submit][Status][Focus]四维部分顺序,具有明显的意义,但存在差异。这里不计算满足条件的对数,只计算0和1的判断,因此我们可以使用三维偏序。

1790: [Ahoi2008]Rectangle 矩形藏宝地

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 553  Solved: 193
[Submit][Status][Discuss]

Description

欢 乐岛上最著名的游戏是一个寻宝游戏,小可可来到宝藏的埋藏地,这是一块开阔地,宝藏被分散的埋藏在这块地下,现在要做的是一件件的把宝藏挖出来。为了提示 宝藏的埋藏点,游戏的主办方把这块开阔地当作第一象限,将所有可能埋藏宝藏的地方划成一个个矩形的土地,并把这些矩形土地的坐标都告诉了参赛者。挖宝的提 示很简单,只要某一个矩阵土地至少被另外一个矩阵土地所包含,那么这个矩阵土地里肯定埋有宝藏。其实这些宝藏都是一些精美的纪念品,如果谁挖出来了纪念品 就归谁了,小可可很想为这次旅程画上完美的句号,有你的帮助他信心十足,你只要告诉他.有多少个矩形土地里肯定埋有宝藏就行了。胜利就在眼前,加油吧!!

Input

第一行包含一个整数N(N≤200000),表示矩形的个数。接下来N行,每行用4个整数x1,y1,x2,y2,描述了一个矩形。其中(x1,y1)表示这个矩形左下角的坐标,(x2,y2)表示右上角的坐标,一个xi值或yi值最多出现一次.

Output

只包含一个整数,表示肯定埋有宝藏的矩形土地的个数。

Sample Input

3
0 0 5 5
1 2 3 4
2 1 4 3

Sample Output

2

HINT

100%的数据中,N<=200000
70%的数据申,N<=50000
30%的数据中,N<=5000
所有数据中,一个x值或Y值最多出现一次

Source

[Submit][Status][Discuss]

题意显然的四维偏序,但是有不同的地方,这里求的不是满足条件的对数,而是只有0和1的判断,所以可以用三维偏序做。

按照常规方法,对a分治,对b排序,这时候我们询问的其实就是“到当前为止的所有c'>=c的矩形中,最大的d'是否大于d”,这个就是线段树后缀最大值。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define ls (x<<1)
 4 #define rs (ls|1)
 5 #define lson ls,L,mid
 6 #define rson rs,mid+1,R
 7 #define rep(i,l,r) for (int i=l; i<=r; i++)
 8 using namespace std;
 9 
10 const int N=200100;
11 int n,ans,tot,b[N],res[N],tag[N],v[N<<2],mx[N<<2];
12 struct P{ int a,b,c,d,id; }a[N],p[N];
13 bool operator <(const P &a,const P &b){ return a.a<b.a; }
14 bool cmp(const P &a,const P &b){ return a.b<b.b; }
15 
16 void upd(int x,int L,int R,int pos,int k){
17     if (L==R){ v[x]=mx[x]=k; return; }
18     int mid=(L+R)>>1;
19     if (pos<=mid) upd(lson,pos,k); else upd(rson,pos,k);
20     mx[x]=max(mx[ls],mx[rs]);
21 }
22 
23 int que(int x,int L,int R,int pos){
24     if (L==R) return mx[x];
25     int mid=(L+R)>>1;
26     if (pos<=mid) return max(que(lson,pos),mx[rs]);
27         else return que(rson,pos);
28 }
29 
30 void CDQ(int l,int r){
31     if (l==r) return;
32     int mid=(l+r)>>1;
33     CDQ(l,mid); CDQ(mid+1,r);
34     rep(i,l,mid) tag[a[i].id]=1;
35     rep(i,l,r) p[i]=a[i];
36     sort(p+l,p+r+1,cmp);
37     rep(i,l,r){
38         if (tag[p[i].id]) upd(1,1,n,p[i].c,p[i].d);
39         else if (que(1,1,n,p[i].c)>p[i].d) res[p[i].id]=1;
40     }
41     rep(i,l,mid) upd(1,1,n,a[i].c,0),tag[a[i].id]=0;
42 }
43 
44 int main(){
45     freopen("bzoj1790.in","r",stdin);
46     freopen("bzoj1790.out","w",stdout);
47     scanf("%d",&n);
48     rep(i,1,n) scanf("%d%d%d%d",&a[i].a,&a[i].b,&a[i].c,&a[i].d),b[i]=a[i].c,a[i].id=i;
49     sort(b+1,b+n+1); tot=unique(b+1,b+n+1)-b-1;
50     rep(i,1,n) a[i].c=lower_bound(b+1,b+tot+1,a[i].c)-b;
51     sort(a+1,a+n+1); CDQ(1,n);
52     rep(i,1,n) ans+=res[i]; printf("%d
",ans);
53     return 0;
54 }

免责声明:文章转载自《[BZOJ1790][AHOI2008]Rectangle 矩形藏宝地(四维偏序,CDQ+线段树)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[COGS2479 &amp;&amp; COGS2639]高维偏序(CDQ分治,bitset)[CTSC2018]混合果汁(二分答案+主席树)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

新的 EJB 3.1 概览文章

Ken 及专家组在使 EJB 3.1 更易于使用方面做得非常好,Ken 也一直在通过一些简短的说明使大家更容易了解它:[1 ]、[2 ]、[3 ]、[4 ]、[5 ]、[6 ]、[7 ]。Ken 最新添加的内容是示例概述 ,其中他概述了所有重要内容。 因此,如果您对 EJB 3.1 感兴趣的话,就参见 Ken 的概述 并在 GlassFish...

[置顶] VC++ 创建Windows服务

首先,附上Windows创建服务的源代码,这个很好用的,大家一般都是选择的这个使用。 #include"XXXX.h" //包含的头文件 //定义全局函数变量 void Init(); BOOL IsInstalled(); BOOL Install(); BOOL Uninstall(); void LogEvent(LPCTSTR pszFormat...

基于Web的IDE会成为主流?

作者 Dionysios G. Synodinos译者 张凯峰 发布于 2009年2月21日 上午6时33分 上周Mozilla发布了Bespin,这是一个基于web的编写代码的框架,而就在几天以后,Boris Bokowski和Simon Kaegi使用Eclipse无显示插件实现...

rm jspapi2.0.jar servletapi2.4.jar

mlzboy@mlzboy-virtualbox:~/workspace_temp/.metadata/.plugins/org.eclipse.wst.server.core/tmp3/wtpwebapps/book-web/WEB-INF/lib$ ls -al|grep api-rw-r--r-- 1 mlzboy mlzboy 299430 2012...

(4)原型模式Prototype

它是这样被定义的: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 就像有一份写好的简历样本,现在需要复制出N份只有名字或年龄不同其他都相同的简历,怎么做呢?原型模式就好比一台现实生活中的复印机。其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。复印机本身不知道所复印的内容,却一字不差地复印了出来。 原型模式的...

关于数据结构的思考

对于程序员来说有一句话是大家都知道的:程序=数据结构+算法。对于一些切切实实写过一些 代码的Coder来说,我们所做的编码无非就是对数据的操作,然而考虑到数据就必须对数据进行存储 可是,如何存储呢?在内存里嘛,但是数据是以什么样的形式存储的直接关系到我们对数据操作的 难易程度,从而直接影响到程序的效率。其重要性笔者就不在谈了,其实以笔者现在的水准来看只是 看...