技巧专题3(cdq分治、整体二分等)

cdq分治与整体二分

cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的)。

对于一个时间段[L, R],我们取mid = (L + R) / 2,分治的每层只考虑mid之前的修改对mid之后的查询的贡献,然后递归到[L,mid],(mid,R]。

整体二分就是将所有询问一起二分,然后获得每个询问的答案。CDQ相比整体二分略有不同,整体二分是按照答案进行分治。

cdq和整体二分适用范围:处理一些用数据结构(如树套树)做起来非常令人难受的题。需要离线。

很多时候需要还原修改操作。

推荐阅读:http://www.docin.com/p-950607443.htmlhttps://wenku.baidu.com/view/52f9c11cff00bed5b9f31d2d.html

 

update20180315:

CDQ分治

​ 抱歉上次因为能力不足没有讲清楚。

1 普通cdq分治(三维偏序问题)

​ 按照线段树的形态递归的CDQ分治,保证每一对三元组在线段树上都有且仅有一个LCA(这不废话吗),而这一组答案就会且仅会在LCA处计算。在每个LCA处,只计算左边的操作对右边的询问的贡献。

​ 具体做法:一维是用来当做"时间"分治(假设为a),一维是提前排好序的(假设为b),一维放在数据结构里面查询(假设为c)。 对于每一层cdq,我们二分一个时间mid,仍按照b的顺序依次处理,对于a<=mid的修改操作,我们放入数据结构在c位置修改,对于a>mid的查询操作,我们在数据结构里面根据c位置查询。这样我们就把a<=mid的操作对a>mid的操作的贡献全都算完了,然后把 a<=mid 和 a>mid 的操作分到左右两边,递归下去。

2 cdq套cdq(四维偏序问题)

​ 当维数为4的时候,因为多出来的一维,就只能先确定一维的大小关系,使这一维不会影响内层的cdq分治。

​ 具体做法:对于cdq1(外层cdq),我们二分一个mid,然后把b<=mid的修改操作和b>mid的查询操作拿出来,这个时候我们确定拿出来的这些操作,修改的操作的b一定小于查询的操作的b,那么b这一维我们就可以不管了,所以我们把他们按照a大小关系重新排序,然后直接做普通的cdq分治(内层cdq)。

3 cdq+凸包、cdq+半平面交、cdq+背包

​ cdq是一个思想,一个技巧,说白了就是用一维来分治,用一个log时间换取排除这一维的干扰,cdq可以套在乱七八糟的东西上,也没有固定的格式,最重要的是适合题目。

 

下面是原内容:

 

Mokia

维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.

  

动态逆序对

对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。

给1到n的一个排列,按照某种顺序依次删除m个元素.

你的任务是在每次删除一个元素之前统计整个序列的逆序对数。

$n \leq 1e5 , m \leq 5e4$

 

Partial Order (3D)

有N个人,每个人有三种能力值Pi,Qi,Ri。如果Pi>Pj && Qi>Qj && Ri>Rj,称I比J有能力.现在要求出最长的一个序列A=(A1,A2,…,At),满足Ai比Ai+1有能力。

$N \leq 4e4$

 

Simplified Partial Order(4D)

有N个人,每个人有四种能力值Pi,Qi,Ri,Si。
如果Pi>Pj && Qi>Qj && Ri>Rj && Si>Sj,称I比J有能力。
对每一个人,输出任意一个比他有能力的人编号,或声明没有人比他有能力。

 

Partial Order(4D)

有N个人,每个人有三种能力值Pi,Qi,Ri,Si。

如果Pi>Pj && Qi>Qj && Ri>Rj && Si>Sj,称I比J有能力。

现在要求出最长的一个序列A=(A1,A2,…,At),满足Ai比Ai+1有能力。

$N \leq 2e4$

  

天使玩偶

维护二维点集P,支持以下两个操作

(1)插入点(x,y)

(2)给定询问(x,y),求点集中离询问点最近的点

距离定义为曼哈顿距离Dis(P1,P2)=|x1-x2|+|y1-y2|

$N \leq 3e5$

 

Star(hdu5126)

在一个三维空间当中,每次进行一个操作,添加一个点或者统计空间中的某一个长方体范围内的所有点

$N \leq 5e4$

  

cash(noi2007)

小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称 A 券)和 B 纪念券(以下简称 B 券).

每个持有金券的顾客都有 一个自己的帐户.金券的数目可以是一个实数.

每天随着市场的起伏波动,两种金券都有自己当时的价值,即每一单位金券 当天可以兑换的人民币数目.我们记录第 K 天中 A 券和 B 券的价值分别为 AK 和 BK(元/单位金券).

为了方便顾客,金券交易所提供了一种非常方便的交易方式:比例交易法. 比例交易法分为两个方面:

A) 卖出金券:顾客提供一个[0,100]内的实数 OP 作为卖出比例,其意 义为:将 OP%的 A 券和 OP%的 B 券以当时的价值兑换为人民币;

B) 买入金券:顾客支付 IP 元人民币,交易所将会兑换给用户总价值为

IP 的金券,并且,满足提供给顾客的 A 券和 B 券的比例在第 K 天恰好为 RateK;

例如,假定接下来 3 天内的 Ak、Bk、RateK 的变化分别为:

时间

Ak

Bk

RAtek

第一天

1

1

1

第二天

1

2

2

第三天

2

2

3

 

 

 

 

 

 

 

假定在第一天时,用户手中有 100 元人民币但是没有任何金券. 用户可以执行以下的操作:

时间

用户操作

人民币(元)

A 券的数量

B 券的数量

开户

100

0

0

第一天

买入 100 元

0

50

50

第二天

卖出 50%

75

25

25

第二天

买入 60 元

15

55

40

第三天

卖出 100%

205

0

0

 

 

 

 

 

 

 

 

 

 

注意到,同一天内可以进行多次操作.

小 Y 是一个很有经济头脑的员工,通过较长时间的运作和行情测算,

他已经 知道了未来 N 天内的 A 券和 B 券的价值以及 Rate

他还希望能够计算出来,如 果开始时拥有 S 元钱,那么 N 天后最多能够获得多少元钱.

$N \leq 1e5$

  

MachineWorks

你的公司获得了一个厂房N天的使用权和一笔启动资金,你打算在这N天里租借机器进行生产来获得收益。 

可以租借的机器有M台。每台机器有四个参数D,P,R,G。

你可以在第D天花费P的费用(当然,前提是你有至少P元)租借这台机器。

从第D+1天起,操作机器将为你产生每天G的收益。在你不再需要机器时,可以将机器卖掉,一次性获得R的收益。

厂房里只能停留一台机器。不能在购买和卖出机器的那天操作机器,但是可以在同一天卖掉一台机器再买入一台。

在第N+1天,你必须卖掉手上的机器。

求第N+1天后能获得的最大资金。

$N \leq 1e5$

  

 

K大数查询

有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c(即一个位置可以没有数也可以有多个数)

如果是2 a b c形式,表示询问从第a个位置到第b个位置,第c大的数是多少。

操作1中$c \leq N$,操作2中$c \leq Maxlongint$

$N,M \leq 5e4$

 

Meteors

有n个国家和m个空间站,每个空间站都属于一个国家,一个国家可以有多个空间站。

所有空间站按照顺序形成一个环,也就是说,m号空间站和1号空间站相邻。

现在,将会有k场流星雨降临,每一场流星雨都会给区间[li,ri]内的每个空间站带来ai单位的陨石。

每个国家都有一个收集陨石的目标pi,即第i个国家需要收集pi单位的陨石。

询问:每个国家最早完成陨石收集目标是在第几场流星雨过后。

1<=n,m,k<=300000

  

Package

有N个物品,每个物品的重量是Wi,价值是Gi
每个物品只能取一个
给定Q个询问,每个询问由两个数(X,I)组成
给定最大容量为X的背包,使用除了第i件物品以外的所有物品,能够得到的最大价值之和

$N \leq 100 , X \leq 10000 , Q \leq 1000000$

  

Attack

chnlich非常喜欢玩三国志这款游戏,并喜欢用一些策略出奇制胜。现在,他要开始征服世界的旅途了。
他的敌人有N座城市和N个太守,N个城市可以看作在二维平面上的N个点。
N座城市的标号为0,1,2,……,N-1。
第i座城市的坐标为(Xi,Yi),镇守这座城市的太守的能力值为Zi。
chnlich每次会选择一个边平行于坐标轴的矩形区域,并奇袭其中太守能力值第K小的城市(奇袭结束之后城市与太守依然存在)。
不过,他的敌人经常会偷偷交换两座城市的太守,防止弱点被chnlich发现。
现在,chnlich想要知道,每次奇袭时他的敌人的能力值。

$N \leq 6e4$

 

 

 

参考资料:

http://blog.csdn.net/hbhcy98/article/details/50642773

http://blog.csdn.net/braketbn/article/details/51187181

http://www.cnblogs.com/lazycal/archive/2013/08/05/3239304.html

https://www.cnblogs.com/rootial/p/3950105.html

https://www.cnblogs.com/candy99/p/6441989.html

posted @   shixinyi  阅读(357)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示