11月做题记录
11月做题记录
✩ trick
✯ 会大部分,要\(tj\)提示
✬ 会小部分/完全没想到,看了\(tj\)才会
◈ 脑电波
✡ 有某一算法的神秘通用性质
⊗ 待补
- 11月做题记录
- AGC068D Sum of Hash of Lexmin ✯✩
- AGC068E Sort and Match ✩✬
- CF494C Helping People ✯
- ARC105E Keep Graph Disconnected
- P5147 随机数生成器 ✡
- CF1168D
- P2041 分裂游戏 ✩
- CF2013F2 Game in Tree (Hard Version)
- CF536D Tavas in Kansas
- 基础 ABC 练习题 ✬✩
- 树数叔术
- 环上排序信息最优分割 ✬
- Désive ✯
- 幽默还是夢 ✬✩
- ARC100E Or Plus Max
- iai 运输
- CF383E Vowels
- P10743 [SEERC2020] AND = OR
- CF1120F Secret Letters
- CF2031F Penchick and Even Medians
- UR28B 环环相扣 ✬
- P3206 [HNOI2010] 城市建设
- P4075 [SDOI2016] 模式字符串
- P5297 [北京省选集训2019] 完美塔防
- P3825 [NOI2017] 游戏
- P2
- 口胡题 ✬
- P5244 [USACO19FEB] Mowing Mischief P
- CF1100F Ivan and Burgers ✯✡
- ARC188D Mirror and Order ✯✩✡
- 【GDOI2018 day2】巡逻
- P6175 无向图的最小环问题
- [省选联考 2021 A 卷] 矩阵游戏
- [CTSC2017] 吉夫特
- 「SDOI2013」淘金
- 「THUPC2018」城市地铁规划 / City
- [SDOI2012] 基站建设
- 「SHOI2015」超能粒子炮·改
- 「SHOI2017」期末考试
- Gym 104925C Yet Another Balanced Coloring Problem
AGC068D Sum of Hash of Lexmin ✯✩
很典的题啊,就最后那个优化没见过,似乎也有点印象?算了不管
显然合法的排列\(x\)只需要满足\(x_{i+1}\)不是\(x_i\)的祖先即可
显然容斥,若只求方案数,若\(x_{i+1}\)是\(x_i\)的祖先,那么在两点间连一条边,这样序列就变成了一条条的链,树上也是一条条的链,枚举至多\(i\)条链,求出方案数\(f(i)\),答案即为\((-1)^{n-i}f(i)(n-i)!\)
考虑\(dp[x][i]\)表示\(x\)的子树内有\(i\)条链的方案数,先背包合并子树的\(dp\)值,再考虑是否钦定\(x\)有连边,若有,\(dp'[x][i]\times(sz[x]-1-i)\rightarrow dp[x][i]\),不钦定就是\(dp'[x][i]\times(sz[x]-i)\rightarrow dp[x][i+1]\)
要容斥不能直接算就是因为合并子树的链的时候,可能会出现原本能连边的被分隔开导致不存在这条边
考虑价值的计算,显然可以给它拆开来,考虑计算\(x_i=p\)时的系数和,显然此时需要分开记录\(p\)左边和右边的信息
设\(f[x][i][j]\)表示在\(x\)的子树中,\(p\)左侧至多\(i\)条链,右侧至多\(j\)条链
若\(x\)包含了\(p\),那么不把和\(p\)所处的那条链算进\(i\)或\(j\)中,因为这样的话转移的过程中相当于会忽略\(p\)所处的链,那么转移的时候要乘系数\(C_{i_1+i_2}^{i_1}\),\(j\)同理
单个\(p\)的复杂度是\(O(N^4)\)的,总的就\(O(N^5)\)的了,发现不同\(p\)转移的过程很多点都相同,考虑优化状态,考虑再开一维\([0/1]\)表示\(p\)是否在\(x\)的子树中即可
总复杂度\(O(N^4)\)的
AGC068E Sort and Match ✩✬
woc,这咋想到建图的啊,不对,好像确实也挺建图的
考虑对于一对\((x_i,y_i)\),\(i\)从\(1\)到\(m\),依次连边\(y_i\rightarrow x_i\)(即边有顺序),发现这样每个连通块是一个欧拉回路且图和序列构成双射
那么计数欧拉回路即可
为了避免算重,考虑这样一种走法:枚举\(st\)从\(1\)到\(n\),从\(st\)出发走当前剩下的编号最小的边,一直直到回到\(st\)为一轮,这样的走法和图同样可以建立双射
发现要求\(x_1=k\)即要求第一条边是连向\(k\)的,那么倒着\(dp\)即可
考虑怎么计数,发现边的顺序是有用的,这样就很好,那么设\(f_{i,j}\)表示用了\(i\)条边,遍历完了\([i,n]\)为起点的欧拉回路的答案,转移再用一个\(g_{i,j}\)表示用了\(i\)条边,走到点\(j\)的方案数
复杂度\(O(N^3M)\)
CF494C Helping People ✯
想不出\(dp\)状态,没蚌埠
显然这个只包含不相交的形式可以简化成树,可以一开始塞一个询问\((1,n,0)\),这样就能把森林合并成树了
考虑树上\(dp\),设\(dp[i][j]\)表示\(i\)子树内最大值\(\leq j+mx[i]\)的概率,其中\(mx[i]\)表示\(i\)子树内的最大值
复杂度\(O(N\log N+M^2)\)
ARC105E Keep Graph Disconnected
显然终态是两个完全图,一个包含\(1\),一个包含\(n\),那么答案根据\(\frac{n(n-1)}2-m-x(n-x)\)的奇偶性确定,其中\(x\)表示\(x\)所属连通块的大小
显然当\(n\)为奇数时,\(x(n-x)\)是偶数,那么就直接看\(\frac{n(n-1)}2-m\)的奇偶性即可
当\(n\)为偶数时,考虑初始\(1\)连通块的大小\(sz\),考虑\(sz\)初始的奇偶性是否是先手想要的,如果不是,显然先手会给\(sz\)加上一个奇数的连通块,发现此时,如果后手还有可用的奇数块,那么后手也会给\(sz\)塞一个奇数的连通块,这样循环,如果奇数块有偶数个即初始时\(1\)所在的\(sz\)和\(n\)所在的\(sz\)的奇偶性相同,那么此时后手胜,如果有奇数个奇数块,显然此时先手必胜;如果是先手想要的,那么先手第一步一定不会给\(1\)的块塞奇数块,还是考虑有偶数个还是奇数个,如果有偶数个,此时显然必胜,如果有奇数个,先手第一步给\(n\)个块塞一个奇数块,然后发现此时后手给谁塞奇数块先手就可以同样给谁塞,即后手的操作抵消了,那么也是先手必胜
复杂度\(O(M+N\alpha(N))\)
P5147 随机数生成器 ✡
列式有\(E(n)=1+\frac 1n\sum_{i=1}^nE(i)\),化简得\(E(n)=\frac n{n-1}+\frac1{n-1}\sum_{i=1}^{n-1}E(i)\)
边界是\(E(1)=0\),求\(S(n)=\sum_{i=1}^n E(i)\),可以得到\(S(n)=\frac n{n-1}(S(n-1)+1)\),可以发现\(S(n)=n\sum_{i=1}^{n-1}\frac 1i\),那么\(E(n)=1+\sum_{i=1}^{n-1}\frac 1i\)
然后\(n\)小的时候直接线性求了,\(n\)大的时候有\(\lim_{n\rightarrow +\infty}(\sum_{i=1}^n\frac1i-\ln n)=\gamma\approx0.577215664901532860606512090082402431042159335\)
CF1168D
合法的情况,就是记\(mx[x][c]\)表示\(x\)的子树内最多的从\(x\)到叶子的路径中\(c\)的数量,要求\(\sum_cmx[x][c]\leq dep_x\)即可,这里的\(dep_x\)表示\(x\)到子树内叶节点的距离,显然要求叶节点的深度全部相同
颜色\(c\)的答案就是\(dep_{root}-\sum_{i\neq c}mx[root][i]\)
发现对于只有一个儿子的点可以和它的儿子缩成一个点,发现缩点后的深度是\(O(\sqrt N)\)的,考虑贪心卡慢一个点的深度,向上跳的过程发现它另一侧兄弟子树的大小是\(1,2,3,...,\sqrt N\)
那么暴力向上跳的修改即可,复杂度\(O(Q\sqrt N)\)
P2041 分裂游戏 ✩
设左下角是\((0,0)\),若棋子在\((x,y)\),那么给它值为\(2^{-x-y}\),那么显然适中都有所有棋子的值之和为\(1\)
于是可以发现,当\(n\geq4\)时,就算我们把非阶梯外的格子都取满都有和\(<1\),\(n=3\)手算无解
那么只有\(n\leq2\)有答案,输出就行了
CF2013F2 Game in Tree (Hard Version)
咋金牌题啊,\(luogu\)紫题差不多得了
考虑单点询问\(u\)怎么做,提出\(1\rightarrow u\)上的点标记,那么先后手的路径一定是先走一些标记点再走一些非标记点
算出每个标记点只走非标记点能走的最长距离
那么考虑枚举最后一个标记点,设先手先脱离标记点,此时先手在\(x\),后手在\(y\),那么此时后手脱离的点可以在\(y\rightarrow x\)(不包含\(x\)),算出这些里面后手能走的最大距离即可,设先手此时走的最长距离是\(A\),后手是\(B\),\(A>B\)则先手胜,否则后手胜
中点要特殊处理一下
分别求出先手最早胜的点和后手最早胜的点,然后谁距离初始点\(1/u\)更近,最终就是谁胜
现在询问的是一条路径\(u\rightarrow v\),显然可以拆成\(u\rightarrow lca(u,v)\)和\(lca(u,v)\rightarrow v\)两条链来处理
那么现在只需要处理一条竖直的链的问题,可以直接拓展为处理\(1\rightarrow u\)和\(1\rightarrow v\)的问题
还是考虑上面的思路,枚举\(1\rightarrow u\)上的一个点能作为先手胜的点时,哪些点作为后手合法,显然此时的后手是一段前缀(具体的,是合法区间内的一段前缀,这里的合法区间指的是这个区间内的点作为后手能使得当前考虑的这个点不处于中点之后,显然会是原本的一段后缀),再考虑枚举一个作为后手胜的点时,哪些后手合法,显然是一段合法区间的后缀
具体要得到这个区间的话,就单调栈、线段树啥的糊上去就行了,维护方法应该有多种吧?
最后查询的时候对每个点看对应的最早先手胜和最早后手胜点谁更早即可
复杂度\(O(N\log N)\)
CF536D Tavas in Kansas
这黑锤子啊?
求出\(s\)和\(t\)到各点的最短路然后离散化,\(dp[i][j][0/1]\)表示先手是\(s/t\),\(s\)目前扩展到距离\(s\)第\(i\)小的点,距离\(t\)第\(j\)小的点时,先手的最大值
复杂度可以\(O(N^2)\)
基础 ABC 练习题 ✬✩
先考虑怎么判断确定的\(s\)是否合法,考虑枚举 ABC和 BCA的数量,然后也可以确定 CAB的数量,设它们分别为\(a\),\(b\),\(c\)
考虑怎么分配字符,发现对于第一位最优肯定是把前\(a\)个 A给 ABC,前\(b\)个 B给 BAC,前\(c\)个 C给 CAB,对于第二位和第三位也有此贪心策略,反证即可
考虑如果确定了\(a\),\(b\),\(c\),怎么计数,设\(p_{A,i}\)表示第\(i\)个 A的位置,\(p_{B/C,i}\)同理,那么就是有一些\(p\)间的要求,例如\(p_{A,i}<p_{B,b+i}\)(\(i\leq a\)),这个可以直接\(dp[i][j][k]\)表示目前已有前\(i\)个 A,前\(j\)个 B和前\(k\)个 C,复杂度\(O(N^3)\)
而又因为题目限定了我们的\(a\in S_1\),\(b\in S_2\),那么可以考虑枚举合法的子集\((S'_1,S'_2)\)对,然后容斥出答案即可,注意到两个子集的\(\max\)相加如果\(>n\)肯定无解,因此子集对只有\(O(N2^N)\)对(\(\sum_i2^i2^{n-i}\)),总复杂度\(O(2^NN^4)\)
前面的\(dp\)显然不能优化了,考虑优化枚举子集对的过程,先考虑\(|S_1|=|S_2|=n+1\)的情况
发现对于某一固定的\(a\),合法的\(b\)首先要满足大于等于某个值,这是为了满足\(p_{A,i}<p_{B,b+i}\)(\(i\leq a\)),往后的操作又会给\(b\)一些限制,但一定都是形如要求\(b\)大于等于或小于等于某个值的,也就意味着,合法的\(b\)的取值是一段区间,那么只需要知道一个\(S'_1\)对应的\(b\)区间非空的方案数即可容斥出答案
考虑怎么求这个方案数,因为是区间,所以点边容斥即可
同理对\(a\)也这样优化,那么现在就不用枚举子集对了,而是枚举两个单点
对于\(|S_1|\)、\(|S_2|\)不满足都等于\(n+1\)的情况时
先假设我们还是要枚举\(S'_1\),因为只要解决的\(b\)的那边的容斥,\(a\)这边同理的处理即可,若此时的\(b\notin S_2\),找到\(b_0\in S_2\)且\(b_0>b\)的最小的\(b_0\)和\(b_1\in S_2\)且\(b_1<b\)的最大的\(b_1\),显然要包含\(b\),那么也得包含至少\(b_0\)或\(b_1\)的其中一个,而因为用的点边容斥,所以包含了\(b_1\)的情况已经算了,只需要考虑只包含\(b_0\)的情况即可
对于上面提到的\(dp\)数组,如果用\(calc(x,y,z)\)来表示它的参数,那么实际上它求出的是能满足\(x\leq a\),\(y\leq b\),\(z\leq c\)且\(a+b+c=n\)的\((x,y,z)\)的方案数,这样我们容斥的计算就能很好的进行了
复杂度\(O(N^5)\)
树数叔术
定义不是很严谨?似乎是想要要求取值要\(\leq V\),不然方案数是无穷的(
首先显然,\(0\sim V\)的数都要出现,所以如果\(V\geq N\)就直接不合法了
那么合法条件可以表达为,不存在一个\(0\sim t\)都出现的连通块满足连通块外还存在\(t\)
这启发我们考虑虚树,考虑\(t\)从小到大的确认,显然对于\(t=0\),只能有一个节点,\(1\)也只有一个,\(\geq2\)的点,要么只有一个,要么所有的点在虚树上的度数都\(\geq2\),这样相当于能保证不存在某一个\(t\)的一棵子树内能存在\(0\sim t\)
可以考虑以\(0\)所在的点为根
那么考虑\(dp\),有标算的\(O(VN^3)\)和爆标的\(O(VN^2)\)
标算的
考虑\(dp[t][i][j]\)表示\(0\sim t\)的颜色,虚树上共\(i\)个点,有\(j\)个未标号(即值\(>t\)的)
转移考虑\(t+1\)的是只有一个还是度数\(\geq2\),前一种好处理的,可以随便塞,后一种要么塞到边里,要么占据未标号的点
那么可以枚举多少个塞边里,多少个塞未标号的点里,这样复杂度\(O(VN^4)\),考虑优化
把系数化简可以发现塞边里和塞点里的无关,那么直接设一个中转态\(f[t][i][j]\),这里的\(i\)就是处理了塞边里的后的虚树上的总点数
\(dp\rightarrow f\)要枚举塞边里的,\(f\rightarrow dp\)要枚举塞点里的
复杂度\(O(VN^3)\)
爆标的 ✯✩
膜拜喵
核心思想和标算的一样,主要是\(dp\)的转移不同
这里的一大不同是标算的虚树是真虚树,这里的虚树是直接把路径上包含的所有点都放到虚树中,而不是只放了\(lca\)和端点
同一颜色的点的放置方案可以分两种:第一种是放到虚树内的(\(\geq1\)个),另一种是放到虚树外(恰好\(1\)个)
因为这里的虚树包含了所有的点,发现当放一个颜色的点\(x\)到虚树外时,假设它是挂在\(y\)下的,那么\(y\rightarrow x\)的这条链上的所有点的颜色都是\(x\)之后的颜色,也就是要求这些颜色是放到虚树内的类型
考虑怎么\(dp\)这个过程,设\(dp[c][i][j]\)表示考虑了颜色\(0\sim c\),\(c+1\sim v\)有\(i\)种颜色是放到虚树内的类型,当前虚树大小为\(j\)
转移是好转移的,但是有一点要注意,显然我们无法保证放到虚树内的类型的某个颜色是一定放了点的,所以再在\(dp\)的过程中容斥一下,钦定某个点没放,带个\(-1\)的系数即可
这样显然构造出来的树广看颜色和形态是不同构的,所以乘上一个\(n!\)即可
复杂度\(O(VN^2)\)
环上排序信息最优分割 ✬
疯狂优化没蚌住
考虑先固定第一个序列的分割点,然后\(dp[i][j]\)表示序列\(i\)的分隔点是\(j\)时的最小代价
发现\(dp[i][j]=dp[i-1][k]+calc(k+1,j)\)的\(calc\)满足四边行不等式,于是有决策单调性,可以分治的维护
这样复杂度是\(O(N^2log^2N)\)的
考虑怎么优化,对于第一个序列的每个分割点,找出序列\(\{p_i\}\)表示最优情况下每个点的分割点,发现最小代价的情况下,满足\(p_i(x)\leq p_i(y)\),其中\(x\leq y\),\(p_i(x)\)表示第一个序列的划分点为\(x\)时的\(p_i\)
证明可以考虑如果有两个当前不满足,那么那不满足的地方的决策及之后的都互换,因为是最小代价的情况所以一定不劣
那么就可以先求出第一个序列分割点为\(\frac{l+r}2\)时对应的序列\(\{p_i\}\),然后再求出其他分割点对应的序列,复杂度\(O(Nlog^3N)\)的,然后维护的时候再只用撤销和删除能做到\(O(Nlog^2N)\)
Désive ✯
邪恶出题人直接搬别人刚出不久的糊策题当\(t4\)
模拟赛里是直接规定有性质\(a_i\)互不相同
考虑给定一个序列,求最大的\(mex\)值,可以建出\(trie\)树,发现\(xor\ v\)相当于给序列中的数排序,如果二进制下\(v\)这一位是\(0\),那么排序时二进制下这一位\(1\)优先,否则\(0\)优先,然后就是找排序后最长的前缀满足\(xor\ v\)后等于\(0,1,2,...\),\(trie\)树上可以直接\(dp\)维护,如果\(x\)的\(ls\)或\(rs\)都是塞满了的,那么\(dp[x]=dp[ls]+dp[rs]\),否则\(dp[x]=\max(dp[ls],dp[rs])\)
发现\(dp\)转移可以用一个叶节点到根节点的路径来表示,最终的\(dp\)值就是\(1\)(叶节点本身)加上从该叶节点一直向上跳,兄弟节点的子树如果是满的,就加上兄弟子树中叶节点数,否则不加
这也就意味着,我们能把决策点挂到叶节点上
这种询问肯定考虑扫描一个端点,另一个用线段树维护历史和,这里扫描右端点
那么如果\(a_i\)互不相同,则每个子树被填满的时刻是确定的,此时从\(a_i\)出发往父亲跳,确保当前子树是满的,此时兄弟节点的所有叶节点的\(dp\)值都可以更新,显然更新的总次数是\(O(N2^N)\)的,考虑具体的维护,对于一个叶节点,找出它当前向上跳到达的所有满的兄弟节点对应的最小时刻(即该兄弟节点内叶节点的最小时刻),把它们提出来然后排序,每次更新操作相当于往这里面插入一个点,对于当前扫到的右端点,会得到该序列的一个前缀的点作为左端点构成一组决策点,如果直接暴力的全部找出来决策点的数量是\(O(2^NN^2)\)的
考虑怎么变成\(O(2^NN)\),发现对于同一子树内,设其叶节点总数为\(2^k\),那么它内部可能的值有\(2^k\)种,这个数量和叶节点的数量是等价的,对于每种值求出最大可能的左端点时刻,再用这些来添加决策点,那么这样决策点数量就是\(O(2^NN)\)的了
找出决策点后,因为显然左端点越小,整体的值越小,然后线段树历史和、区间取\(max\)随便维护一下就行
总复杂度\(O(2^NN^2+NQ)\)
考虑\(a_i\)有重复的情况
依旧是\(a_i\)向上跳到\(p\),对于此时的兄弟节点\(q\),\(p\)对应的值的时刻\(v\rightarrow v'\),发现此时只会影响左端点在\([v,v']\)的点的值,即会加上\(p\)对应的值,进一步的,随着\(a_i\)的更新,\(p\)对应的\([v,v']\)是无交的(端点不管,实际这里的开闭无所谓的),所以可以考虑给\(q\)上维护一个指针,指向左端点
这样总复杂度也是\(O(2^NN^2+NQ)\)的
幽默还是夢 ✬✩
大概会啊,有些“细节”不会,话说这题的细节还是很恐怖的。。。
先如果询问的就是整个序列,怎么做
对于一个物品,可以拆成两个\(a\),\(b-a\),其中必须选了前一个才能再选后一个
- 如果\(a\leq b-a\)
此时就可以变成两个独立的物品了
- 如果\(a>b-a\)
发现大部分不可能选了\(a\)不选\(b-a\),变成一个性价比为\(\frac b2\),大小为\(2\)的物品
可能选\(a\)但不选\(b-a\)就是\(a\)是作为最后一个被选的,这里就是“细节”了,大概思路就是对性价比排序后取一个前缀的物品作为答案,然后最后那一两个可能要怎么替换一下咋的额额
这种拆法好像挺\(trick\)的,见过几次了
然后不考虑细节了!太困难,摆大烂,现在就相当于只要选出一个前缀就行,考虑有修改有区间限制的情况怎么弄
发现前缀可以表示为性价比\(\leq lim\)的物品,即只需要找到这个临界点\(lim\)即可
诶,然后可以整体二分,把修改改成删除+插入,询问就询问,然后就是很典的整体二分维护下去就好
bushi,好像说自然吧也自然,但是就是感觉哪里怪怪的啊喂!
ARC100E Or Plus Max
唐诗题谁给评的紫。。。
发现是\(i+j\leq K\),那么考虑枚举\(i+j\)和\(K\)的\(lcp\)即可,然后高维前缀取\(max\)优化一下即可
复杂度\(O(N2^N)\)
iai 运输
有意思,但不多的题
发现其实就是求把\(\{a_i\}\)划分成最多数量的和为\(0\)的块
暴力就\(O(3^N)\)枚举子集的转移
考虑优化一下,对于一个集合\(S\),如果\(sum[S]\neq0\),那么显然它可以直接从某个\(dp[S\ xor\ 2^i]\)转移过来,如果\(sum[S]=0\),说明无论从哪个子集转移过来,它都能新造出一个和为\(0\)的块,那么转移就是某个\(dp[S\ xor\ 2^i]+1\)转移过来
复杂度\(O(2^NN)\)
CF383E Vowels
到底是谁在给这种唐题评紫和*2700
显然记录一下不满足的就可以高维前缀和了
复杂度\(O(2^{24}24)\)
倒是也能硬容斥
P10743 [SEERC2020] AND = OR
同是紫题,区别咋这么大呢
考虑把区间内的数排序,必定是一个前缀的选到\(or\)里,其余放到\(and\)里
进一步的,考虑按\(popcount\)排序,考虑枚举答案的\(popcount=k\),那么\(>k\)的都在\(and\)里,\(<k\)的都在\(or\)里,\(=k\)的必须都相同,然后再看怎么放就行
在线就\(O((N+Q)logNlogV)\)的
离线分治可以做到\(O((N+Q)logV)\)
CF1120F Secret Letters
线性
考虑找到第一个寄存信的点,设为\(p\),那么它之前的所有点都是\(d\)的代价,考虑此时有什么性质
发现从\(p\)开始无论何时都有一个信,那么至少有\(c\times(t_{n+1}-t_p)\)的代价
发现先算上这个代价后,有个很好的性质,就是当\(R\)点的信所属的人变化时变化的那个点,相当于是不用代价的
那么发现,把原序列用所属的人分隔成一个个的连续段,则对于\(p\)之后的每个连续段段首一定是用寄存的方案最优
首先可知交换时是不用代价的,也就是显然比\(d\)优,因为如果第一个不用,那么前面寄存的信的寄存时长会延长,且显然后面的点到下一个交换点的距离更近,可以发现一定有选第一个当交换点最优
从后往前枚举\(p\),复杂度\(O(N)\)
\(O(n \operatorname{polylog} n)\)
就列出\(dp\),然后考虑数据结构优化
坏了,要\(KTT\)维护啊,不会\(KTT\)啊,要学了喵
CF2031F Penchick and Even Medians
考虑从全选到去掉两个的区别,根据\(\frac n2\)和\(\frac n2+1\)是否还在以及另一个值是啥可以得到去掉的两个数是\(<\frac n2\)、\(=\frac n2\)、\(=\frac n2+1\)还是\(>\frac n2+1\)
考虑如果能得到一对数\(x\)、\(y\)满足一个\(<\frac n2\)一个\(>\frac n2+1\),那么我们把剩下的数两两一对组队就可知道\(\frac n2\)和\(\frac n2+1\)的位置
怎么得到这一对\(x\)和\(y\)呢,显然随机选一次就选的概率是\(\frac{2(\frac n2-1)^2}{n(n-1)}\),选不到就是\(1-\frac{2(\frac n2-1)^2}{n(n-1)}\),那么显然在前面剩余的次数,约是\(20/30\)左右,随机选,选不到的概率很小,具体可以打表验证
UR28B 环环相扣 ✬
一些性质
鸣谢假\(Op\)提供的关于性质的证明
首先对于要求的式子有以下三个性质:
- 固定的\((a_i,a_j,a_k)\)的答案为\(\max(a_i+a_j+a_k\%a_i,a_i+a_j\%a_i+a_k\%a_j)\)
- \(a_j\)一定是\(<a_k\)的在\([l,r]\)内最大的那个
考虑存在\(a_p\in(a_j,a_k)\),此时有:
取\((a_i,a_p,a_k)\)时,\(a_i+a_j+a_k\%a_i<a_i+a_p+a_k\%a_i\)
取\((a_j,a_p,a_k)\)时,\(a_i+a_j\%a_i+a_k\%a_j<a_j+a_p+a_k\%a_j\)
显然取\((a_i,a_j,a_k)\)一定不优于\((a_i,a_p,a_k)\)或\((a_j,a_p,a_k)\)
- \(a_j\)和\(a_k\)是\([l,r]\)中次大和最大的那俩
因为已经得到\(a_j\)和\(a_k\)在\([l,r]\)中“连续”,所以只需要看\(a_k\)是否一定取区间\(max\)即可
设区间最大的三个值为\((A,B,C)\)(\(A<B<C\)),那么取\((A,B,C)\)时至少有答案\(A+B\)
考虑反证:
当\(a_k\leq A\)时,最大取近似取\(2a_i+a_j\)(实际上取不到),那么会有\(2a_i+a_j>A+B\),因为\(a_j<B\),所以必定有\(2a_i>A\),此时对\(a_i/a_j\)取模的操作就相当于\(-a_i/a_j\),那么\((a_i,a_j,a_k)\)的答案为\(a_j+a_k\),显然\(<A+B\),更劣
当\(a_k=B\)时,最大值依旧近似取\(2a_i+a_j\),会有\(2a_i+a_j>A+B\),因为\(a_j=A\),所以有\(2a_i>B\),此时对\(a_i/a_j\)取模同样相当于\(-a_i/a_j\),那么\((a_i,a_j,a_k)\)的答案为\(A+B\),显然不优于\((A,B,C)\)的
所以一定有\(a_j=B\)且\(a_k=C\)
解法
得出这一重要性质后,考虑怎么解决问题
我们可以先数据结构取出区间内的最大和次大值,计为\(u\)和\(v\),那么现在需要维护函数\(F(l,r,i)\)表示除去\([l,r]\)内\(i\)和除\(i\)外最大的数后,\(a_i\%a_j+a_j\)取到最大时的最大的值
近一步的,显然可以把\(F(l,r,i)\)拆成\(F(l,i,i)\)和\(F(i,r,i)\),合并的时候再考虑把两遍分别对应的那个除\(i\)外的最大的数中较小的那个的贡献给算一下即可
直接做就\(O(N^2)\)的扫,考虑优化
下面以计算\(F(l,i,i)\)为例
因为\(a_j>\frac{a_i}2\)时,\(a_i\%a_j+a_j\)可以取到最大值\(a_i\),而\(F\)函数又要求会去掉最大的那个,所以显然从\(i\)往左扫,扫到第二个\(>\frac{a_i}2\)后,就不用扫了,可能会有\(>a_i\),虽然一定不会问到,但是这里我们不做特殊处理
发现加上此限制后,扫的区间的总长度是\(O(NlogV)\)的
证明考虑一个点\(x\)会被它右边的多少个点记录,发现它能被\(y\)记录当且仅当\([x,y-1]\)中第三小的值\(\leq\frac{a_y}2\),当然区间内没有\(3\)个数的话自然可以取到\(1\),那么这就是\(O(logV)\)级别的
这样复杂度可以是\(O(NlogV+QlogN)\)的,但是只有\(80pts\)令人恼怒
考虑继续优化
发现我们的\(F(l,i,i)\)中存在很多值相同的点,即\(F(l',i,i)=F(l,i,i)\),考虑怎么去掉这些点
发现若当前在处理\(y=i\),扫到\(x\)时,如果\((x,y)\)中有两个\(\geq2a_x\)的点,那么\(x\)首先不会作为最大值,其次不会作为最优解,设这两个点中的某一个为\(z\),因为\(a_y\%a_x+a_x<2a_x\leq a_z\leq a_y\%a_z+a_z\),即\(a_y\%a_x+a_x<a_y\%a_z+a_z\)
考虑用这个性质优化刚才那个\(O(NlogV+QlogN)\)的做法
我们原本是要扫从\(i\)到其左侧临界点的所有点,现在可以维护一个栈,里面存的是\(<i\)且可能产生贡献的点,考虑具体维护的过程
每次就从栈尾向前扫,如果当前值\(\leq\frac{a_i}2\),给这个元素的\(tag+1\),否则\(>\frac{a_i}2\),给\(i\)的\(flag+1\)
当\(flag=2\)时就直接不扫跳出这个过程了
结束后把所有\(tag=2\)的弹出,把\(a_i\)加入栈尾
显然因为我们有\(flag=2\)时就直接跳出这个过程的操作,所以我们能保证每遍历一个元素,都能让某个\(tag\)或\(flag+1\),而又可知\(tag\)和\(flag\)的总和是\(O(N)\)级别的,所以我们的遍历也是\(O(N)\)的
复杂度\(O(N+QlogN)\)
P3206 [HNOI2010] 城市建设
以下令\(N\)、\(M\)同阶
\(LCT\)
线段树分治+\(LCT\),把边用一个点来表示即可
复杂度\(O(Nlog^2N)\)
人类智慧做法 ✯✡
依旧还是线段树分治,那么当前有一些已经确定了权的边和未确定的边
一个很显然的事实是,把未确定的边全赋值成\(-INF\)后跑\(MST\),此时选中的确定了权的边是在之后都一定会选的,赋成\(+INF\)跑\(MST\)此时未选中的之后都一定不会选中
前者相当于把未确定的边全选上,后者就是都不选
那么首先可以把以后都不会选中的删了,把以后一定会选中的边对应的点缩点
未确定的边的总和是\(O(NlogN)\)级别的,因为一个长度为\(len\)的区间,区间内未确定的边也是\(O(len)\)的,第二类中保留下来的边显然是点数级别的,所以我们现在想找到点数的大小
点数的大小只和第一种操作中缩的点/边数有关,因为在最小生成树上,我们是缩了确定的边,反过来相当于没缩未确定的边,那么可以知道连通块的个数是\(O(len)\)的,也即长度为\(len\)的区间,缩后的点数是\(O(2len)\)的样子
复杂度\(O(nlog^2n)\)
P4075 [SDOI2016] 模式字符串
点分治,\(hash\)乱搞,好像很卡,卡不过,摆
P5297 [北京省选集训2019] 完美塔防
考虑如果两个炮台的路径有重合,那么它们的路径一定是完全相同的,那么也就会打到对方
所以一个空地只有两个合法的炮台能打到,直接\(2-sat\)即可
P3825 [NOI2017] 游戏
非\(x\)类型的点自然可以\(2-sat\),\(x\)类型的遍历 AC和 BC即可,复杂度\(O(2^dN)\)
P2
小登给的题,登猜测呆猫不会做,但是呆猫做出来了,黑子说话!
从\(2^N\)入手肯定不好弄,考虑从\(M\)入手,如果最后\(M\)后面还有\(T\)位,那么有以下限制:
发现如果固定的是\(N\),那么\(T\)一定是\(M\times10^T\leq 2^N\)的最大的\(T\),即\(T=\lfloor\log(\frac{2^N}M)\rfloor\),且要满足\(T>\lfloor\log(\frac{2^N}{M+1})\rfloor\),即\(\lfloor\log(\frac{2^N}M)\rfloor>\lfloor\log(\frac{2^N}{M+1})\rfloor\)
化简出来就有\(\lfloor N\log2-\log M\rfloor>\lfloor N\log2-\log(M+1)\rfloor\),那么根据\(-\log M\)和\(-\log(M+1)\)初始的整数位的大小(\(\Delta=0/1\)),可得对\(N\log2\)的小数位的限制,是一段区间
那么初始化出所有\(N\log2\)的小数位的值,然后查询的时候主席树问就行
看小登的做法大概是从固定的\(T\)入手,然后算出的范围,反正大致差不多就是了
令这些变量都同阶,复杂度\(O(NlogN)\)
口胡题 ✬
好牛,不知道是有原题还是真的是博主口胡出的题啊(
肯定会考虑\(dij\)跑最短路,但是肯定不能直接跑,否则转移的数量就是\(O(M^2)\)的了,考虑优化
因为是单增凸函数其实并不会用这个证四边形不等式的说(,所以对于同一个点的出边,显然能转移给它们的是该点的入边,若已算出入边的答案\(dis\),先按边权排序后,只保留\(dis\)单减的入边的序列显然没影响,又因为此时函数满足交叉优于包含,所以肯定有将出边按边权排序后,决策点有单调性
那么\(dij\)的过程再维护一下即可
P5244 [USACO19FEB] Mowing Mischief P
先把花按到它的最大经过花数分层,显然只有上一层会转移给下一层,且每层内\(x\)递增的同时\(y\)递减
考虑转移,发现把两层都按照\(x\)排序的话,会有包含优于相交,但是因为还有\(y\)的限制,导致上一层转移给当前层的是一个区间,所以不能直接单调队列,而是采用线段树分治+分治的解决,此时分治的时候完全没有转移范围的限制了,直接用\(i<j\),\(p(i)\geq p(j)\)的决策单调性即可
复杂度\(O(Nlog^2N)\)
CF1100F Ivan and Burgers ✯✡
啥三\(log\),双\(log\)的都显然,讲讲单\(log\)且在线的
我们对\(r\)扫描线,然后维护让\([l,r]\)区间的线性基发生变化的\(l\)点集合(最靠近\(r\)的那些),显然每个\(r\)对应的\(l\)点集合大小都是\(log\)的
考虑怎么从\(r\)拓展到\(r+1\),此时插入了\(r+1\)这个数,如果当前线性基凑不出\(c_{r+1}\),显然它会被直接插入到线性基中,否则记录下线性基每一位对应的\(l\),那么\(r+1\)会代替用于凑出\(c_{r+1}\)的那些线性基的值中对应位置最小的那个,显然\(check\)是否能凑出和\(insert\)都是\(O(logN)\)的,那么总的就是\(O(NlogN)\)的
可以把问题离线下来,不离线显然也可以,只要给每个\(r\)把对应的\(l\)集合存下来就可以了
复杂度\(O(NlogN)\)
ARC188D Mirror and Order ✯✩✡
不知道是边界没处理好还是啥啊,老是有点Wa/yun
要求了每个三元组\(s_i\)和把它翻转后的,称之为反三元组\(t_i\),这共\(2n\)个三元组两两不同,因为\(i\neq j\),一定有\(s_i\neq s_j\),\(s_i\neq t_j\),\(t_i\neq s_j\),\(t_i\neq t_j\)(因为他们中间那个一定不同),所以可能相等的只有\(s_i\)和\(t_i\),而只要\(s_i\)的第一个和第三个数不同则一定不会有\(s_i=t_i\)
因为计数的\(\{b_i\}\),考虑将\(s_i\)、\(t_i\)排序后的样子,只看每个三元组的第一个,排序后一定形如\(1,1,2,2,3,3,...,n,n\),称三元组中第一位相同的为一对,那么对于一对,他们的大小一定可以通过它们的第二个数来判定,那么也就有:对于一对中靠前的那个的第二个数<一对中靠后的那个的第二个数,这样可以考虑连边\(x\rightarrow y\),表示\(s_x\)的第二个数>\(s_y\)的第二个数,只要最后连出的图不存在环即可
显然可以发现,对于一个三元组,它的第一个数与第三个数并没啥关联
发现题目的\(\{a_i\}\)是给定了的,那么对于每个点,我们都可以知道它会有一条入边/一条出边,且我们不确定这条边和哪个点相连
而对于已知的\(b_i\),相当于我们就能确定一些边空的那一段接的哪个点
对于最终的图,显然任何一个点的度数都是\(2\),且不会存在环,显然如果把边看成无向边,那么每个连通块都是一个环,所以只需要确保每个连通块中即有初始表示入边的边,也有初始表示出边的边即可
令入边为白边,出边的黑边,那么就是要求不存在纯色连通块
可以发现,在\(b_i\)的作用下,将一些边的两端都确定后会形成一些连通块,且每个连通,要么已经成(无向边意义上的)环了,要判一下是不是纯色,要么就只有一条边的另一端还未确定
我们提出所有的连通块中还未成(无向边意义上的)环的块,可以分为三类,纯白色\(A\),纯黑色\(B\),两种边都有\(C\),分别有\(A\),\(B\),\(C\)个
现在可以直接看成有三类点,点有编号,需要把他们凑成一个个环,环上的边都从该点向它顺时针方向的下一个点定向,不管拿个点作为“起点”,即环随便转都一样,还要满足每个环中不能只有\(A\)或只有\(B\)
这里题意的转化是显然的,后面计数我就计不来了,计数太菜/ng,感觉这种计数方式也算一个\(trick\)吧
再提取一下要求,每个连通块中不能只有\(A\)或只有\(B\),每个点都有一个出边和入边,那我们可以把出边给当前点管理,那么每条边都有一个点来管了,所以我们的策略可以是挨个给每个点确定出边连向谁,要确保连向的这个点没有被其他点连过,最后只要所有点的出边连向的点都定了就可以了
前面这个限制不好做,发现问题主要出在,对于一个\(A\)点,它后面可能是\(A/B/C\),但是如果我们能确保它后面只能是\(B/C\),那么前面这个限制就可以满足了,进一步的,只需要提出每个环中\(A/B\)的极长连续段即可保证在每个连续段后面只能是与它不同的点
枚举它们的极长连续段的数量,分别为\(a\)和\(b\),设\(F(A,a)\)表示从\(A\)个点中取出\(a\)个极长连续段,则\(F(A,a)=\frac{A!C_{A-1}^{a-1}}{a!}\),\(B\)同理
再考虑怎么放这些连续段,因为是极长的了,所以显然\(A\)后不能放\(A\),只能放\(B/C\),\(B\)后面只能放\(A/C\),\(C\)无限制,考虑先确定所有\(A\)及其出边,再确定\(B\)及其出边,再确定\(C\)及出边
直接枚举有\(t\)个\(A\)后面放了\(B\),那么\(a-t\)个后面放了\(C\),这里的方案数显然就是\(C_{|A|}^a\times b^{\underline t}\times|C|^{\underline{a-t}}\)
再考虑拼\(B\),后面能放\(A/C\),且这里的\(C\)是没被\(A\)放的\(C\),那么直接是一个\((a+|C|-(a-t))^{\underline b}\)即\((|C|+t)^{\underline b}\)
再来考虑\(C\),它后面都能放,而\(A\)和\(B\)已经给了\(a+b\)个点确定了入边了,显然这里的方案数就是\((a+b+|C|-a-b)^{\underline{|C|}}\)即\(|C|!\)
则总方案就是\(C_{|A|}^a\times b^{\underline t}\times|C|^{\underline{a-t}}\times(|C|+t)^{\underline b}\times|C|!\)
发现\(a\)和\(b\)没有关系,那么可以先枚举\(t\),然后分别计算不同\(a\)和\(b\)对应的系数和,再乘起来就行
直接这样就\(O(N^2)\)的,不过可以卷积优化到\(O(NlogN)\)
【GDOI2018 day2】巡逻
一种是求出\(x\)到每个点的最短路和次短路,要求次短路的第一条边和最短路的第一条不同,采用最朴素的\(dij\)即可,复杂度\(O(QN^2)\)
也可以建出最短路树,显然只会经过一条非树边
P6175 无向图的最小环问题
可以在\(floyd\)的同时处理,考虑\(floyd\)最外层枚举的那个点,可以看作这个点,那么环长\(\geq3\)就有保障了,只需要在还未更新\(k\)作为中转点时的\(dp\)处,取两点\(i\)和\(j\),此时的\(dis[i][j]\)一定没有经过\(k\),然后取\(dis[i][j]+e[i][k]+e[k][j]\)即可
复杂度\(O(N^3+M)\)
[省选联考 2021 A 卷] 矩阵游戏
显然只要确定了第一行和第一列那么可以确定整个矩阵
先假设他们都是\(0\),求出一个可能不合法的\(a_{i,j}\)再考虑调整
如果想要给第一行的某个数\(+1\),发现要保证\(b_{i,j}\)不变,那么只需要给它所处的列依次\(+1,-1,+1,-1,...\)即可,列同理
这样,设第一行的第\(i\)个数加了\(p_i\),第一列的第\(i\)个数加了\(q_i\),那么对于点\((i,j)\)就有形如\(-a_{i,j}\leq\pm q_i\pm p_j\leq 1e6-a_{i,j}\),如果能保证\(q_i\)和\(p_j\)异号就能差分约束了,显然加和减本质相同,那我们只需要让\(p_i\)的偶数\(i\)的操作变成\(-1,+1,-1,+1...\),\(q_i\)的奇数\(i\)的操作变成\(-1,+1,-1,+1...\)即可
然后跑\(SPFA\),复杂度\(O((N+M)NM)\)
[CTSC2017] 吉夫特
由\(Lucas\) \(C_n^m\mod p=C_{\lfloor\frac np\rfloor}^{\lfloor\frac mp\rfloor}C_{n\mod p}^{m\mod p}\mod p\)
要\(\mod2\)还有值,对于后面那个\(C_{n\mod p}^{m\mod p}\)就不能存在\(C_0^1\),也即二进制位下,\(m\)是\(n\)的子集
然后就对每个数枚举它的子集然后转移就行了,值域很小,是可行的
复杂度\(O(3^{logV}+N)\)
「SDOI2013」淘金
考虑有多少个数会转移到\(x\),显然\(x\)必须可以拆分成\(2^a\times3^b\times5^c\times7^d\),显然这样的\(x\)的个数是\(O(log^4V)\)的,且远远小于
然后数位\(dp\)找出\(x\)能被多少个数转移,设这个数量为\(c(x)\),那么坐标\((x,y)\)的答案是\(c(x)\times c(y)\),用大根堆怎么维护一下就行了,因为有值的数量较少,可以直接枚举所有的坐标
「THUPC2018」城市地铁规划 / City
\(prufer\)序列+\(dp\)即可
复杂度\(O(N^2)\)
[SDOI2012] 基站建设
显然不会向左转移,那么简单几何一下得到式子\(dp[i]=v_i+\min dp[j]+\frac{x_i-x_j}{2\sqrt{r_j}}\),然后可以斜率优化了
可以把\(j\)当作线插入李超线段树,也可以把\(i\)当线,\(j\)当点,\(cdq\)维护一下凸包
复杂度\(O(NlogN)\)
「SHOI2015」超能粒子炮·改
就是\(Lucas\)推式子,会推成一个递推的形式的
「SHOI2017」期末考试
考虑固定一个结束时间,那么学生的不满意度随时间是下凸的递减函数,老师的不满足度遂时间是上凸的递增函数
凸函数合并得到凸函数,三分即可
Gym 104925C Yet Another Balanced Coloring Problem
显然可以令黑点为\(+1\),白点为\(-1\),就是要求每个子树的和\(\in\{-1,0,1\}\)
考虑发现子树大小为偶数时必定是\(0\),对父亲没有贡献,考虑直接断开这条边,那么显然可以发现,除了叶子和根,每个点的度数都是偶数,然后再把两棵树的叶子合并起来,那么现在叶子也是偶数度数的了,而根必须同奇偶
对于第一棵树,若\(x\)子树的和是\(+1\),则定向为\(x\rightarrow fa_x\),否则定向为\(fa_x\rightarrow x\),另一棵树相反,则此时一定可以欧拉图遍历一遍确定每条边的方向
复杂度\(O(N)\)

浙公网安备 33010602011771号