摘要:
如果没有敌对关系,枚举一共选 \(i\) 个人,如果有 \(j\) 个人满足 \(i\in [l_j,r_j]\),那么方案数是 \(\binom{i}{j}\)。 接下来考虑限制,由于 \(m\leq 20\),考虑容斥,直接钦定一个集合 \(S\),其中所有为 \(1\) 的位置对应的限制必选, 阅读全文
摘要:
考虑一个分治:每次如果要用第一种,一定是给整个区间用,直到没有办法覆盖整个区间,用的次数是 \(\min_{i=L}^R a_i\) 次,减去它之后分别递归最小值的两边。注意到如果某一次不使用第一个操作,那么以后也都不会用了,此时操作总数就是不为 \(0\) 的位置个数。复杂度最慢也是 \(O(n^ 阅读全文
摘要:
首先,抽到一次鬼牌视作一次迭代,那么每次迭代的期望长度是一样的,即 \[ \begin{aligned} E(x)&=1\times\frac{m}{n+m}+2\times\frac{n}{n+m}\times\frac{m}{n+m-1}+\ldots+(n+1)\times(\prod_{j= 阅读全文
摘要:
考虑如果把同样的一段操作序列同时给两个串做,对答案是没有影响的。所以考虑把每个区间差分成后缀(不能是前缀,因为这样相同的操作序列在前面没法抵消),这样就可以表示区间了。两个串分别的对每个后缀操作之后得到的串可以 \(O(nk)\) 算出来,就是记录每个位置最终会被换到哪里就可以从右向左递推。 算出两 阅读全文
摘要:
由于一开始的序列中没有两个相同的 \(h\),猜测最终的序列中 \(h_i=h_{i+1}\) 的位置最多只有一个。大概可以这样感性理解:考虑从左到右做“滑坡”,如果之前 \(h_i=h_{i-1}\),那么后面要么 \(h\) 都不相同,要么有一个位置相同了会带动一段都 \(+1\),导致 \(h 阅读全文
摘要:
一共会走 \(2n-2\) 步,那么钦定第 \(i\) 步向右 \(\Rightarrow\) 和的第 \(i\) 位为 \(1\),向下为 \(0\)。考虑如何构造出满足这个条件的矩阵:假设当前位置 \((i,j)\) 从右下到左上位于第 \(k\) 条斜线,那么这个位置为 \((j-1)(2^k 阅读全文
摘要:
设 \(c_i=0/1\) 表示 \(i\) 有没有在 \(a\) 中出现,那么这个就是他自己和自己的差卷积,卷出来之后不是 \(0\) 的位置就都可以,每个可以的位置更新一下自己的倍数就行(或者使用狄利克雷前缀和,不过暴力做复杂度也过得去)。 差卷积就翻一下序列然后 FFT 就行了。 点击查看代码 阅读全文
摘要:
如果当前有 \(sum\) 个可以翻倍,那么考虑可不可以让前 \(sum\) 大的都翻倍。可以当且仅当这 \(sum\) 大的数不全能翻倍下一个数。如果全都能翻倍下一个数,那只能牺牲第 \(sum\) 大的数,最后可以再翻倍一个第 \(sum+1\) 大的。 然后有多次删除插入就用 set 维护一下 阅读全文
摘要:
把贡献看成边,那么会形成一个树形结构。有一个做法就是在树上做 dp 然后树状数组优化,\(O(n^2\log n)\)。 我的做法是,考虑一个区间 dp,设 \(f_{l,r}\) 表示所有在 \([l,r]\) 内的线段最多选多少个,这样就有一个 \(O(n^3)\) 的 dp。考虑什么情况的转移 阅读全文
摘要:
对于两种权值的分别贪心维护,最后枚举一种权值选多少个,另一个二分出来,总复杂度 \(2\log\)。 点击查看代码 #include<cstdio> #include<iostream> #include<queue> typedef long long ll; inline int min(con 阅读全文