省队二轮集训笔记
不放密码了。
6.30
A.
暴力 期望得分15
全A dyh在zr讲过 期望得分15+30
按照全A解出每个串长度
考虑当前若干个串 可以找到s1+s2我们确定s1
看s2+s1是否存在 接下来同理
爆搜+回溯 No会被卡 期望得分75
STD:
先按长度第一关键字字典序第二关键字排序
按之前的删掉
接下来最小的就是s1+sx or sx+s1
如果出现s1Ts1的情况 我们可以分出两种情况
Ts1s1<s1Ts1 不存在 因为按字典序排序了
于是只存在s1s1T 这样的话我们就可以确定下来了
最后时间复杂度是$O(\sum L_i log^2 \sum L_i)$
B.
我们考虑A=B的情况 策略是堆成x堆A
最紧凑的情况是N/A堆A和N%A
发现joker一定可以这样凑 于是我们只考虑 (N/A)和N的差的奇偶性
继续考虑A>B的时候 神树可以通过把一些B堆一些A来最优 然后推个柿子(
B<A其实是同理…并不会/cy
更新:
A=B的时候 我们考虑的其实是$ (B-1) \& (N/B) \text{^} (N\%B-1) $
A>=B 我们都可以用这个柿子
$ ((n-(n+B-1)/B)\&1) || ((n-1)\%B+1<=(n-1)/B*(A-B)) $
B>A 我们用的是反过来的柿子
可以理解qwq
C.
用点-边=1的常见套路 维护一个历史最小值出现次数之和
A是一条链 扫描线 大概是维护历史最小值 维持历史最小值的时间 加标记 总时间 … 一共4个标记(要是我没数错的话
如果A是树 那么就是点分/dsu再套上上面那个玩意
另一个方法
拆成欧拉序 拆成3个矩形 第一个出现的点+1 第二次点-1 扫描线维护复杂度一个log 但实际上只是比log2快了1倍。。。
——————分割线——————
杂题选讲
Codechef June Challenge
Forgotten Tree 9
题意:一棵二叉树,我们中序遍历对其编号,每次只能询问x,A,B,系统会返回子树x中最小和最大的编号是否分别是A,B 限制3n次询问
询问出所有叶子 接下来每个叶子开始缩链 貌似最后优秀的实现可以达到O(3n/2)
然后zyb给出的另一种做法就是通过每一次询问成功确定一个点或者失败代表子树结束 最后复杂度是O(2n)
find a Peak in 1D array
题意:数列里数互不相同 满足 a1<a2 an-1>an 找到一个位置ax>max(ax-1,ax+1) 每次询问出一个位置的值 问最少询问几次能找到
发现一个区间中大小关系满足a1<a2 并且 am-1>am 区间内一定存在一个解 那么我们可以二分位置来确定 次数O(2lgn)
find a Peak in 2D array
题意:上头那个题扔到2D
随机撒O(n)点 再通过爬山 确定 期望O(3.5n)实际2n左右
确定性做法:找一行的最大值如果不是答案那么只要递归比他大的一边就可以了 随机交换行列 做到询问3n
貌似上面两个题都是zhengrui的题emm
找出现两次的数
大小n+1的数组 每个元素都是[1,n] 一个数出现两次或以上 其他数不一定出现过 O(n)时间 O(1)空间 不允许修改数组
i向a[i]连边然后floyd判环 大概就是类似于rho的一个玩意 最后可以找到rho的接点就是答案
发现n+1一定没有入度 所以可以直接从n+1开始判就可以了
几排数
做过 忘了 哭了
找出每一行 把这些串的所有子串建AC自动机 然后尝试在所有子串后面拓展 如果fail无法拓展则不拓展 如果拓展成功就可以那么可以一直拓展 证明失败的询问只有2n^2次
zbl
JOISC2019
Minerals
题意:有n种东西 每种都恰有2个 有一个设备里插入一个东西 或 删除一个 或 询问这个设备里有多少种不同的东西 N43000 要求10^6操作(询问不算操作)将其两两配对
发现要求其实是nlgn
然后我们通过整体二分 我们把左边全部放进去 然后右边放进去取出来来匹配 然后我们通过一些操作每次分两部分 这样就是2nlgn 然后开始卡常
我们每次取出小的那边 T(n)=T(x)+T(n-x)+min(x,n-x)+n 发现最优的点在x=0.38左右 于是我们发现操作数在惊人的999976次!
CF1028G
貌似sun和袁神尝试做过emm 做法是dp[i][j]表示x>i还剩j次询问机会 最远能确定多大的x
就是从i开始找到x再从x继续dp
CF1060H
Sophisticated Device
考虑用$xy=\frac{(x+y)^2-x^2-y^2}{2}$
通过高斯消元解$(x+0)^d…(x+d)^d$来求$x^2$
7.1
A.
不考虑内角 任意选三个点任意排就有5分啦
90° 一个一个弄【散人小游戏 大雾 就有27分啦
wucstdio做法 自定义函数通过找两个很近的三角形 然后通过一系列交换得到顺时针轮换
长这样 然后讨论一下4个象限然后改造一下 最后达到内角是62.5 然后我们可以选择三个来减小角度达到优秀的62.25 然后就稳啦
残暴的std:
把满分三角形提出 一共有1694个 可以通过蝴蝶形轮换【考场命名 大雾】达到任意轮换
通过人脑轮换/代码轮换 就可以了(
B.
trie维护一下???草??
C.
神树神J分开算
然后人类智慧/cy
组合数前缀和 莫队
————————分割线————————
LOJ6677
观察可得是是一个立体图 里面要放若干立方体 一个立方体存在当且仅当下面的所有小立方体和里面的小立方体全部存在
可以推出柿子发现是杨表(?)行列均非严格递增 套个公式就做完了 强行推结论QAQ
有点意思的题
DFSDFS?DFSDFS!
有向图DFS序数量 n<=17
f(i,S)为答案 从i开始走完了S g(i,j,S) 是一个集合S\’ 表示在i S维护dfs链 走完子树j后的S\’ 转移:枚举走哪个子树即可 复杂度O(n^2*2^n)
CF 441E Vaiera and Number
见这里吧
CF 618G Combining Slimes
生成一个很大的数概率非常小 于是只用计算生成的小数的贡献
要多考虑1被2截住的转移
PE645
快速计算
求其生成函数 拆开三项
组合数二项式定理 三项卷积然后卷积
打表或者求导发现是低次整式递推式
一道常数很大的题
有n个数 求多少个bi<=ai 使得bi-1<=bi 序列计数 n2e5
可以转化NE Lattice Path(x
考虑用分治来做
找到中间断层来做 通过FFT来获得答案
Joker做题
斯特林展开
好的 斯特林数我还是不会/cy
LOJ3071
7.2
A.
爆搜很稳…
正解3^(n/2)lg 就是meet in the middle找到(A,B,C) 求的是二维偏序A+A\'<=B+B\'<=C+C\’ 被爆搜艹爆了
B.
考虑点分 路径会被分成两部分 w分成w/2和w/2 如果一段被减成0就重构 每一部分只会重构logw次 所以总共是 O(nlg^2n)
分成两部分就是在点分树上找到分治的节点切开即可 每次从x减的时候就是子树减 所以维护树套树(线段树套点分树)即可
(好稳啊)
C.
大概就是一个合法方案对应的是左边到右边的一个不交路线 然后可以dp得到左下到右下的双射关系…然后
——————分割线——————
连线
最终答案是两个团
考虑度数最小的点d 一定是连出去有d个 发现一定是两个团 每个点度数为d
最优LIS
维护以i结尾的lis长度 区间平移 区间加 区间取max 平衡树维护
博弈
dp求d(i,j)表示走到i已经得到j 可以注意到这是一个分段函数 每次移动就是将数组移动ai的距离 最后复杂度是O(sigma ai)
Meal Plan
高斯消元容斥求系数
bell数
排列
要找到一个字典序较小的哈密尔顿回路 可以通过数据结构维护
鸡排
随便维护两种鸡排的数量就可以求出b
维护对于每个二进制维为1出现的多少个鸡排
BZOJ1386
Codechef QGRID
7.3
a忘记记题解了 但比较简单应该能直接记住吧。。。
LUOGU5439
51nod1819
树链剖分 我也不会 这里
不知道哪里看来的题
uoj268
zyb的做法:链上点+w 边-w 维护最大带权直径 链加 但是对于一条链只会+w/+0/-w 所以只需维护和一条链有交/无交即可
性质:两条链相交当且仅当一个链的lca在另一条链上 直径一定是叶子到叶子
动态dp维护即可
Codechef Union on Tree
所有链的颜色数
对于所有颜色建虚树 基数排序+O(1)LCA
CF564 1E
QAQ
BZOJ4771
7.4
A.
考虑拆成8项 然后维护前缀极值 前缀极值和
可以用状压来维护前缀极值 前缀极值和
B.
可持久化平衡树维护复制 (草
然后还是一个log?
STD->可持久化avl
C.
窝A掉啦
——————分鸽线——————
接水果
LOJ 6073
满足差分性
某经典问题
每个节点维护一个可持久化平衡树 然后在DAG上按拓扑顺序合并
只取前k个节点
LOJ6145
点分树 对于每个分治中心线段树维护最小值 O(nlg^2n)
某经典问题
树上主席树
不知道哪里看到的题
先考虑序列上分裂合并 然后求区间一个数的出现次数
分块!【终于出现了!
luogu3676
发现换根可以不换
考虑换根时点权的变化
可以推柿子得到每个点维护点权和 点权平方和 然后只需要维护dfs序树状数组
LCT练习好题(
BZOJ4231
可以查跟到某点的路径上某个字符串出现的次数 然后u到lca差分掉 lca到v将串翻转求出 然后暴力求跨过lca的
求出差分数组可以用离线建出AC自动机 在树上匹配即可
BZOJ3123
启发式合并树上主席树
BZOJ3881
AC自动机+树链的并+DFS序+树状数组
BZOJ2238
沙比题
BZOJ4530
强在:LCT维护子树信息
时间:离线+并查集+树状数组
CF757G
BZOJ4668
离线=归程
强制在线=带权并查集按秩合并+暴力LCA
codechef prime distance on tree
柿子写出来是这样的
$ans[i]=\sum_{j=0}^n sum[i-j] * sum[j]$
于是FFT优化即可 O(nlg^2n)
loj6276
颜色分类一下
7.5
A.
考虑建出二分图 然后是前缀连边 且单调不降
必须极大匹配
考虑没有被匹配的最大的b如果它连的的前缀里有没有匹配的 就是不合法的
我们设f[i][j] 表示前缀i匹配了j个
左边有i个点 然后前缀中匹配了j个
g[i][j] 并没有搞懂。
设f[i][j][k]表示前i个里匹配了j个
O(n^2)做法
f[i][j][0/1] 不枚举分界点
前i个位置 还有j个要匹配 是否到了分界点
0 如果没有到分界点 a就必须匹配 b可以匹配可以不匹配 再考虑转移到1的情况
1 加进来的b必须匹配 加进来的a直接不考虑
B.
沙比题
C.
学习如何写一个只有插入的红黑树/cy
BZOJ4448
可以把询问都换到修改后面 不会/cy
BZOJ4568
垃圾题
合并线性基比较慢 可以考虑插入一个数 树分治最后合并线性基
BZOJ4571
某hr的题
用n个bitset维护一下 然后定期重构
某cf题
x->(1<<x-\’a\’) 查多少链的异或值=(1<<i) or 0 所以点分一下就行了
Codechef DGCD
codechef rectangle query
容斥二维数点就好了
O(1)GCD
LUOGU4587
翻log次
【UNR#1】 火车管理
可持久化线段树一下
Codechef Push the Flow!
圆方树链上一种做法 环上两种走法 要使最小值最大 树剖可以维护
可以转成最小割 可以LCT维护最小值
CF986E
Codechef Tsum2
建凸包
CF650E
两个树上一样的边类似缩点
CF840E
CF436F
LOJ6576
维护历史最大值 差量 区间加 然后讨论更新
LOJ6507
7.6
A.
把C排序 然后暴力dp就有O(n^5) 40pts
优化一层i 就有O(n^4) 因为剩下的一定在子树内部 然后再枚举有多少在当前节点结束
换一个算代价的方法 把一次考虑一层变成一次考虑一个 O(n^3)就能过了qwq
B.
n=2 暴力dp
如果起点颜色被分为k段 把答案乘以$\sum a_i$ 再除以k就行了
a1=1 序列
思路竟然是一样的…
然后第二步要容斥
正解
上面两个合并一下
C.
建一棵回文树 链加链求和
——————分割线——————
BZOJ4671
就是集合划分容斥线性基
BZOJ3600
考虑将每个元素赋上权值
替罪羊树暴力重构
没有名字的题
可以证明答案不会大于min(a[i+n/2]-a[i])
所以构造一下即可
BZOJ5093
第二类斯特林数+NTT
BZOJ4851
BZOJ4830
BZOJ3925
BZOJ4289
后面记得好草率啊(