题单题解

感觉只扔一个题单不太靠谱,再补一篇题解好了

题单

T1

一个普通的矩阵快速幂,如果做熟练的话看见这图的大小,这\(k\)的范围,矩阵快速幂无疑,主要是初始化难一点其实就是一个Floyd,初始化搞好之后直接就是一个裸的板子了。

T2

这道题的巧妙之处在于把数学问题转化为一个图论问题。先看操作一:如果有\((a_1,a_2)(a_2,a_3)(a_3,a_1)\),那么其中任意一个数都能自己加减二,如\(a_1\),\(a_1+1,a_2+1,a_2-1,a_3-1,a_3+1,a_1+1\)这样就能让\(a_1\)自己加减二,同理\(a_1\)换成任何数都可以,这里要注意,必须是奇数个点并且形成环才能这样办,所以每个奇数环上的数都能加减二,偶数个点为什么不行自己举个例子就明白了。再看操作二:如果有\((a_1,a_2)(a_2,a_3)\)那么可以知道\((a_1,a_3),a_1+1,a_2-1,a_2+1,a_3-1\)由此,\(a_1+1,a_3-1\),可见操作二是具有传递性的,如果把它们看做是一个联通块,那么这个联通块可以任意加1,减1,所以如果这个联通块需要加的值和需要减的值一样,那么就满足。于是我们只要把每个操作二都缩成点,每个操作一建边,然后开始判断每块联通块是不是满足题意。
判断方法为,如果未形成奇数环,即是二分图,则需要使联通块内相加的数与相减的数相等,因为只能加一减一,否则使需要变化的总数是偶数即可,注意自环也要判断,因为自环相当于\((a_1,a_2,1)(a_1,a_2,2)\)\(a_1+1,a_2+1,a_2-1,a_1+1\),这样也能使任意数加减二,然后还有就是对于没有边连入的点,只有需要变化的值为0,才满足,因为没有边可以使它产生变化。

T3

简单的tarjan,注意到边是单向的,所以要么处在环上,可以一直走到它没办法产生蘑菇为止,要么只能走一次,所以把环上的边都缩到一起并让蘑菇一直再生直到为0能要为什么不要

T4

挺裸的分层图吧,建立\(K\)张图,然后跑最短路算法就行,这个思想感觉挺重要的

T5

\(K\)短路模板,为了要让方式数最多,贪心的去想,一定是每次取用花费最小的方案,所以跑一个\(K\)短路就行了,不过这题后来被卡了,所以要么特判要么就可持久化左偏树

T6

对于每个板子,有两个操作,然后想要从对角线的一端走到另一端的话,要么花费为0,不需要旋转,要么花费为1,需要旋转,可以建图跑最短路,不过效率不高,因为边权只有0和1,所以可以用双端队列BFS,当前边为0,从前边塞进去,为1,从后边塞进去,这样可以保证最近的一定在前边走

T7

显然是一个\(K\)短路,相信你们可以切了

T8

LCA的题目,模拟一下发现如果两条路径有交集,那么一定有一条路径的LCA在另一条路径上,而判断一个节点x,是否在路径s-t上需要满足
deep[x]>=deep[LCA(s,t)]
LCA(s,x)=x或LCA(t,x)=x,判断一下就行

T9

因为打标记后维护父亲节点比较难维护,尤其是并查集维护需要路径压缩,这就更是难上加难,但是合并操作却是十分容易,于是可以直接时光倒流,从后往前处理,离线搞一下就行。

T10

啊,树剖的板子不再解释了

T11

不难发现这是一棵树,然后它就又成了裸的树剖。。。。。。不小心放了两道板子

T12

看了题之后又说是树剖板子??再仔细看看,这次是在边上修改,好吧,和之前其实也差不多,只是需要特殊处理一下,把边权压到点上,考虑到每条边只连了一个儿子,所以把边权压到儿子上,而不是父亲,如果是父亲的话就会出现多条边打架的情况,所以不行。
修改和查询的时候注意在最后需要将路径一端的\(dfn+1\),因为这个点的点权是它与它父亲连边的边权,所以不能处理

T13

乍一看没有什么思路,但是一看数据会发现这要么是树,要么是基环树,基环树断掉一条边就是一棵树了,所以直接贪心的去跑一下就行,注意比较答案的时候要小心,字典序最小

T14

因为\(mod\)不为质数所以不能求逆元,考虑特殊性质,每个操作最多只被整除一次,所以可以开一棵线段树,然后转化为乘法操作即可

T15

 这道题的意思应该是在\(l\)\(r\)的区间内找出有多少个好的配对,这里好的配对是对于整个区间来说的,既然是对于整个区间,我们就不难想到找出好的配对的方法,所以我们可以先找出所有好的配对,然后用树状数组维护个数。
 
  如何找出好的配对呢?我们先来分析什么叫好的配对,选定的两点间距离比其中一点到除对方外任意一点的距离都小,也就是说这两点差的绝对值最小,这样的话,这两个点在\(sort\)排序后一定相邻,这个很好推出,于是我们只要考虑这个点的另一个配对是左边的点还是右边的点,写一个判断就行了,注意特判\(1\)\(n\)
  找出好的配对来,就又向答案接近了一步,现在我们只要进行更新就行了,这里的更新我们枚举左端点,上一步我们已经求出了好的配对\((l,r)\)如果查询的左端点在\(l\)的左边,那么从\(r\)开始向右就一定至少存在一个好的配对,所以让树状数组中的\(r\)对应的位置更新就行。注意我们要倒序枚举左端点,因为我们加入\(r\)后所产生的配对只能是在询问区间包含\(l\)的情况下才有效。

T16

线段树合并的板子,如果只有一种救济粮的话直接树上差分做就行了,可是这个有很多种救济粮,于是需要用一个可以合并的东西统计一下,权值线段树就能很好的做到这一点,记得动态开点。

T17

只需要考虑跨越子树的逆序对,因为在同一棵子树中的逆序对会在递归时被处理,如果对每一个点开一棵权值线段树的话,那么它子树中的逆序对为左子树的权值线段树的右子树大小乘右子树的权值线段树的左子树大小,可能有点绕,最开始被这里卡了,仔细想想也不是很难

T18

很显然,修建操作相当于合并两棵权值线段树,询问就是一个简单的查询,记得套一下并查集

T19

仍旧是权值线段树的问题,每次从叶子节点开始往上递归做一下就行,不过题意可能有点小坑,它的意思应该是先找到最多的颜色有多少个,然后把颜色个数是这个的编号都加起来当作这个点的答案

T20

可以很容易的发现一个小性质,收养所里不会同时有宠物和领养人,不然不管他们俩多不配都要配对在一起,所以只需要维护一个Splay就行,每次查找前驱和后继,比较哪个更优,不过易错点是如果前驱是-INF,那减掉前驱就会爆int然后出现错误,可以特殊处理一下

T21

裸的线段树了吧算是,不过。。。区间修改有两个,需要注意一下优先级,如果有覆盖标记的话在取反时应该优先给覆盖标记取反

T22

啊这题最正常的写法应该是强联通分量缩点,不过可以用bitset传递闭包一下,\(N^2\)的时间复杂度也可以而且好写

T23

这题的思维含量感觉挺高的,有的人想到了怎么做但是不会维护,有的人知道用什么维护不知道怎么做,首先要知道任取三个点,符合题意的最大半径是多少。

先考虑三点不共线的情况,由数学知识可以知道这三点能构成一个三角形。
因为三个圆最多只能相切,所以最大的直径就是最小的边。

三点共线的时候是一种特殊情况,但也和这个一样,最大的半径是任意两点间的最小距离的一半。

所以这个问题就简化成了,找出三个点连成三条边,使得这三条边中的最小值最大。这个比较好解决,把边权从大到小排一边序,当第一次有三个点连通时输出答案就行。

下面就是怎么判断三点是否连通,直接枚举三个点的话肯定会T掉,这时我们就要用到暴力神器\(bitset\)\(bitset\)存储二进制的状态,用第\(i\)\(bitset\)的第\(j\)个二进制位表示\(i\)\(j\)是否连通,然后我们枚举边,设边的起点为\(u\)终点为\(v\),如果能找到第三点\(k\)使得\(u\)\(k\)连通,\(v\)\(k\)连通,那么加上这条边的时候,这三点就连通了,否则把相应的二进制位设置成1。看起来很繁琐但是\(bitset\)的两个函数\(count\)\(set\)能帮助我们很好的解决问题,前者的作用看名字就能看出来,\(set\)是将某位置设置成1,于是此题得解。

T24

裸的整数划分,但是一看见数据范围可能就挂了,需要用一下别的数学知识,众所周知数学是降低时间复杂度较好的方法之一,于是用五边形数定理,五边形数的生成函数的项数是\(\sqrt n\)的,所以可以在\(N\sqrt N\)的时间复杂度内解决该问题。

T25

讲真的我感觉可以打表找规律,一颗星星给的是证明过程。。。

T26,27,28

线性基基础

T29

看到异或,又看到可以选可以不选,于是不难想到用线性基,因为这是一棵树并且有多组询问,所以每次询问至多是\(log\)级别的,假设问两个点之间的距离怎么搞?用倍增\(lca\)搞一下就行,这个其实也一样,换成倍增线性基就可

T30

发现一个性质,如果走到一个环上走一圈再走回来,只有这个环上的权值可以被统计到答案,因为走向环的路径被走了两次直接异或掉了,所以把所有的环都扔到线性基里然后随便选一条从\(1\)\(n\)的路径在线性基里取异或最大值了。

T31

同上,改成最小值了而已。。。。

T32

线性基强烈推荐此题

注意到什么样的数可以成为某个整数的平方,当且仅当它分解质因数为\(p_1^{c_1}p_2^{c_2}p_3^{c_3}……p_k^{c_k}\)后,对任意\(c_i\),都是偶数。所以其实对于每个数对答案的贡献来说,只有0和1两种,即考虑质因子的奇偶性,又因为这每个数最大也就是\(70\),所以可以把每个数都压成一个二进制数扔到线性基里边,最后的答案就是插入线性基能被异或成0的数的集合大小,把模型抽象出来就十分好写了。

T33

emm凸包其实,没什么可以说的,主要是利用叉积来判断一下就行,其实有用的也就正逆顺负这四个字,自己百度叉积看看吧。。

T34,T35,T36,T37,T38,T39,T40

简单的莫比乌斯练手题,

猜你喜欢

转载自www.cnblogs.com/anyixing-fly/p/13399801.html
今日推荐