摘要:
把原字符看成 $X$,每个位置看成 $Y$,每种字符向每个能去的位置连边,就成了一个二分图完美匹配的问题。现要得到字典序最小,那么就枚举每一位要放什么,然后看放完这种字符,剩下的字符的个数和后面能不能形成完美匹配。根据霍尔定理,选择 $X$ 中的一个子集 $s$,和 $Y$ 连边的点集为 $N(s) 阅读全文
posted @ 2019-10-14 22:04
Mrzdtz220
阅读(139)
评论(0)
推荐(0)
摘要:
数据小的话就暴力跑网络流就好了。 但是这里是 $10^5$ 就不行了。现在枚举 {$a_i$} 中一段长为 $m$ 的连续子序列,考虑和 {$b_i$} 中的完美匹配。根据Hall定理,一个二分图,分为 $X$ 和 $Y$,存在完美匹配的充要条件为任取 $X$ 中一个子集 $s$,$Y$ 中与 $s 阅读全文
posted @ 2019-10-14 22:03
Mrzdtz220
阅读(174)
评论(0)
推荐(0)
摘要:
A. Antipalindrome 直接暴力判断就行了。 #include <bits/stdc++.h> using namespace std; const int N = 100; char s[N]; bool check(int i, int j) { while (i <= j) { i 阅读全文
posted @ 2019-10-14 22:00
Mrzdtz220
阅读(125)
评论(0)
推荐(0)
摘要:
tourist's contest...ssfd A - Move and Win 想不到好的博弈方法,我就直接暴力了...可以确定的是,如果一个人觉得他走这个方向是最优的,那么他肯定会一直走下去。那么就枚举四种情况,第一个人往左(往右),第二个人往左(往右)。当第一个人往左(或往右)时,另一个人怎 阅读全文
posted @ 2019-10-14 21:57
Mrzdtz220
阅读(145)
评论(0)
推荐(0)
摘要:
假设现在有一堆数,我想要保证能取出一个,至少需要敲 (数的个数)*(这些数里的最小值)那么把这些数从大到小排序,$dp[i][j]$ 表示前 $i$ 个里面保证能取出 $j$ 个需要敲的次数。$dp[i][k] = min(dp[j][k - 1] + (i - j) \times a[i])$斜率 阅读全文
posted @ 2019-10-14 21:55
Mrzdtz220
阅读(226)
评论(0)
推荐(0)
摘要:
费用流。把每个方格拆成 $T$ 个点,$t$ 时刻一个方格向周围四个方格的 $t + 1$ 的点连一条容量为 $1$ 费用为 $0$ 的边,向自身的 $t + 1$ 连一条容量为 $1$ 费用为该方格最大幸福值的边。源点向方格为 'S' 的0时刻连一条容量为 $1$ 费用为 $0$ 的边。所有点的 阅读全文
posted @ 2019-10-14 21:52
Mrzdtz220
阅读(146)
评论(0)
推荐(0)
摘要:
感觉题目都已经快把正解给说出来了...strongly connected的两个点的消耗为0,其实就是同一个边双连通分量里面的点消耗为0。然后缩一下点,再树形DP一下就完了。第一次写边双,但感觉挺简单的。 #include <bits/stdc++.h> #define ll long long u 阅读全文
posted @ 2019-10-14 21:51
Mrzdtz220
阅读(123)
评论(0)
推荐(0)
摘要:
对于一对 $(x, y)$,能成为逆序对的取决于绝对值大的那个数的符号。假如 $a[x] > a[y]$,当 $a[x]$ 为正时,不管 $a[y]$ 取不取负号都比 $a[x]$ 小。当 $a[x]$ 为负时, 不管 $a[y]$ 取不取负号都比 $a[x]$ 大。那么就变成了统计每个节点的子树及 阅读全文
posted @ 2019-10-14 21:47
Mrzdtz220
阅读(249)
评论(0)
推荐(0)
摘要:
A. Kefa and First Steps 求最长递增连续子序列。 B. Kefa and Company 排序二分就行了。 #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1e5 阅读全文
posted @ 2019-10-14 21:46
Mrzdtz220
阅读(144)
评论(0)
推荐(0)
摘要:
A. Raising Bacteria 数二进制位有多少个1就好了。 B. Finding Team Member 题意:有 $2n$ 个人,任意两个人配对有一个价值,如果一人的目前的最优配对那个人的最优配对也是自己,那么两个人可以配对。 思路:直接模拟,每次至少能让两个人配对成功。所以复杂度 $O 阅读全文
posted @ 2019-10-14 21:43
Mrzdtz220
阅读(193)
评论(0)
推荐(0)
摘要:
[传送门] 设最后 $m$ 段每段数字之和为 $a_i$,那么最后答案为 $m^2 \sum \dfrac {\left( a_{i}-\dfrac {s}{m}\right) ^{2}}{m}$把括号拆开后最后答案为 $m\sum a_i ^{2}-S^{2}$要求最小化$\sum a_i ^{2 阅读全文
posted @ 2019-10-14 21:38
Mrzdtz220
阅读(234)
评论(0)
推荐(0)
摘要:
[传送门] 感觉这种信息不符合区间可加性,或者用来区间相加的时间复杂度太高的话就直接分块。res[i][j] 表示第 $i$ 块到第 $j$ 块之间的答案,查询就先查询整块,再对两端暴力。注意不要用memset清空cnt数组,每次使用了再循环一遍撤销操作就行了。 #include <bits/std 阅读全文
posted @ 2019-10-14 21:34
Mrzdtz220
阅读(111)
评论(0)
推荐(0)
摘要:
[传送门] 一个单调不减的序列,如果在每个位置取的数都加上对应位置的值,这样就是严格单调递增的了。如果 [1, 1, 2, 2, 3]就会变成 [2, 3, 5, 6, 8]就相当于在某个值域里取一些不重复的数了,具体这个值域就是[L + 1 , R + n]。但其实此时跟值域具体的值无关了,只跟值 阅读全文
posted @ 2019-10-14 21:30
Mrzdtz220
阅读(129)
评论(0)
推荐(0)
摘要:
[传送门] 如果只有单组询问就是水题。多组询问就不能直接在线做了。考虑离线。 点分治,把当前重心到未被处理过的子树的距离放进一个数组,按距离从小到大排序。排完序后把这些节点替换成当前前缀权值最大的节点。因为如果到这个节点的距离为$r$,那么小于$r$的也能到达,所以取前缀max没有错。 然后对询问的 阅读全文
posted @ 2019-10-14 21:28
Mrzdtz220
阅读(169)
评论(0)
推荐(0)
摘要:
[传送门] 题目即求所有的三元组,相对大小关系同 $p_1,p_2,p_3$。 题解说都很清楚,这里写一下过程整理一下思路。 如果我们枚举中间这个元素,那么就是统计子树内外有多少个大于这个数和小于这个数的个数。 假设$a_1$,$a_3$的$LCA$不是$a_2$,那么就是一个在$a_2$子树内一个 阅读全文
posted @ 2019-10-14 21:24
Mrzdtz220
阅读(196)
评论(0)
推荐(0)
摘要:
A 同联盟的朋友连一条权值为$0$的边,不同联盟的朋友连一条权值为$1$的边,即可以把每一次换联盟看成走一条权值为1的边。那么以每一个人为起点的话终点就是这个人到其他所有人中最短路的最大值。求这些最大值的最小值即可。 #include <bits/stdc++.h> using namespace 阅读全文
posted @ 2019-10-14 19:12
Mrzdtz220
阅读(193)
评论(0)
推荐(0)
摘要:
转化一下询问即为区间$max - min + 1 = cnt$,其中$cnt$表示区间内数的种类数。 即求有多少区间$max - min - cnt=-1$,注意到任意区间的$max-min-cnt \geq -1$,那么即维护区间$max-min-cnt$的最小值和最小值的个数,再看最小值等不等于 阅读全文
posted @ 2019-10-14 19:08
Mrzdtz220
阅读(144)
评论(0)
推荐(0)
摘要:
[传送门] 这种区间内相同数字只能被统计一次/只有区间内数字都不相同才对答案有贡献的题都可以用扫描线扫右端点,表示当前区间右端点为$r$。然后当前线段树/树状数组维护区间左端点为$[1,r)$时对应的答案,那么新加一个数对区间$[last[a[r] + 1, r]$多了$a[r]$的贡献。这道题也一 阅读全文
posted @ 2019-10-14 19:04
Mrzdtz220
阅读(256)
评论(0)
推荐(0)
摘要:
题意是,有$n$个石头,每个石头有初始能量$E_i$,每秒能量增长$L_i$,以及能量上限$C_i$,有$m$个收能量的时间点,每次把区间$\left[S_i, T_i\right]$石头的能量都给收掉,石头的能量都置零重新开始增长。问最后收了多少能量。 看完题解觉得好有道理...我好菜...考虑每 阅读全文
posted @ 2019-10-14 18:58
Mrzdtz220
阅读(143)
评论(0)
推荐(0)
摘要:
[传送门] 题意就是单点加以及查询下标为等差数列位置上的值之和。刚开始看到这道题。我以为一个数的倍数是log级别的。就直接写了发暴力。就T了。还在想为啥,优化了几发才发现不太对劲。然后才想到是$\dfrac {n}{x}$级别的。不过看到$\dfrac {n}{x}$应该就出来了。当$x \leq 阅读全文
posted @ 2019-10-14 18:57
Mrzdtz220
阅读(176)
评论(0)
推荐(0)
摘要:
A. World Football Cup #include <bits/stdc++.h> using namespace std; const int N = 60; char name[N][N]; map<string, int> mp; char s[N]; struct P { int 阅读全文
posted @ 2019-10-14 18:48
Mrzdtz220
阅读(156)
评论(0)
推荐(0)
摘要:
A. Twins 题意就是问取最少的物品使价值严格大于总价值的一半。 排序就OK了。 #include <bits/stdc++.h> using namespace std; const int N = 1011; int a[N]; int main() { int n; scanf("%d", 阅读全文
posted @ 2019-10-14 18:40
Mrzdtz220
阅读(187)
评论(0)
推荐(0)
摘要:
A 签到。 C 源点向每个软件连边。把每个软件拆成对应版本数个点,每个软件向版本连边。把每个conflict也看成一个点。每个版本向它对应的conflict连边,conflict向汇点连边。没有在conflict里的版本直接向汇点连边。所有边的容量都是$1$,跑最大流即可。conflict的意思也就 阅读全文
posted @ 2019-10-14 18:33
Mrzdtz220
阅读(572)
评论(0)
推荐(0)
摘要:
[传送门] 把一个询问拆成4个询问,即二维前缀和的形式,又变成了二维矩阵求和/RMQ的问题,有了[51nod 1463找朋友]的启发,直接按$x$排序,再对$y$查询即可,区间前缀和可以用树状数组来实现,常数小而且好写。 #include <bits/stdc++.h> using namespac 阅读全文
posted @ 2019-10-14 18:30
Mrzdtz220
阅读(99)
评论(0)
推荐(0)
摘要:
由于每个元素贡献是线性的,那么等价于求每个元素出现在多少个异或和为$0$的子集内。因为是任意元素可以去异或,那么自然想到线性基。先对整个集合A求一遍线性基,设为$R$,假设$R$中元素个数为$r$,那么任取一个不在$R$内的元素,$R$中肯定存在一种取法能和这个元素异或和为$0$。同理,取定一个不在 阅读全文
posted @ 2019-10-14 18:24
Mrzdtz220
阅读(152)
评论(0)
推荐(0)
摘要:
[传送门] 题意就是给一排围栏,每个围栏都有一个高度,查询区间$\left[l, r\right]$之间长度为$w$的子区间的最小高度的最大值。首先,这个最大值肯定是这个区间里的围栏的某个高度,如果是一个未出现过的高度,显然能有更高的高度满足条件。那么就可以考虑在离散化后的高度数组里二分答案,然后c 阅读全文
posted @ 2019-10-14 18:21
Mrzdtz220
阅读(170)
评论(0)
推荐(0)
摘要:
[传送门] 比赛的时候想了半天的带修改主席树(其实之前只写过一次。),两个log甚至三个log都想了,自闭了五个小时还是不会实现。问了一下西瓜得到了一个非常妙的1 log解法。此处膜瓜🍉 一操作相当于把一个数删掉,因为$a_i + 10^7$肯定不会影响到$n + 1$,最坏情况下也能直接取$n 阅读全文
posted @ 2019-10-14 18:19
Mrzdtz220
阅读(112)
评论(0)
推荐(0)
摘要:
[传送门] 其实就是这些数字前面能加正负号,在满足正负号均出现的情况下价值最大。那么就可以无脑DP$f[i][j][k]$表示到了第$i$位,正号是否出现($j$、$k$为$0$或$1$)能得到的最大价值答案就是$f[n][1][1]$$n$为1的时候特判一下就行举几个例子就能发现加正负号这个方法是 阅读全文
posted @ 2019-10-14 18:17
Mrzdtz220
阅读(151)
评论(0)
推荐(0)
摘要:
[传送门] 如果只有单次询问,可以直接树形DP$f\left[u\right]$表示以$u$为根的子树中所有资源丰富的岛屿不与$u$联通的最小代价转移方程显然若儿子节点$v$为资源丰富的岛屿$f\left[u\right] = f\left[u\right] + w\left[u, v\right] 阅读全文
posted @ 2019-10-14 18:09
Mrzdtz220
阅读(97)
评论(0)
推荐(0)
摘要:
D - Ki 题意:给一棵有根树,节点1为根,有$Q$次操作,每次操作将一个节点及其子树的所有节点的权值加上一个值,问最后每个节点的权值。 思路:dfs序再差分一下就行了。 #include <bits/stdc++.h> using namespace std; const int N = 2e5 阅读全文
posted @ 2019-10-14 14:32
Mrzdtz220
阅读(320)
评论(0)
推荐(0)
摘要:
[传送门] 将第二维离散化一下,按第一维从大到小,第二维从小到大,第三维从大到小排序,这样即使第一维相同的情况下也不会重,然后用一棵线段树维护第二维为$I_{i}$时第三维的最大值,插入每一个元素之前先查询$\left[I_{i} + 1, n\right]$的最大值,若查询得到的$x$大于$R_{ 阅读全文
posted @ 2019-10-14 14:27
Mrzdtz220
阅读(128)
评论(0)
推荐(0)
摘要:
[传送门] 分块,每一块维护一个单调递增的数组$w$,修改时因为区间加不会影响相邻元素的大小关系,所以在对于一整块的区间加打标记就行了。若不在同一块内就暴力修改每一个数,重新维护一次$w$数组,每次修改最多需要重构两块。查询操作先对每一块的$w$数组二分看存不存在$y$,最优解肯定由第一次出现$y$ 阅读全文
posted @ 2019-10-14 14:23
Mrzdtz220
阅读(171)
评论(0)
推荐(0)

浙公网安备 33010602011771号