Day 1
C
首先一个暴力的想法就是直接按照 SCC 大小的集合 dp,每条边加入之后集合要么无变化,要么被这条边连通了几个 SCC。
对于第一种转移,我们可以直接从可添加边数最多的集合也就是一个大 SCC 和一堆点转移,对于第二种转移,发现它与每个 SCC 的点数没有关系,于是就可以直接去掉记录点数的那一维。
现在考虑一下状态,首先要记录第 \(i\) 条边,然后记录当前 SCC 的个数 \(j\),但是这样没法转移,发现可以再记一个 \(k\) 表示有 \(k\) 个 SCC 弱连通。
实现的时候需要记录一下每个边数最多能形成多少个 SCC,这个打表找一下规律即可。
D
先判掉平局也就是异或和为零的情况,然后发现只需要看异或和中最高位的 \(1\) 即可(也就是有奇数个数这一位为 \(1\))。
如果 \(n\) 为偶数,那么先手一定可以取到奇数个 \(1\) 而获胜,否则,两端都是 \(0\) 会使得后手进入必胜态,先手只能取走两端的某个 \(1\)。
然后先手为了保持必胜会跟着后手取,所以先把两边相同的去掉。接下来先手想跟后手只能靠剩下的数每两位都相同来实现。
如果都相同了,那么简单模拟一下,发现只有 \(1\) 的个数为 \(4\) 的倍数时先手必胜。
Day 2
B
傻逼题,就我自己被诈骗。
考虑从当前数后面添加,每种余数向可以变成的数连边最后看走到 \(0\) 的最短路。
C
考场上想出来不会写,我是傻逼。
观察容易得出一个连通块满足条件当且仅当两边点数相等废话且是完全二分图。
然后就转化为给出一些二元组 \((a_i,b_i)\),将其划分成若干集合使得集合内部 \(\sum a_i=\sum b_i\) 的情况下 \(\sum(\sum a_i)^2\) 最小,这直接暴搜就完了。
D
考虑对第一组 dp,比如 \(f_{i,j}\) 为第一行选 \(i\) 个第二行选 \(j\) 个,需要考虑转移的时候挂上去的节点组的情况。
具体来说,第一行可以直接推,第二行有两种情况,一种是把当前节点组直接整个拆下来随便放,另一种是先拆掉第二行,把节点组的第一行拿出来 \(k\) 个再整个拆下来。
Day 3
喷出题人往 NOIP 模拟里出 SA。
B
设 \(f_{i,j}\) 为第 \(i\) 轮在 \(j\) 的最小花费,那可以直接暴力 \(O(nq^2)\),预处理前后缀最小值可以 \(O(nq)\)。
但是还不够,我们发现一个可行区间必然只走到端点,所以只转移区间端点,实现的时候可以用线段树维护区间最小值、推平不可行区间。
C
容易发现按照题目的要求不同的 \(f\) 的个数就是最终图中边双连通分量的个数。
这个边双个数可以通过 dp 求出来:设 \(dp_{i,j,k}\) 表示 \(i\) 子树内划分 \(j\) 个连通块、\(i\) 所在连通块有 \(k\) 条边的方案数,从下往上背包转移即可。对于 \(k=0\) 也就是 \(i\) 分离出来一个连通块的情况,我们在当前连通块里随便连边转移,这样会多出来至少一座桥。
然后假设最终需要 \(s\) 个边双那么就需要恰好 \(s-1\) 座桥,二项式反演一下可以知道它能够由至少 \(i\) 座桥的方案数求出,而这个方案数正好就是 \(f_{1,i+1,0}\)。
但是这个 dp 的复杂度太高了,我们曲线救国一波,先求关于连通块个数的生成函数 \(f_{i,k}(x)=\sum dp_{i,j,k}x^j\) 的点值,它是可以 \(O(n^2)\) 计算的(具体来说就是只进行两维 dp,上传到 \(k=0\) 就乘上 \(x\)),然后再插回来。
这样得到的信息没有变,但总复杂度就降低到了 \(O(n^3)\),可以通过。
D
玄妙的题,思想上很像优秀的拆分。
但是大纲都有了还往 NOIP 模拟赛里放后缀数据结构??
Day 4
你杜老师出题就是毒啊
C
不失一般性地假设 \(p\) 递增,那么显然 \(q\) 中的逆序对 \(i<j,q_i>q_j\) 满足 \(s_i=1\to s_j=1\)。
这样我们就可以对 \(q_i\ne0\) 的情况写出一个简单的 dp:记录满足 \(s_i=1\) 的最大 \(q_i\),如果当前 \(q_j<q_i\) 那么由上一定填 \(1\),否则都可以填。
然后发现这东西就是在算 \(q_i\) 的上升子序列个数(注意是任意上升子序列)。
然后就很容易扩展到有 \(0\) 的情况:设 \(f_{i,j}\) 为前 \(i\) 个数有 \(j\) 个 \(0\) 在上升子序列里的方案数,那么转移时枚举上一个不是 \(0\) 的,根据中间 \(0\) 的个数和能选的值的个数转移。
具体来说,枚举上一个非 \(0\) 位置 \(k\) 和 \(0\) 的个数 \(l\),中间有 \(a\) 个 \(0\),想选进来 \(b\) 个,\(q_k\) 和 \(q_i\) 中间能选的数有 \(c\) 个,那么转移就是 \(f_{i,l+b}=\sum \dbinom ab\dbinom cbf_{k,l}\)。
不难发现这东西是 \(O(n^4)\) 的,非常没有前途。
仔细观察我们的式子发现它像一个卷积,那么我们对于每个 \(i\) 写出关于 \(j\) 的生成函数,那么每次转移就是乘上一个 \(g_{a,c}(x)=\sum\limits_b\dbinom ab\dbinom cbx^b\)。
然后我们肯定是想知道点值快速卷积啦,但是暴力算会变成巨大常数还带 \(\log\),更加没有前途了,所以我们发掘一下这个点值的性质。
拆掉组合数可以发现对于任意点值 \(x\) 有 \(g_{a,c}(x)=g_{a-1,c}(x)+g_{a,c-1}(x)+(x-1)g_{a-1,c-1}(x)\),可以 \(O(n^3)\) 得到所有点值的 \(g\)。
然后我们就可以欢乐转移完插回去了。
D
很明显划分段数没用,因为不选的数可以看成划分为长度为 \(1\) 的段。
当前划分出来的段没有贡献当且仅当这段排序后等价于从中间断开再排序。
所以 dp 的时候减去没有贡献的段即可。
Day 5
C
最大值显然可以直接 dp 最大数 \(\le x\) 的方案数。
对于 \(K\ne1\),发现第 \(K\) 大 \(\le x\) 等价于有一个更小的 \(k\) 使得恰有 \(k-1\) 个 \(>x\),这个只需要 dp 然后容斥就行了。
D
阴间题。
发现暴力 dp 是过不掉的,找一些性质来优化。
然后发现那些度数 \(\ge3\) 的点一定是横纵坐标都和某个关键点相同的,这样就减少了很多状态,可以通过。
Day 6
构造场/jk
D
分类讨论一个圆会长成什么样,考虑把包含一个点集的大圆往里缩,先缩成圆周上有两个点,然后再往以这两个点为直径的方向缩并保持点集不变。
发现会缩出以下几种情况:包含一个点、以两个点为直径、锐角三角形外接圆和直/钝角三角形去掉直/钝角点。
对于后两种,我们可以枚举两个点,把剩下的按圆周角排序然后双指针扫一遍。
Day 7
签到失败,爬爬爬。
C
发现枚举 \(i,j\) 就可以计算它的贡献出现的次数,考虑优化。
反一下 \(\gcd\),枚举因子即可。
D
首先一个想法是暴力线段树维护,但是复杂度太高了,我们重新从部分分入手。
发现如果只在右边加减,我们就维护一个列的栈,计算每列到栈底的贡献。
如果两边都有加减,我们就平衡一下,从中间切开,两边各维护一个方向相反的栈。如果有一边被删空了就暴力重构。
Day 8
太棒了,花 NOIP 的钱打到了 NOI 模拟赛,真是物超所值!
A
发现打一枪之后网格就被分成了四个互不相干的子矩形,所以可以考虑区间 dp,转移时枚举分割点。
B
算一下贡献发现一段的贡献形状是固定的,只有两端点余数相同时会多出来一个,也就是乘上去一个贡献,可以子集 dp 算一下。
C
考虑用一张卡 \((a,b)\) 能走到哪,设 \(g=\gcd(a,b)\)。首先显然能够走到坐标都是偶数倍 \(g\) 的位置,剩下的要讨论 \(a/g\) 和 \(b/g\) 的奇偶性。一奇一偶时可以到达 \(g\) 的整数倍位置,否则只能到达所有 \(x/g\) 和 \(y/g\) 奇偶性相同的 \((x,y)\)。
两张卡叠加的情况讨论一下即可,然后跑一个最短路。
Day 9
C
观察面值,发现把所有的 \(1\) 给奇数后就是拿 \(1,2,5,10\) 凑。按照模 \(10\) 讨论。
D
由于要求的是近似值,所以硬展。
Day 10
终于打完了所有 rated 赛。
A
变成同时翻转差分数组的两个位置,然后就是直接连边,显然一个连通块至多需要翻转生成树,所以答案就是非树边随便选。
C
显然等价于一维的问题,下面只考虑 \(n=1\)。
容易发现如果一个回文中心的左侧回文区间内还有回文中心,那么就一定可以从左边折过来,右边同理。所以对于每个能从右边折过来的位置统计一下左边有多少能从左边折过来的位置即可。