题意用一串 $0/1$ 序列表示一棵树的 $\text{dfs}$ 路径,$0$ 表示远离根节点,$1$ 表示靠近根节点。给出两个序列,判断它们是不是同构的树。序列长度 $L\le 3000$ 。题解对每棵树做 $\text{dfs}$ ,回溯时根据与当前节点相连子树的 $\text{hash}$ 值算出当前子树的 $\text{hash}$ 值,最后比较根节点的 $\text{hash}$...
题意用两个栈进行排序,只有入栈和出栈操作,求字典序最小的操作序列。如果无法排序输出 No 。数列长度 $N\le 1000$ 。题解先考虑单栈排序。如果存在 $i < j < k$ 但 $S_k < S_i < S_j$ 就无法进行排序。这道题有两个栈,可以对所有矛盾关系 $(i,j)$ 建边,然后跑一遍 $\text{dfs}$ 进行染色,判断是否有矛盾。枚举所有的...
题意给出一个残缺的日期,求使得日、月+日、年+月+日都为质数的填充方案数。多组数据,$T\le 10$ 。题解先预处理出所有合法的日期,然后对于输入直接枚举即可。#include<bits/stdc++.h>
using namespace std;
inline int read()
{
char ch=getchar();
int f=1,x=0;
...
题意用 $K$ 进制串 $S_i$ 表示 $N$ 个不同的单词。每个单词出现了 $W_i$ 次,不存在某个进制串是另一个的字串。求处理后全文的最短长度,以及此情况下最长 $S_i$ 的最短长度。题解编码方式显然是一棵 $K$ 叉哈夫曼树,先补 $0$ 直到 $(N-1)\equiv 0\pmod {(K-1)}$ ,然后每次选 $K$ 个点合并成一个点直到只剩 $1$ 个点即可。要求最长的 ...
四倍经验(1蓝2紫1黑):P3620,SP1553,P1484,P1792题意将 $N$ 个办公楼两两配成 $K$ 对,要求这 $K\times 2$ 栋楼相异。所有办公楼在一条直线上,配对的两栋楼之间需要连接电缆,求电缆长度的最小值。$N\le 100000$ 。题解显然,配对相邻的两栋楼是最优的。将边看成点来考虑,题目即转化成:在 $N$ 个点中选 $K$ 个不相邻的点,使得点权最小。每...
题意需要用双端队列实现 $N$ 个数的排序。依次处理每一个数,每次只能将数放在队首或队尾,或新建一个队列。求需要的最少双端队列数。$N\le 200000$ 。题解将原数列排序,可以得到 新数列对应原序列下标 的序列。如:原序列下标序列$[3,6,0,9,6,3]$$[1,2,3,4,5,6]$$[0,3,3,6,6,9]$$[3,1,6,2,5,4]$可以发现只有下标序列的一段满足先递减再...
终于把这道一直85分懒得搞的题过了。题意最开始有 $n$ 只蚯蚓,每秒把最长的那条蚯蚓砍成两段,比例为 $p:(1-p)$ 。同时所有蚯蚓每秒增加 $q$ 的长度。求每 $t$ 秒最长的蚯蚓长度,以及 $m$ 秒后排名为 $k\times t$ 的蚯蚓长度。$n\le 10^5 \ , \ m\le 7\times 10^6$题解先对所有蚯蚓长度从大到小排序。将蚯蚓队列、$p$ 和 $(1-...
题意给出一个基环森林,求所有基环树的直径之和。点数 $N\le 10^6$ 。题解思想先考虑求一个基环树的直径。设 $\text{f[i]}$ 是 $i$ 向环外延伸的最长距离,直径有两种情况:不经过环,答案为环的子树直径,即 $\mathrm{max}(\text{f[x]}+\text{f[y]}+w)$ ,其中 $x,y$ 是子树中两点,$w$ 是两点距离。经过环,则答案为 $\mat...
题意求 $N$ 点无向图的最小生成树,满足 $1$ 号节点度数 $\le s$ 。$N\le 30$ 。题解思想考虑构造一个以 $1$ 号节点为根的树,则 $1$ 号节点必须与子树中所有连通块相连。记录去掉 $1$ 号节点后的连通块个数,即 $1$ 号节点的最小度数,为 $tcnt$ 。(题目保证有解即 $tcnt\le s$)对每个连通块分别求出最小生成树,这样就得到了除 $1$ 号节点外...
题意$n\times n$ 的格点中站了 $n$ 个人,要让他们站在一排,求最少的移动次数。$n\le 100000$ 。题解选择第几排显然是取所有人 $y$ 坐标的中位数最优。移动到相应位置显然,按照 $x$ 的坐标顺序安排这一排内的顺序是最优的,所以先对 $x_i$ 进行第一次排序。但这样还是需要移动到不同位置,于是处理 $x_i-i$ ,这样就相当于移动到同一位置了,取中位数即可。代码...
题意给出两组点,求两组点间的最近点对。每个组中点数 $N\le 1000$ ,坐标 $x,y\le 10^9$ 。题解按 $x$ 坐标分治,并且对分别属于左右块的点对单独处理。注意数组需要开两倍。#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read()
{
c...
题意在 $[0,m]$ 中选一个数,使得它经过给定的 $n$ 个 &、|、^ 操作后得到的数最大。$2\le m\le 10^{9} \ , \ 2\le n\le 10^{5}$ 。题解所有数都 $\le 2^{30}$ ,而且修改都只涉及二进制的修改,所以对每一位进行贪心。用 $s_0$ 代表最初全为 $0$ 的数在操作后每一位的值;用 $s_1$ 代表最初全为 $1$ 的数在操...
题意给出 $n$ 个数,求逆序对个数。其中 $n\le 500000$ ,每个数 $\le 999,999,999$ 。题解数的范围很大,所以直接用树状数组肯定不行。但事实上我们只关心数之间的顺序,所以排序后用 $\text{ord[]}$ 记录顺序即可。#include<bits/stdc++.h>
#define ll long long
using namespace s...
题意从 $m$ 部电影中选出 $1$ 部给 $n$ 个人看。每部电影的配音和字幕都使用的不同的语言,每个人只掌握一种语言,用 $1\le id\le 10^{9}$ 的数表示不同语言。对于选出来的电影,如果某人能听懂配音,他会非常高兴;如果能看懂字幕,他会比较高兴。问:选择哪部电影,使得非常高兴的人最多;如果一样多,应使比较高兴的人最多。$n,m\le 200000$ 。题解显然可以对每部电...
题意给出一个 $5\times 5$ 的 $0/1$ 矩阵,每次点击某一个点会改变自身及上下左右的状态。求把矩阵全部变为 $1$ 的最少步数。多组数据,组数 $N\le 500$ 。题解考虑逐行递推,如果上一行 $(i,j)$ 是 $0$ ,那么就需要点击当前行的 $(i+1,j)$ 。最后校验最后一行是否全为 $1$ 即可。但第 $1$ 行没有上一行,所以我们需要枚举第 $0$ 行的状态,...