zoukankan      html  css  js  c++  java
  • 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$序,支持区间加减、区间最大值即可。

  • 相关阅读:
    作业九 ——报告及总结(6.16更新)
    作业八:团队项目——Alpha阶段项目总结
    作业七:团队项目——Alpha版本冲刺阶段
    作业六:团队项目——编写项目的Spec
    作业五:团队项目——项目启动及需求分析
    作业四: 结对编程项目---四则运算
    作业三: 代码规范、代码复审、PSP
    Selenium WebDriver-网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作
    python 爬虫,起点完结榜前100榜单
    网络基础2之物理层
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11517055.html
Copyright © 2011-2022 走看看