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$时,直接算。
当$k\ge 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】基础数据结构练习题
一个数列,三种操作:
- 对于所有的$i \in [l..r]$ 将$a_i$变成$a_i+x$
- 对于所有的$i \in [l..r]$ 将$a_i$变成$\lfloor \sqrt{a_i} \rfloor$
- 对于所有的$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!(线段树)
看到题目眼前一亮,结果果然很简单。
和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$序,支持区间加减、区间最大值即可。