题目分析: 好像跑得很快,似乎我是第一个启发式合并的. 把玩具看成区间.首先很显然如果有两个玩具的进出时间有$l1<l2<r1<r2$的关系,那么这两个玩具一定在不同的栈中间. 现在假设一定有解,我们怎么得到答案呢?排序会使得计算变得方便,下面我们按照左端点排序. 想象一条扫描线,从左往右,当它遇到了一个区间的左端点的时候,我们尝试着将原先不在一起的合并,所有和这个不同栈的都被合并. 我们可以想象一个并查集,使用堆维护并查集.堆内存储并查集内元素的右端点.在最外面再用一个大堆来存储每个并…
题意 你有两个栈,有 \(n\) 个货物,每个货物有一个进栈时间和出栈时间(所有时间的并集是1~2n),问有多少种不同的入栈方案. \(n\le 10^6\) 分析 把每个货物的存在看成区间,相交的区间不能在同一个栈中.这样就有了 \(O(n^2)\) 连边的方式,再用二分图染色判断一下是否合法即可.合法方案数就是 \(2^{连通块个数}\). 考虑将所有区间按照左端点排序,用一个 set 维护和当前区间相交的区间.由于不能出现三元环所以所有和当前区间相交的区间都是包含关系,这种包含区间之间形成…
Description 小M有两个本质不同的栈. 无聊的小M找来了n个玩具.之后小M把这n个玩具随机顺序加入某一个栈或把他们弹出. 现在小M告诉你每个玩具的入栈和出栈时间,现在她想考考小S,有多少种方案,把每个玩具分配给两个栈之一,并且存在一种满足小M告诉你的入栈和出栈时间的入栈序列. 可怜的小S当然不知道啦,所以他求助于你. Solution 考虑把存在矛盾的玩具连边,设 \(k\) 是最后的连通块数,如果这个图是二分图,那么答案就是 \(2^{k}\) 这样连边是 \(O(n^2)\) 的,…
http://uoj.ac/problem/356 题解 思路和\(NOIP\)双栈排序差不多. 对于两个元素,若\(l_1<l_2<r_1<r_2\)那么它们不能在一个栈里,我们连一条边. 若最后的这张图是二分图,那么答案就是\(2^{联通块个数}\). 这道题就是要我们优化连边. 我们把所有线段按照左端点排序,然后我们用平衡树按照右端点为关键字维护已经扫描过去的线段. 发现要和当前扫描到的线段连边的是平衡树上\(dfs\)序连续的一段区间. 考虑这个边怎么连. 我们只需要在这个区间的…
暴力就是O(n^2)连边,二分图,这样只有22分. 我们考虑优化建边,我们按照左端点排序,对于一个新加进来的线段,我们向左端点距其最近的和他相交的线段连边,别的相交的我们连同色边,当一个点连了两条同色边我们就把它删掉,复杂度O(nlogn),边数O(n). #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #…
Description 小S和小M去看花火大会. 一共有 n 个人按顺序排成一排,每个人手上有一个仅能被点燃一次的烟花.最开始时第 K 个人手上的烟花是点燃的. 烟花最多能燃烧 T 时间.每当两个人的位置重叠且其中一个人手上的烟花是点燃的时,另一个人手上的烟花可以被点燃. 现在小M想要知道,每个人至少需要以多快的速度 s 奔跑,才能使得每个人手中的烟花都能被点燃. 可怜的小M当然不会啦,所以她向你求助. Solution 首先二分答案,算出一个人点燃烟花后最多可以走的距离 \(s\) 要猜一个结…
自己的AC做法似乎离正解偏了十万八千里而且复杂了不少--不管怎样还是记录下来吧. 题意: 题目链接: JOISC2017 F - AtCoder JOISC2017 F - LOJ \(N\)个车站排成一行,第\(i\)个车站有一个在\([1,M]\)之间的权值\(l_i\).有\(M\)种列车,第\(i\)种在所有满足\(l_j \geq i\)的车站\(j\)停靠.如果搭乘一种列车从\(u\)到\(v\),需要在\(u\).\(v\)之间的所有停靠站(包含\(u\)和\(v\)),各停车一次…
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4388 题解 模拟Prim算法? 原题所述的过程就是Prim算法求最大生成树的过程.于是我们可以知道起始点并没有影响. 那么就用数据结构模拟Prim算法吧. 首先离散化所有区间,每个区间只需要一个点和外面相连,其余点均按照覆盖该点区间的最大权值与这个点相连.因此简单利用线段树即可求出这一部分的答案. 对于剩下的部分,用维护\(T\)表示目前没有加入的点,先加入左边\(1\)号点,同时用大…
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4221 题解 orz WYC 爆切神仙DP 首先将所有袋鼠按大小排序.考虑从前往后DP, 设\(f[i][j]\)表示前\(i\)个元素形成了\(j\)条链. 然而需要处理"套到不能套为止"的问题,因此再加一维: \(k\)表示目前有多少个元素确定了必须要套后面的袋鼠. 设\(cnt[i]\)表示有多少个别的袋鼠能套\(i\). 那么从\(i-1\)转移到\(i\)时\(k\)…
题目链接 https://loj.ac/problem/2731 题解 首先一个很自然的思路是,设\(dp[i][j]\)表示选了前\(i\)列,第\(2\)行第\(i\)列的格子是第\(j\)个被填上的. 还要加个第三维\(0/1\),表示第\(2\)行第\(i\)列不是/是这一列最后一个被填上的(这决定了它是被上下填上还是被左右填上). 转移: 若第\(2\)行第\(i\)列是棋子,则所有的都转移到\(f[i][0][0]\). (1) \(0\rightarrow 0\), 两个互不影响,…