对于大小为
$n\cdot m$ 的矩阵$A$ 和$B$ ,其中$A$ 的每个元素为一个权值$w(i,j)$ ,$B$ 的每个元素为一个方向L/R/D/U
初始你在
$(i,j)$ ,若$B_{i,j}=L$ ,你可以走到$(i,j-1)$ 处,依次类推。定义$S_{i,j}$ 表示从$(i,j)$ 出发能够到达的点的$A_{i,j}$ 的和。给定矩阵$S$ ,构造$A$ 和$B$ 使得其生成的矩阵为$S$ 要求
$A$ 的每个元素均为正整数,$n\cdot m\le 10^5,S_i>1$。
首先,这张图一定是一个内向基环森林,环上的每个点
容易发现:环的大小可以只有二元环,因为任何一个大环长度都是偶数,都可以拆成二元环;而二元环的要求是两个点
紧接着我们发现每种 dinic
,复杂度就是
有一个
$n\times m$ 的棋盘,被$1\times 2$ 的骨牌覆盖,保证$2|n\times m$ 。现在你需要执行以下操作:
- 移去恰好一个骨牌。
- 将其他骨牌沿着其长边进行移动。
- 你需要保证每张骨牌的最终位置与初始位置至少有一个交点。
求你通过若干次操作后可以得到的所有可能的局面的数量。两种局面不同,当且仅当在其中一者中某个位置被骨牌覆盖,而另一者没有。$n\cdot m\le 2\cdot 10^5$。
讲一下经典套路:骨牌的移动可以转化为空格的移动。我们把空格移动的起始点向终止点连边,这张图构成外向森林。并且:按行+列的奇偶性黑白染色后,黑图和白图互不相交。
移去一张骨牌相当于新建两个百点,这两个点分别可以进入它们的子树中,也就是平面上
有
$n+m$ 张牌,其中前$n$ 张牌上分别标着$1,2,\cdots,n$ 的数字,后$m$ 张牌是鬼牌。现在我们打乱这些牌,然后开始抽牌游戏,每一轮你可以抽一张牌:
- 如果抽到了一张标有数字
$x$ 的牌,就移除这张牌,并将$x$ 加入一个集合$S$ ;- 如果抽到了鬼牌,就把移除的牌重新加入牌堆,再次打乱所有牌的顺序,重新开始抽牌。如果你抽到了鬼牌,并且集合
$S$ 已经包括了$[1,n]$ 中全部$n$ 个数,那么抽牌游戏结束。询问抽牌游戏结束的期望轮数。$n,m\le 2\times 10^6$。
首先,我们称上一次抽到鬼牌之后的步骤到这次抽到鬼牌为止称为一个周期。我们可以得到:期望轮数=期望周期数乘以每个周期的期望长度。
周期的期望长度:枚举是第几张牌抽到鬼牌,利用组合数可以轻松计算。
期望周期个数:题目中的形式不难让人想起 min-max 容斥
。而集合
你在一个二维平面直角坐标系的原点
$(0,0)$ 上,你可以向上或向右移动$1$ 单位长度任意次。
现在给你$n$ 个点,第$i$ 个点为$(x_i,y_i)$ 。你需要对这$n$ 个点都打上标记。具体的,在任意时刻,如果你在点$(X,Y)$ 并希望对点$(x,y)$ 打标记,你需要花费$\max(|X-x|,|Y-y|)$ 单位能量。
求最少花费多少单位能量。$1\leq n\leq8\times10^5;0\leq x_i,y_i\leq10^9;$
点
这启发我们这么 DP
:设
我们发现
这里我们使用 slope trick
技巧:由于绝对值函数增加的只有很有限个位置的二阶差分,因此我们用一个堆,存下所有差分增加一的位置(可重)。为了能方便地找到峰值的位置,我们把它拆成两个堆,分别存放峰值左边的差分增长点和峰值右边的差分增长点,其中右边的这个堆还要维护一个整体偏移量。
每次加绝对值函数相当于在无穷小处新增一个差分减少一的位置,也就意味着低谷段要往右移一位(才有导数为
priority_queue<int> L; L.push(a[p[1]]);
priority_queue<int, vector<int>, greater<int> > R; R.push(a[p[1]]);
int del = 0; ll as = 0;
for (int i = 2; i <= n; i++)
{
del += a[p[i]] + b[p[i]] - a[p[i - 1]] - b[p[i - 1]];
int x = a[p[i]], l = L.top(), r = R.top() + del;
if (x < l) L.pop(), L.push(x), L.push(x), R.push(l - del), as += l - x;
else if (x > r) R.pop(), R.push(x - del), R.push(x - del), L.push(r), as += x - r;
else L.push(x), R.push(x - del);
}
给你一个不含
$0$ 的字符串$s$ ,然后给你一个整数$x$ ,请你可以找到一个三元组$(a, b, c)$ ,使得$s_{a, b} + s_{b + 1, c} = x$ ,输出两行,第一行为$a, b$ ,第二行为$b + 1, c$ ,保证有解。$s,x\le 10^6$。
先将问题转换为判定性问题:枚举分界点,左边和右边至少有一边是
现在的问题就变成了如何快速判定两个区间的和是否等于
给定一张无向图
$G$ ,除了$1$ 节点每个节点有两个权值$a_i,b_i$ 。你初始在$1$ 节点,有一个权值$val$ ,你可以从$u$ 移动到$v$ 当且仅当:
$u,v\in G$ - 你当前的
$val<a_v$ - 如果这不是第一次移动,移动到
$u$ 前的一个节点不能是$v$ 移动了之后,$val\leftarrow val+b_v$。你可以重复经过一个点,但是你无法重复获得
$b$ 的加成。你需要经过所有的点,问你初始$val$ 至少是多少。数据范围$n\le 10^3,m\le 2\times 10^3$ ,保证图联通。任何点的度数都$\ge 2$ 。
首先二分答案,考虑如何判断。假设当前已经确定可以到达的集合为 dfs
增广
- 搜到了一个在
$S$ 内的点。这种情况显然可以直接将栈内所有数加入$S$ 。 - 搜到了一个在栈内的点。这种情况下我们可以从这个环上绕回
$S$ 内,因此也将整个栈加入$S$ 。 - 回溯回了
$S$ 。这种情况下啥也不能做,并且啥也不做的总复杂度还是对的,因为遍历到的点不会被其他的深搜遍历到。
因此直接按照上面的 dfs
来增广
给出
${n}$ 个点的无向带权完全图,找出以下条件的最小生成树:第
${i(1\le i\le k)}$ 个点的度数$\le d_i$ 输出满足条件的生成树的最小权值。$k\le 5,n\le 50,v\le 100$。
首先给出一个很正确的做法:五层 wqs
二分!emmmmmmmmmm
再不加解释地给出题解做法:MST
是拟阵问题,$2^{10}$ 枚举了前