2019-9-13做题记录

1、【BZOJ2115】Xor(线性基)

给一个无向联通图,边有边权,求从$1$到$n$异或和最大的路径。

$yyb$的做法和我的一样,然而我不会证明。

$dfs$的过程中,分别考虑简单单位环(返祖边所在的环)的贡献和路的贡献。环的贡献扔到线性基里,然后把$1~n$的路径的贡献丢到线性基里求最大就行了。

2、【BZOJ4568】幸运数字(线性基,ST表)

多次询问从$x$到$y$上所有边权形成的集合,子集中异或值最大是多少。

神仙操作:合并线性基。暴力,复杂度两个$log$

然后用$ST$表搭配$LCA$查询。(注意,不要在$LCA$的过程中跑,因为可以重叠的,这样会多个$log$)。

3、【BZOJ3105】新Nim游戏(线性基)

新$Nim$游戏:本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴。可以一堆都不拿,但不可以全部拿走。第二回合也一样,第二个游戏者也有这样一次机会。从第三个回合(又轮到第一个游戏者)开始,规则和Nim游戏一样。

我连$Nim$游戏都不会,还给我出新$Nim$游戏。

先$yy$一下$Nim$游戏:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同)。两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴。可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿。拿走最后一根火柴的游戏者胜利。

当火柴堆的异或和为$0$时,后手必胜,反之,先手必胜。

那这道题就很显然,就是让你选择和尽可能小的数,使得剩下的数的任意子集的异或和不为$0$,从大到小排序之后,依次插入线性基中贪心的选即可。

4、BZOJ3563/BZOJ3569】DZY Loves Chinese I/II(随机化,线性基)

神仙题,我是显然不会的(都都读不懂,只能看题解了)

题意:每次询问给定若干边,求把他们删去之后图是否连通,强制在线。

如果不强制在线,我们可以用$CDQ$分治/线段树分治(我认为应该叫线段树分治,但是他们都说是$CDQ$分治),边分三类,两边都没有的,一边有的,两边都有的,每次向一边走就把只有另一边有的边加上去,用个并查集维护,只用启发式合并并且记录$fa$数组的更改,形成一个回溯栈,一个询问结束就直接退栈,然后把另一边删去的边加进去。见【AHOI2013】联通图。

对于强制在线的情况,我们拎出来一棵生成树,如果不连通,相当于这棵树不连通,并且所有的子树里所有的返祖边和横批边都没有了。我们把每个非树边随机一个值,生成树上的边为覆盖了它的所有非树边的权值,如果他们同时没了,则肯定信息是冗杂的,用线性基判断即可。

正确性显然,就是不知道成功率怎么样。。。。。我单知道的是用$long long$能加大成功率。

5、BZOJ4004】装备购买(线性基)

给定$n$个向量$(a_{i1},a_{i2},a{i3}...,a{im})$,每个向量有一个价值,选出一些向量,使得价值最小且可以用自己之间的线性变换表示任意一个向量。

线性基推广到一般情况,用高斯消元模拟线性基$+$贪心即可。

6、BZOJ1923】外星千足虫(线性基)

据说和上一题差不多,题面就不写了。

$bitset$压位$+$逐位维护线性基。

7、BZOJ4184】shallot(线段树分治,线性基)

三个操作:

1、集合中加元素
2、集合中删元素
3、询问集合子集的异或最大值

每个数在集合中出现的时间形成一个区间,离线,用线段树分治维护即可。

8、【CF938G】Shortest Path Queries(线段树分治,并查集,线性基)

给出一个连通带权无向图,边有边权,$q$个操作。

1、在$x$和$y$间加权值为$b$的边。
2、删掉$x$和$y$之间的边
3、询问$x~y$的异或最短路。

保证任意操作后原图连通无重边自环且操作均合法

$n,m,q le 200000$

还是第一题的套路。环的关系塞到线性基里去。

我一开始想用$LCT$维护,但是会删掉非树边,所以就假了。所以只能用线段树分治维护。

查最小值正如我们猜测的那样,从大到小一路$min$过去就可以了。

9、BZOJ1299】巧克力棒(博弈论,线性基)

题面:两个人用一盒巧克力棒玩游戏。每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度。两人轮流,无法操作的人输。问谁赢谁输。

最讨厌遇到博弈论的题了,因为我不会。

如果一上来就全取出来,就变成一个$Nim$游戏了,所以如果异或和为$0$,先手肯定一上来先全取出来。

拓展到一般情况,我猜如果有冗杂的信息,则先手必胜,赌一包辣条。

看了$yyb$的代码,发现就是这样。哈哈哈。

证明?我也不知道。

10、【BZOJ3811】玛里苟斯(线性基)

题面:求给定的可重集$S$中随机取出一个子集的异或和的$k$次方的期望。保证最后答案小于$2^{63}$

留到后面做。

当$k=1,k=2$时,直接算。

当$kge 3$时,加入线性基,暴力枚举可能的情况。

11、【LOJ#6060】Set(线性基)

给出$n$个非负整数,将数划分成两个集合,记为一号集合和二号集合。$x_1$为一号集合中所有数的异或和,$x_2$为二号集合中所有数的异或和。在最大化$x_1+x_2$的前提下,最小化$x_1$。

先把所有的数异或起来,记为$x$,这就是$x_1 oplus x_2$,从大到小考虑,要是$x$当前位上是$1$(奇数个$1$),我们想把它分给$x_2$,如果偶数个$1$,我们想都分奇数个,那现在的问题是,这样可行吗?

线性基中$0$和$1$是同等地位的,我们只需把某些位上$0$的优先级比$1$大就可以了。

12、【luogu3733】【HAOI2017】八纵八横

初始时,八纵八横计划中不包含任何—条高铁,有以下3种操作

Add x y z:在计划中给在城市x和城市y之间建设一条高铁,其经济影响因子为z,如果这是第k个Add操作,则将这条高铁命名为k号高铁

Cancel k:将计划中的k号高铁取消掉,保证此时k号高铁一定存在

Change k z:表示将第k号高铁的经济影响因子更改为z,保证此时k号高铁一定存在

原题鸽,见8。

13、【luogu4839】P哥的桶

$aysn$推荐的神仙题。

线段树维护线性基即可。复杂度应该是三个$log$。

所以洛谷网络赛那道题$4$个$log$一点都不神仙,多个树链剖分的$log$而已

14、【BZOJ4538】【HNOI2016】网络

服务器之间形成一个树的结构。三个操作:
1.  在某两个服务器之间出现一条新的数据交互请求;
2.  某个数据交互结束请求;
3.  某个服务器出现故障,求未被影响的请求中重要度的最大值。

$yyb$两年之前就写的题,他那时候说的是“形式上的线段树”,若是他现在重看,肯定会说是线段树分治的。

显然,树链剖分,一个节点维护一个可删堆($set$也行,就是慢),就是线段树分治的思想。

查询的时候一条链查下来就可以了。

15、【BZOJ2243】【SDOI2011】染色

树链剖分维护色段数(为了和维护颜色数区分,我取了这个蹩脚的名字)

很显然,每个节点维护颜色数,左颜色,右颜色即可,这样就支持合并了。

16、Luogu1937】仓配置(贪心,线段树)

一个奶牛对空间的需求是一个区间的形式,一个地方能保留的奶牛有限制,问让尽可能多的奶牛满意。

右端点排个序(为什么右端点?我的理解是尽可能保留未考虑部分的完整),能选就选,然后上线段树维护每个地方的剩余位置,区间减和区间查最小值。

17、【SHOI2012】魔法树(树链剖分,线段树)

据说是树链剖分模板题,我就不看了。

18、Luogu3398】仓鼠找sugar(树链剖分)

树上给两条链,问他们相不相交。

一次修改一次查询,每次重新清空(顶打清空标记)即可。

19、BZOJ3531】旅行(树链剖分,线段树)

竟然被这道题卡住了,身败名裂。

城市和城市之间形成了一棵树,每个旅行者只走自己经过的城市,维护这些操作:
CC x c:城市x的居民全体改信了c教;
CW x w:城市x的评级调整为w;
QS x y:一位旅行者从城市x出发,到城市y,求途中留宿过的城市的评级总和;
QM x y:一位旅行者从城市x出发,到城市y,求途中留宿过的城市的评级最大值。

一开始想的做法是$LCT+$虚树,但是特别麻烦。

看了题解发现是对每个颜色开一个动态开点线段树,维护树链剖分的信息,需要的时候直接查需要的那棵树就行了。

说明窝知识点还是不全面啊。

重新想一下,各个颜色间的操作是互不干扰的,动态开点线段树应该是不难想到的。

再仔细想想:树链剖分和$LCT$都能在一定程度上互相代替,只是以不同的方法罢了。

20、【luogu1471】方差(线段树)

询问区间平均值、区间方差,操作区间加。

显然要维护区间和、区间平方和,修改的话,区间和直接加,区间平方和用自己和区间和和$k^2$直接推。

21、【BZOJ1018】堵塞的交通(线段树)

$aysn$讲过的神仙题,可以用线段树分治、也可以用线段树在线做。

我不想$yy$线段树在线做法了。。咕了。

21、【BZOJ4869】相逢是问候(线段树、欧拉定理)

一个数列,两个操作。

  • 区间赋值为$c^{a_i}$
  • 区间求和

所有的操作只是一个$c$。

我们想,要是$a_i$全是$1$就好了,这样它们就能全变成$c$了,

要是$a_i$全是$phi(p)$也很好,这样它们都变成$1$了。

所以,很自然的想到,对于每个$a$,可能有一个不动点,使得$c^a=a (mod p)$,联系$aysn$神仙题“上帝与集合啥来着”(那道题我竟然咕到了上周五才学会),应该会是有的,所以直接上拓展欧拉定理求出不动点,然后暴力,用线段树维护不动点的位置就行了。

22、【POJ1151】Atlantis(线段树,扫描线)

听$yyb$说是扫描线求矩形交,$zhhx$说这应该是不用学就会的知识点,那我就不$bb$了。

23、BZOJ4552】排序(线段树,二分答案)

一个序列,两个操作:

  • 区间升序排序
  • 区间降序排序

最后询问第$q$位置的数。

直接二分第$k$位置的数是$mid$,然后把$le mid$的都看做$1$,把$> mid$的都看做$0$,然后排序的操作我们就可以用区间赋值代替。最后只要看看最后的$q$位置是$0$还是$1$,如果是$1$,说明可以或者$mid$小了,如果是$0$,说明$mid$大了。

24、【UOJ#228】基础数据结构练习题

一个数列,三种操作:

  1. 对于所有的$i in [l..r]$ 将$a_i$变成$a_i+x$
  2. 对于所有的$i in [l..r]$ 将$a_i$变成$lfloor sqrt{a_i} floor$
  3. 对于所有的$i in [l..r]$ 求$sum{a_i}$

北京的神仙老师讲过,至今难忘。。。

就是把开根看做是减法,不同的值域区间会很少,然后很多次之后系统的“熵”?“势能”?就会减小,也就是说,数字会趋于相同。

然后维护开根后会相同的区间就好了。

25、【BZOJ1558】【JSOI2009】等差数列

一个序列,两个操作:
1、区间$[l..r]$加等差数列$bx+a$
2、询问$[l..r]$能至少划分成几段,使得每一段都是等差数列。

一个等差数列,差分一次变成常数列,差分两次变成$0$。

维护差分两次的数列,加等差数列看成加点修改、查询看成最多的连续$0$的长度。

26、【BZOJ2962】序列操作(线段树)

有一个长度为n的序列,有三个操作
1.$I a b c$表示将$[a..b]$这一段区间的元素集体增加$c$,
2.$R a b$表示将$[a..b]$区间内所有元素变成相反数,
3.$Q a b c$表示询问$[a..b]$这一段区间中选择$c$个数相乘的所有方案的和$mod 19940417$的值。

注意到$Q a b c$中$c$是比较小的,我们可以只维护区间和、区间平方和来得到一个使用组合数的$O(n)$推“选$i$个数相乘的所有方案之和”的式子。

27、【BZOJ1858】【SCOI2010】序列操作(线段树)

$0 a b$把$[a..b]$区间内的所有数全变成$0$
$1 a b$把$[a..b]$区间内的所有数全变成$1$
$2 a b$把$[a..b]$区间内的所有数全部取反,也就是说把所有的$0$变成$1$,把所有的$1$变成$0$
$3 a b$询问$[a..b]$区间内总共有多少个$1$
$4 a b$询问$[a..b]$区间内最多有多少个连续的$1$

这道题的所有操作我们在之前都讲过,就不再赘述了。

28、【BZOJ1835】序列操作

留到后面做。

线段树维护$dp$的操作,应该是一类问题的解决方案。

29、BZOJ4999】This Problem Is Too Simple!(线段树)

给您一颗树,每个节点有个初始值。
现在支持以下两种操作:
1. $C i x(0 le x <2^{31})$ 表示将i节点的值改为x。
2. $Q i j x(0le x <2^{31})$ 表示询问i节点到j节点的路径上有多少个值为x的节点。

看到题目眼前一亮,结果果然很简单。

和19题是一样的。多加一个离散化。离线或是用$map$。

30、【BZOJ4991】我也不知道题目名字是什么(线段树)

给定一个序列$A[i]$,每次询问$l,r$,求$[l..r]$内最长子串,使得该子串为不上升子串或不下降子串。

维护左、右、左延伸的长度、右延伸的长度、最长的长度,$yy$一下合并操作就可以了。

31、【BZOJ2733】永无乡

现在有两种操作:
$B x y$表示在岛$x$与岛$y$之间修建一座新桥。
$Q x k$表示询问当前与岛$x$连通的所有岛中第$k$重要的是哪座岛,即所有与岛$x$连通的岛中重要度排名第$k$小的岛是哪座,请你输出那个岛的编号。

线段树合并模板题。

32、【BZOJ4817】树点涂色(LCT,线段树,树链剖分)

一棵树,三个操作。
定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色。
1 x:把点x到根节点的路径上所有的点染上一种没有用过的新颜色。
2 x y:求x到y的路径的权值。
3 x:在以x为根的子树中选择一个点,使得这个点到根节点的路径权值最大,求最大权值。

一种颜色只会分布在根和一点的连线中,所以直接按“数区间颜色块”的方法数颜色即可。

对于$3$操作,每次修改把祖先的权变成$0$,把自己的变成$1$,就是求一个最大的到根权值最大的点,维护第一类$dfs$序,支持区间加减、区间最大值即可。

原文地址:https://www.cnblogs.com/shxnb666/p/11517055.html