题解合集

· · 个人记录

[P1] CF1239C / CF1248E [*2300]

模拟。

首先我们把所有人以 t_i 为第一关键字、i 为第二关键字进行升序排序。

显然,根据潜规则,排队的人的编号是单调递减的。我们用一个队列存正在排队的人,然后再用一个小根堆来存正在座位上暗中观察的人。

如果队列里没人,那么把排序后的人里面最靠前的入队。设队头打完水的时间为 L

然后我们依次枚举 t_i\le L 的每个人。

如果队列里最后一个人比他的编号大,那么这个人可以入队。(排队的人的编号单调递减)

否则这个人因为潜规则,只能暗中观察。

最后我们把队头的答案更新,然后 pop 掉。如果队列空了,那么让暗中观察的人里面编号最小的入队。

[P1] CF1251E2 [*2300]

并不是独立做出来的……

首先观察到一点:如果对于某个 m_i,有 \sum_j[m_j<m_i]<m_i,那么通过收买比 m_i 小的人不可能让它投票。

而且还有这么一条性质:如果有一个人免费给我投票,那么 m_i 比他小的都会给我投票。

那么从小到大贪心的策略不可行,也就是说我们必须「从大到小」地收买(并不是严格从大到小)。

考虑从大到小贪心,预处理 pre_x=\sum_i[m_i\le x],令 cnt 为已经收买的人数。如果对于某个 m_ipre_{m_i-1}+cnt<m_i,那么我们需要在 \ge m_i 的人里收买 m_i-pre_{m_i-1}-cnt 个人。

感性理解即可证明,不能通过收买第 i 个人来降低成本。

所以开个小根堆维护 \{p_j\mid m_j\ge m_i\} 即可。

[P1] CF1251D [*1800]

卡我常数,差评……

显然,左端点的中位数和右端点的中位数,所形成的闭区间内的数,一定都是合法的。且显然不在这个区间内的数一定不合法。

显然这个具有单调性,于是考虑二分。

check 的时候,把所有右端点 <mid 的和左端点 >mid 的先判掉,然后贪心即可。

[P1] CF1252K [*2200]

为什么这题有 2200。。。

线段树维护矩阵乘积,记得同时维护原串和反串的答案,然后 pushdown 的时候 swap 一下。

[P1] CF1252H [*1900]

屑题卡精度……

首先注意到任何一个矩形都可以被分成两个相等的小矩形,于是答案一定 \ge\max_i\{a_i\cdot b_i\}

然后考虑选择两个不同矩形的情况。

对于任何两个矩形 i,j,答案会等于 \max(\min(a_i,a_j)\cdot\min(b_i,b_j),\min(a_i,b_j)\cdot\min(a_j,b_i))

\min(a_i,a_j,b_i,b_j)=a_i,那么上式可以化为 \max(a_i\cdot\min(b_i,b_j),a_i\cdot\min(b_i,a_j)),也就是 a_i\cdot\min(b_i,\max(a_j,b_j))

注意到 A\times BB\times A 的矩形完全相同,我们可以让所有的 a_i\le b_i,这样上式可以进一步化简为 a_i\cdot\min(b_i,b_j)

我们将矩形按 a_i 升序排列,因为 a_i\le b_i,所以对于所有的 i<j,都有 \min(a_i,a_j,b_i,b_j)=a_i。那么我们只需要在从大到小枚举 i 的过程中维护 \min\{b_j\} 就好了。

[P1] P4602 [*2000]

首先很容易得到一个贪心策略:如果对于某个 k\sum_{d_i\ge k}l_i\ge L,那么用的钱最少的方法一定是从 d_i\ge k 里价格最小的开始,贪心地往上取。如果做完之后用的钱仍然 \ge g,那么称这个 k合法的。答案就是所有的 合法的 k 里面最大的。

显然,「贪心地往上取」可以将果汁按价格排序,然后通过各种二分做到单次 O(\log n)

注意到这个 合法性 也是单调的,也就是说,如果一个数 k 合法,那么比它小的显然都合法。

所以我们可以先二分 k,然后对每一个二分出来的 k 二分 check 合法性。

注意到一个重要的性质:cdecl 不会整体二分。所以我们必须使用在线做法。

那么问题就变成了:在序列中插入一个数,在历史版本上进行一些二分操作。

可持久化序列!主席树!然后在历史版本的线段树上二分即可。

注意一个细节:二分的时候,如果发现线段树里的 \bf\sum l_i 比查询的 \bf L 小,那么直接返回 INF。

现在感觉主席树挺自然的,不像刚学的时候那么突兀了(

[P1] CF1208D [*1900]

首先,显然 1 的位置是序列中最后一个 0 出现的位置,而且每一个数对后面所有比它大的数有贡献。

考虑从小到大依次填数,令当前枚举到了 i,每一次找到这个序列里最后出现的 0 的位置,然后把那个位置改成 INF,并将它后面的数字全部减去 i

[P1] CF1239D [*2400]

注意一下题目的限制条件:每个人都认识自己的猫,选出来的人和猫总数必须 \bf=n

也就是说,\bf i 人和第 \bf i 只猫必须也只能选一个。这让我们想到 2-SAT。

\bf x 个人认识第 \bf y 只猫 可以转化为 x=\texttt{true}\to y=\texttt{true}。那么根据 2-SAT 的套路,这个限制可以转化为 x\to y 的一条有向边。

然后我们发现所有的 \texttt{false} 点都不会有边,所以我们只需要 n 个点了。

如果上面建出来的图出现了 SCC,那么里面必须同时选 \texttt{true}(人)或者同时选 \texttt{false}(猫)。

注意到如果不考虑 1\le j,p 的限制,全部选人一定是合法的。那么我们只要把一个强连通分量里选成猫,其它的都选人就行了。

所以如果只有一个强连通分量,那么无解。否则把某个缩点后入度为零的 SCC 全部选猫,然后其它选人即可。

[P1] CF1238F / P3174 [*2300]

????为什么这破题能有 *2300。。。

首先注意到,不能有三个区间互相相交,也就是说,只能是一个区间完全覆盖另一个,或者两个区间重叠一部分。

完全覆盖的点都是叶子,重叠一部分的点形成了一条链。这张图显然是一条毛毛虫。

求一棵树上的最大生成毛毛虫显然可以直接 DP。

虽然题比较傻逼,但是恶评 + 双倍经验我觉得海星(

[P1] P4281 [*500]

答案显然是 \operatorname{LCA}(x,y),\operatorname{LCA}(x,z),\operatorname{LCA}(y,z) 中的一个。傻逼题。

[P1] CF1238E [*2200]

这个题的套路我见过。。

dp_SS 这个集合中最小的 slowness。包括所有完全的和不完全的。(不太好描述)

\displaystyle c_{x,y}=\sum_{i=1}^{n-1}[s_i=x\land s_{i+1}=y]

S 集合向外延伸的链的数量是 f(S)。那么显然有 \displaystyle f(S)=\sum_{i\in S}\sum_{j\not\in S}c_{i,j}

那么令 S-S'=\{x\},可以写出转移方程 dp_S=dp_{S'}+f(S')

然后开始化式子。

\begin{aligned}&f(S')\\=&\sum_{i\in S'}\sum_{j\not\in S'}c_{i,j}\\=&\sum_{i\in S}\left(\sum_{j\not\in S}c_{i,j}+c_{i,x}\right)-\left(\sum_{j\not\in S}c_{x,j}+c_{x,x}\right)\\=&f(S)+\sum_{i\in S}c_{i,x}-\sum_{j\not\in S}c_{x,j}\end{aligned}

初始值 dp_\varnothing=0。然后按照这个式子 DP 就好了。

其实直接把所有的 f(S) 预处理出来,就没那么多事了……

[P1] P4592 [*500]

这题太无聊了吧……出在 TJOI2018 也是很魔幻了……

树剖、树上差分、可持久化 Trie 板子题,不想写题解了,太傻逼了。

吐槽一下,为什么我在树剖里面查询(O(q\log^2 n))和在外面树上差分 (O(q\log n)) 跑得一样快啊,是我复杂度算错了还是出题人太傻逼了……

[P1] P2824 [*1800]

题目越来越水了。。在切水题的路上越走越远(

二分答案。在线段树上维护 b_i=[a_i<mid]0 的数量和 1 的数量。

众所周知,对 01 序列排序是十分简单的,然后就可以直接做了。

复杂度 O(n\log^2n)

貌似有 O(n\log n) 的做法,有时间再看看吧。。

[P1] P1081 [*1600]

预处理 a_{i,j} 为从 i 开始走 2^j 轮之后,A 行驶的距离,b_{i,j} 同理,f_{i,j}2^j 轮之后的位置。

然后没了,只不过细节有点卡。

[P1] CF1256E [*2200]

挺有意思的一道题……

如果某个字符串里某种字符的出现次数和另外一个字符串的不一样,那么肯定是 NO

注意到一点:交换两个不同字符会改变逆序对的奇偶性。而且显然,答案是 YES 当且仅当两个字符串能够同时被排好序,而能同时被排好序等价于逆序对奇偶性相同。

那么我们可以得到一个思路:如果两个字符串中所有字符的出现次数一样,且奇偶性相同,那么 YES,否则 NO

但是还有一个特例:如果一个字符串里有两个相同字符,且两个串的所有字符的出现次数一样,那么也是 YES。因为如果对这两个相同的字符进行交换,并不会改变逆序对的奇偶性。

[P1] P3215 [*2300]

先考虑静态 + 全局查询的情况。

首先,可以一直将最左边的左括号和最右边的右括号匹配。最后剩下的一定是 )))))...(((((( 这样的括号串。

然后每一次操作可以消除一对同方向的括号。如果有两个不同方向的括号,那么需要两次操作才能消除。

(1)-1,最小前缀和为 \text{lmn},最大后缀和为 \text{rmx},那么 QUERY 的答案就是 \lceil|\text{lmn}|/2\rceil+\lceil\text{rmx}/2\rceil

\texttt{这里插播一条重要新闻:神鱼啊可爱哦爱!}

翻转操作只是把 前缀和后缀和、左儿子和右儿子翻转了,反转操作只是把 1-1 翻转了,也就是最小值和最大值翻转,然后全部取相反数。

所以用平衡树维护最大最小的前缀后缀即可。

[P1] P4556 [*2000]

考虑树上差分。链上加可以表示为 +x, +y, -\operatorname{LCA}(x, y), -fa[\operatorname{LCA}(x,y)]

显然,如果对每一种颜色跑一遍 DFS 是会 T 飞的。我们要想一个办法,快速地合并所有儿子的操作信息。只用一遍 DFS 处理完所有的颜色。

考虑线段树合并。

在每一个点上开一棵动态开点权值线段树。每一次操作可以转化为在某一个点的线段树上单点修改。

[P1] GSS2 [*2000]

离线所有询问,将所有询问按照右端点排序。枚举 r=1\to n,在 i 号点维护 a_i,\ldots a_r 去重后的和,那么每次询问可以转化成查询区间历史最大值,每次移动右端点可以转化成区间修改。

>_<

[P1] AT2388 [*2500]

妙题啊……

a_{n+1}a_1,a_2,\ldots,a_n 的异或和,b_{n+1} 同理,那么每次操作相当于交换 a_i,a_{n+1}

那么我们很容易想到一道初赛题:

求最少交换几次,可以让原序列排好序。

同理,我们在 a_ib_i 之间连边。这里先假设 a 中的所有数字之间互不相等。

如果形成了一个长为 n 的环,那么我们需要 n+1 次操作。所以只需要枚举所有环就可以得到答案。

比如 n=3,a=[1,2,3,0],b=[2,3,1,0],需要 4 次操作。(其中 a 的最后一位是 a_{n+1}b 同理)

接下来考虑可以有数字相等的情况,但是 a_1\sim a_n 中的所有数字都不和 a_{n+1} 相等。

如果有两个环中存在相同的数字,那么其中一个环就可以少用一次操作。

比如 n=6,a=[1,2,3,1,2,3,0],b=[2,3,1,2,3,1,0],只需要 7 次操作。

具体的方法自行思考。

然后考虑没有特殊限制的情况。

和前面一种情况类似。如果某个数(无论 a,b)在环中,且和 a_{n+1}b_{n+1} 相同,您可以节省一次操作。

比如 n=3,a=[1,2,0,3],b=[2,3,1,0],只需要 3 次操作。因为 a_3=b_4,b_2=a_4

但是注意,这种情况最多节省一次操作。

最后考虑无解的情况。

显然,如果 a,b 排序后(a_{n+1},b_{n+1} 参与排序)不完全相等,那么无解。

[P1] CF446C [*2600]

众所周知,F(n)=\frac{\sqrt5}5\left[\left(\frac{1+\sqrt5}2\right)^n-\left(\frac{1-\sqrt5}2\right)^n\right]

观察到 \sqrt5\equiv383008016\pmod{10^9+9},也就是说:

X=691504013,Y=308495997,Z=276601605

那么 F(n)\equiv Z(X^n-Y^n)\pmod{10^9+9}

所以用线段树维护区间加 [ZX,ZX^2,\ldots],[-ZY,-ZY^2,\ldots] 就好了。

[P0] HDU3709 [*1400]

数位 DP 入门题。。

枚举支点,把 a=b 转化成 a-b=0。设 dp_{i,j,k} 为前 i 位,支点是 j,两边力矩的差为 k 的方案数,然后直接跑数位 DP 就好了。

然后我闲得蛋疼用另一种方法重写了这题:

设支点为 pos,那么一个数 \overline{a_1a_2\ldots a_n} 两边力矩之差为 \displaystyle\sum_{i=1}^na_i(i-pos)=-\left(\sum_{i=1}^na_i\right)pos+\sum_{i=1}^na_i\cdot i

\displaystyle A=-\sum_{i=1}^na_i,B=\sum_{i=1}^na_i\cdot i,那么这个数是平衡数当且仅当 -\frac BA\in\mathbb Z,1\le-\frac BA\le n

所以我们可以设 dp_{i,A,B} 为前 i 位,两边力矩之差的一次项系数和常数项分别为 A,B 时的方案数。

然后发现 sb HDU 只开了 64MiB……

在本地测试极限数据之后,把数组压成了这样:int dp[19][163][1540];

然后发现只有不到 40MiB,交上去发现过了 2333

UPD:

前一种 DP 相当于是:dp_{i,j,k} 为前 i 位,f(j)=k 的方案数。

后一种 DP 相当于是:dp_{i,j,k} 为前 i 位,f(x)=j\cdot x+k 的方案数。

事实上,因为 f(x) 是一个一次函数,所以只要两个点值就可以确定。不知道能不能搞出一种奇怪的做法……

所以能不能钦定 x_0,x_1,令 dp_{i,j,k} 为前 i 位,f(x_0)=j,f(x_1)=k 的方案数啊(

实际上只是用不同的方式表示了 f(x)

[P0] CF401D [*2000]

???刚学记搜的都能 AC 吧,tm 还是紫的……

建议难度:绿(我也不知道这个 *2000 是怎么评出来的)

考虑对每种数字的出现次数状压。令输入的数 n 中,数码 i 出现了 a_i 次,c_i=\prod_{i=0}^{i-1}(a_i+1),c_0=1,那么我们可以让每一个 10 元组 (x_0,x_1,\ldots,x_9) 对应一个数 \sum_{i=0}^9c_ix_i,而且这些数是从 0 开始连续编号的。

显然,三元组的数量不会超过 3^{10}=59049,所以直接记搜就好了。

[P0] HDU4734

sb 题

[P0] HDU4389

\sout{dp_{i,j,k}} 为前 \sout i 位,数字和为 \sout j,膜 \sout{\operatorname{lcm}(1,2,3,\ldots,81)=k} 的方案数。

这显然做不了啊喂!

分段打表不太清真,然后我看了下题解:

81 次 DP,每次钦定一个数字和 k。设 dp_{i,j,k,l} 为前 i 位,当前数字和为 jj\bmod k=l 的方案数。

>_< wtcl

[P0] P1297 [*800]

sb 题

每个选项的选择概率是 \frac1{a_{i-1}},正确率是 \frac1{a_i},有 \min(a_i,a_{i-1}) 种 AC 的事件。所以 AC 第 i 题的概率是 \frac{\min(a_i,a_{i-1})}{a_ia_{i-1}},即 \frac1{\max(a_i,a_{i-1})}

[P0] P4316 [*800]

sb 题

p_i1\to i 的概率,dp_i1\to i 的期望长度,d_ii 的出度,那么对于所有的 x\xrightarrow{w}nx,有 dp_{nx}=dp_{nx}+\frac{dp_x+w\cdot g_i}{d_i}

[P0] P2473 [*1600]

简单题

dp_{i,S} 为,1\sim(i-1) 吃掉的宝物集合为 S 的期望得分。为了方便区分,令第 i 个宝物的前提宝物集合为 s_i 而不是 S_i,为了统一大小写 (?),令它的得分为 p_i

对于任意的 j\in[1,n]

如果 i>k,那么期望得分显然是 0。然后按照上面的 DP 即可。

[P1] CF461B [*2200]

dp_{i,0/1} 为子树 i 的划分方案数,且 i 所在的连通块 有/没有 黑点。

那么对于某个 i 的儿子 u,有:

所以转移就好了,答案是 dp_{1,1}

[P1] P2221 [*1900]

题目让我们维护的是 \displaystyle\sum_{i=l}^r\sum_{j=i}^r\sum_{k=i}^ja_k

考虑分别计算每一个数对答案的贡献。上式可以化成 \displaystyle\sum_{i=l}^ra_i(i-l+1)(r-i+1),也就是 \displaystyle\sum_{i=l}^ra_i[-i^2+(l+r)i+(-lr-l+r+1)]

所以我们只要分别维护 a_i,i\cdot a_i,i^2\cdot a_i 就好了。

[P1] CF1282D [*2300]

考虑「300a」和「300b」两个字符串与目标串的编辑距离。

显然「300a」和目标的编辑距离等于 300-\texttt{a 的数量},「300b」同理。

a 的数量和 b 的数量加起来,即可得到目标串的长度 n

考虑「na」和目标串的编辑距离。显然它会等于 n-\texttt{a 的数量}

考虑「1b(n-1)a」和目标串的编辑距离。如果目标串的第一位是 b,那么这个编辑距离一定会小于「na」的。我们可以根据这个来判定原串的第一位是 a 还是 b

同理,我们每一次查询可以得到目标串的一位。但是我们需要 3 次查询进行「预处理」。

注意到我们已经有 a 的数量和 b 的数量了。所以最后得到目标串的最后一位并不需要查询。总查询次数 3+n-1=n-2

[P1] CF1278E [*2200]

显然,同一个点的所有儿子对应的区间一定是互相包含的。我们可以很容易地得到类似下面的构造方式(其中 a, b, c 都是 x 的儿子):

---- x ------
         ------ a --------------------------------
                                               ----- a 的子树 -----
          ----- b -------------
                            ----- b 的子树 -----
           -- c --
               -- c 的子树 --

具体的实现方式:在每一个点的右端点左右插入儿子区间的左右端点,最后重标号。

[P1] CF1278D [*2100]

考虑先计算边数。如果对于两个区间 [l,r],[x,y],有 x<l<y<r,或者 l<x<r<y(题目保证所有端点互不相同),那么 [l,r],[x,y] 有交。

注意到如果按上述方法统计,每一对区间会被算两遍。所以我们只需要考虑其中一种情况,比如 x<l<y<r

然后用类似扫描线的方法统计即可。

[P2] CF1282E [*2400]

感觉挺难想的,看完题解之后又恍然大悟……

考虑建出原多边形三角剖分的对偶图。那么如果两个三角形之间有两个公共点,它们之间肯定有一条公共边,所以它们对应的点之间在对偶图上有一条边。

考虑先求出 q。这个排列的定义是,按照从前往后的顺序删除三角形,剩下的部分仍然是 一个 凸多边形。显然我们只需要把度数为 0 的点依次删掉就好了,做法类似拓扑排序。

然后考虑怎么求出 p。注意到按照倒序把 q 中的三角形合并进多边形,得到的一定还是一个凸多边形。所以我们可以用一个链表维护当前凸多边形的 p,然后每一次显然会多加入一个点,就把这个新加入的点插入在已经存在的两个点之间就好了。

[P2] CF1270E [*2300]

我讨厌数学 /dk

按照点的 x,y 的奇偶性把它们分成 S_{0,0},S_{0,1},S_{1,0},S_{1,1}

如果 A=S_{0,0}\cap S_{1,1} 非空,且 B=S_{0,1}\cap S_{1,0} 非空,那么 A,B 是一个合法的分法。

否则 A,B 中存在一个集合是空集。将另一个集合按照某一维(比如 x)坐标的奇偶性分成两个集合,如果两个集合都非空,那么这也是一个合法的分法。

容易写出 A=S_{0,0}\cap S_{0,1},B=S_{1,0}\cap S_{1,1}

如果还是不满足条件,那么将所有坐标除以二下取整。然后重新进行上面的过程。

感性理解即可

[P1] P4516 [*2000]

dp_{i,0/1,0/1} 为以 i 为根的子树中,i 是否被监听,是否被选中且其它点都被监听的泛化物品。

对于某一条边 x\to y,其中 xy 的父亲时,合并 dp_xdp_y 的方法如下:

[P1] HDU5290 [*1900]

dp_{i,j} 为:

显然 j\in[-100,100],且 dp_{i,j} 一定会小于等于 dp_{i,j+1}

对于某一条边 x\to y,其中 xy 的父亲时,合并 dp_xdp_y 的方法如下:

初值 dp_{x,x_w}=1,dp_{x,-1}=0,然后做一遍后缀 min。

[P1] P3267 [*1900]

感觉和前一道题本质相同……

注意一下 i 不需要被监视时,dp_i 的初值即可,没有什么难点。

[P1] P4622 [*1700]

注意「除了开头和结尾那个数」这条限制,它告诉我们了下面的信息:

那么设 dp_{i,j}a_i=j 时的合法方案数。如果 a_i=-1 显然有 dp_{i,j}=dp_{i-1,j-1}+dp_{i-1,j}+dp_{i-1,j+1}

[P2] CF348E [*2800]

神仙题……

考虑选出一条直径,那么相当于其它的子树都是挂在直径下面的。设直径为 A\leftrightarrow B,根为 A

考虑每一个点会与哪些点产生联系。设某棵子树的根为 x,那么这棵子树里的点会与所有子树外的,与根的距离等于 \max(A\leftrightarrow x,B\leftrightarrow x) 的点产生联系。

令这个点集为 S,那么如果 xS 中所有点的路径的交中的点被删除,那么 x 将失去与所有点的联系。

然后分类讨论:

那么删除一个在 A\leftrightarrow B 上的点 y,有下面三种子树会对答案有贡献:

如果删除一个不在 A\leftrightarrow B 上的点,这个点所对应的子树中黑点个数就是答案。

[P2] P3989 [*2500]

神仙题……

首先,当 n>21 时肯定无解。

然后考虑设 dp_S 为,对于 S 集中的字母,最早的合法位置。

f(i,j) 为第 i 个位置后,第一次出现 j 的位置。

考虑枚举排列中的最后一位,可以得到 dp_S=\max_{i\in S}f(dp_{S\backslash i},i)

[P2] 0117C [*2000]

dp_{l,r} 为将 [l,r] 这个区间归原的方案数。

枚举分界点 i\in[l,r),那么答案就是 \binom{r-l-1}{i-l}dp_{l,i}dp_{i+1,r}。因为顺序可以随意指定。

可以通过做前缀后缀 min max 去掉 check 的部分,将复杂度将至 O(n^3)

[P1] AT2163 [*1800]

如果出现了两个相邻的数字,那么它上面一定也是两个相邻的数字。

在排列的中心构造一下即可。

[P1] AT2165 [*2000]

二分答案。

f_i=[a_i\le mid],那么考虑找到离中间最近的长度为 2 的连续段。如果是 0,那么 ans>mid,否则 \le mid。特判掉 0,1 交替出现的情况。

[P1] CF895C [*2000]

首先注意到我们只需要考虑每个质因子出现次数的奇偶性,所以可以状压。

然后我们用一个集合 S 来表示所有出现次数为奇数的质因子。

\displaystyle cnt_x=\sum_{i=1}^n[a_i=x]A_ii 中出现次数为奇数的质因子,dp_{i,S} 为原数组中所有 \le i 的数拼出集合 S 的方案数。

然后有 dp_{0,\varnothing}=1,转移分以下两种情况:

。答案是 dp_{70,\varnothing}-1

[P1] CF786B [*2600]

线段树优化建图板子。具体见其它题解。

[P1] CF776D [*2000]

直接建 2-SAT 就好了,然后您会发现这个只需要用并查集,然后就做完了。

[P1] P3825 [*2500]

枚举原串中的每一个 x 要变成 a 还是 b,然后 2-SAT。

[P1] ARC103F [*2400]

略。

[P1] ARC103D [*2000]

可以用 1,2,4,\ldots,2^{30} 构造出任何满足 2\mid(x+y),x+y<2^{31} 的点。

显然如果 x+y 奇偶性不同就是无解,否则可以用 (1),1,2,4,\ldots,2^{30} 构造出来。

[P1] ARC030D [*2200]

略。

[P1] BZOJ2818 [*1900]

略。

[P2] CF576D [*2600]

将所有的边按照 d 从小到大排序,然后依次考虑只允许使用前 i 条边的最短路。

首先令 can_{i,j,k} 表示能不能在 d_i 时刻从 j 号点到达 k 号点,dis_{i,j,k} 仅仅使用前 i 条边从 j 号点到达 k 号点的最短路,排完序后的前 i 条边构成的邻接矩阵为 G_i

那么 can_i=can_{i-1}\times G_i^{d_i-{d_{i-1}}},其中乘法是矩阵乘法。

然后考虑更新最短路。dis_{i,j,k}=\min(dis_{i-1,j,k},dis_{i-1,j,x_i}+1+dis_{i-1,y_i,k})

最后对于每一个能从 1d 步到达的点,因为限制了只允许使用前 i 条边,且前 i 条边已经被解锁了,所以可以直接对于所有 can_{1,j}=1jans\leftarrow\min(ans,d+dis_{i,j,n})

[P1] CF1149B [*2200]

直接 DP 就行了。

[P1] CSAcademy - Manhattan

\begin{aligned} &\text{let}~f(k)=\min(x_2+k,x_4)-\max(x_1+k,x_3)+1,\\ &\text{assume that}~y_2<y_3,\text{then}\\ &\sum_{a=x_1}^{x_2}\sum_{b=y_1}^{y_2}\sum_{c=x_3}^{x_4}\sum_{d=y_3}^{y_4}\binom{|a-c|+|b-d|}{|a-c|}\\ \xlongequal{k=a-c}&\sum_{k=x_3-x_2}^{x_4-x_1}f(k)\sum_{b=y_1}^{y_2}\sum_{d=y_3}^{y_4}\binom{|k|+|b-d|}{|k|}\\ =&\sum_{k=x_3-x_2}^{x_4-x_1}f(k)\sum_{b=y_1}^{y_2}\sum_{d=y_3}^{y_4}\binom{|k|+d-b}{|k|}\\ =&\sum_{k=x_3-x_2}^{x_4-x_1}f(k)\sum_{b=y_1}^{y_2}\left[\binom{|k|+y_4+1-b}{|k|}-\binom{|k|+y_3-b}{|k|}\right]\\ =&\sum_{k=x_3-x_2}^{x_4-x_1}f(k)\sum_{b=y_1}^{y_2}\left[\binom{|k|+y_4+1-b}{|k|+1}-\binom{|k|+y_3-b}{|k|+1}\right]\\ =&\sum_{k=x_3-x_2}^{x_4-x_1}f(k)\left[\binom{|k|+y_4-y_1+2}{|k|+1}-\binom{|k|+y_4-y_2+1}{|k|+1}-\binom{|k|+y_3-y_1+1}{|k|+1}+\binom{|k|+y_3-y_2}{|k|+1}\right]\\ \xlongequal{p=|k|+2}&\sum_{k=x_3-x_2}^{x_4-x_1}f(k)\left[\binom{p+y_4-y_1}p-\binom{p+y_4-y_2-1}p-\binom{p+y_3-y_1-1}p+\binom{p+y_3-y_2-2}p\right]\\ \end{aligned}

屑出题人

[P1] P3658 [*1900]

i 在排列 A 中的出现位置为 a_iB 中为 b_i

那么实际上就是要求出有多少对 (i,j) 满足 |i-j|>k,a_i<a_j,b_i>b_j

然后就是三维偏序裸题了。

[P1] P4169 [*1900]

对于两个点 (x,y),(x',y'),如果 x'\le x,y'\le y,那么 x'+y' 最大的点距离 (x,y) 最近。

所以我们可以把平面旋转四次,然后取每次答案的 \min

[P2] CF1045G [*2200]

对于两个机器人 (x,r,q),(x',r',q'),如果满足 |x-x'|\le\min(r,r'),|q-q'|\le K,那么它们可以交流。

考虑按 r 降序排序。假设 r\le r',那么只需要满足 |x-x'|\le r,|q-q'|\le K,即 x-r\le x'\le x+r,q-K\le q'\le q+K

然后就是裸的二维数点了。

[P1] CF528D [*2500]

\begin{aligned} &\text{let}~S_c(x)=\sum_{i=0}^{n-1}[\exists i-k\le j\le i+k,S_j=c]x^i,\\ &~~~~\,\,T_c(x)=\sum_{i=0}^{m-1}[T_i=c]x^i,T'_c(x)=\sum_{i=0}^{m-1}[T_{m-i-1}=c]x^i.\\ &ans_i\\ =&\sum_{j=0}^{m-1}\sum_{k\in\{A,T,G,C\}}[x^{i+j}]S_k(x)\cdot[x^j]T_k(x)\\ =&\sum_{k\in\{A,T,G,C\}}\sum_{j=0}^{m-1}[x^{i+j}]S_k(x)\cdot[x^{m-j-1}]T'_k(x)\\ =&\sum_{k\in\{A,T,G,C\}}[x^{m+i-1}]S_k(x)\cdot T'_k(x)\\ \end{aligned}

然后直接乘就完事了

[P(-1)] CF342E [*400]

傻逼题

不说了,伤心

[P1] P3242 [*2100]

假设 dfn_x\le dfn_y

如果 xy 的祖先,假设 zxy 为根时的父亲,那么 (x,y)(u,v) 的子路径当且仅当 1\le dfn_u<dfn_w,dfn_y\le dfn_v<dfn_y+sz_ydfn_y\le dfn_u<dfn_y+sz_y,dfn_w+sz_w\le dfn_v\le n

否则 (x,y)(u,v) 的子路径当且仅当 dfn_x\le dfn_u<dfn_x+sz_x,dfn_y\le dfn_v<dfn_y+sz_y

然后就变成给一堆矩形和一堆点,求覆盖每一个点的矩形的权值 k 小。

然后扫描线 + 整体二分。

[P2] P2619 [*2300]

考虑一个偏移量 ofs,把所有白边全部加上 ofs 跑 Kruskal。

注意到 ofs 越小,选的白边数量越多。那么我们可以二分 ofs,直到选的白边数量 =k。此时答案就是 MST 边权 -k\cdot ofs

如果对于某个 ofs=mid,选的白边数量 >k,但是当 ofs=mid+1 时,白边数量却 <k 了,那么切换成黑边的这些白边一定是边权相等的(证明略)

即在 ofs=mid 时,一定有一个选白边数量 =k 的合法方案,它的权值和与选 >k 条白边的这个方案相同。

Kruskal 的时候,遇到相同的边权优先选白边。

[P1] P4072 [*2200]

\displaystyle dp_{i,j}=\min_{k<i}\{dp_{k,j-1}+(s_i-s_k)^2\} \begin{aligned} dp_{x,j-1}+(s_i-s_x)^2<dp_{y,j-1}+(s_i-s_y)^2\\ dp_{x,j-1}-2s_is_x+s_x^2<dp_{y,j-1}-2s_is_y+s_y^2\\ \frac{dp_{x,j-1}-dp_{y,j-1}+s_x^2-s_y^2}{s_x-s_y}<2s_i\\ \end{aligned}

f(x)=dp_{n,x}。显然这个 f(x) 随着 x 的增加是单调递减的,然后可以感性理解它是下凸的,即导数递增。

注意到如果我们不考虑次数,直接进行 DP,那么得到的答案一定是 f(x) 的极值,即 f'(x) 的零点。但是我们要求的是 f(m) 的值。

于是我们可以考虑二分一个 k,然后设 g(x)=f(x)+xk,g'(x)=f'(x)+k。那么 g'(x) 的零点是关于 k 单调的。

如果对于某个 kg'(m)=0,那么 f(m)=g(m)-km

然后这个 k 的范围应该是 f 的值域。\color{white}\sf{斜率单调才可以单调队列,否则必须二分}

如果对于某个 k,答案 >m,但是 k+1 时,答案 <m,那么可以证明,在 k+1 时,存在一个答案 =m 的最优解。

然后后面就开始出现大量的简单题了:

[P0] P2502 [*1200]

暴力做 m 遍 MST 就完事了。

[P0] P1197 [*800]

经典套路,把询问全部倒过来。

[P0] P3465 [*1200]

其实就是找到一些不相交的基环外向树,且它们包含图中所有的点。

[P0] P5937 [*800]

前缀异或和,然后 2-SAT,然后用并查集做就好了。

[P0] P5214 [*800]

线段树分治 + dsu。

[P1] P5633

同 P4072。

[P1] P5631

权值为 x 的边会在 [0,x)(x,10^5] 出现,然后按照这个做线段树分治。

[P1] CF938G [*2900]

首先线段树分治,然后我们只需要处理询问 1 和询问 3 了。

然后注意到 x\to y 的异或和等于 x\to rt 的异或和异或上 y\to rt 的。所以可以用带权并查集维护。

然后就和 P4151 一样了。

[P1] AGC038D [*2000]

显然,所有 op=0 的限制上的点形成了一片森林。

然后所有 op=1 的点形成了一个环。

如果所有的限制都满足 op=0,那么 m 可以取到 n-1,因为可以把所有点放在一棵树上。

边数的上界是把从每个连通块里选一个点,连成完全图,然后加上森林的边。设连通块数为 cnt,那么边数上界为 n-cnt+cnt(cnt-1)/2