转化为完全图的欧拉遍历 如果 n 是奇数,则欧拉遍历长度为 \(n(n-1)/2\) 条边 如果 n 是偶数,则欧拉遍历长度为 \(n*n/2-1\) 条边 (即将(n-1)/2对点配对,剩下的一对当起点终点) 点数则 +1 答案是单调的所以二分 至于输出,暴力跑欧拉回路即可 眼瞎不开ll #include <bits/stdc++.h> using namespace std; #define int long long int n,m; const int N = 4005; vector…
有一个猜奖者和一个主持人,一共有 \(n\) 扇门,只有一扇门后面有奖,主持人事先知道哪扇门后有奖,而猜奖者不知道.每一轮,猜奖者选择它认为的有奖概率最大(如果有多个最大,随机选一个)的一扇门,主持人从剩下的且门后没有奖的门中随机打开一扇.直到剩两扇门时,猜奖者做出的选择就是他最后的选择. 现在由你来安排主持人每次打开哪一扇门,猜奖者不知道有内幕,他还认为主持人是从可以打开的门中随机一扇打开.你要使猜奖者获奖概率最低,求这个概率. (Discover Probability,你的快乐老家 ) S…
有 \(n\) 个数构成的序列 \({a_i}\),要将它划分为 \(k\) 段,定义每一段的权值为这段中 \((i,j) \ s.t. \ i<j,\ a_i=a_j\) 的个数,求一种划分方案,使得各段的权值和最小. \(n \leq 10^5, k \leq min(n,20), a_i \leq n\) 设 \(f[i][j]\) 表示将 \(a_{1..j}\) 分为 \(i\) 段的最小价值,则很容易得到转移方程 \[ f[i][j]=\min (f[i-1][k]+cost(k+1…
杜教筛求 \(\phi(n)\), \[ S(n)=n(n+1)/2-\sum_{d=2}^n S(\frac{n}{d}) \] 答案为 \[ \sum_{d=1}^n \phi(d) h(\frac{n}{d}) \] 其中 \(h(n)=\sum_{i=1}^n i^2\) 顺便学习了一波 unordered_map #include <bits/stdc++.h> #include <unordered_map> using namespace std; #define i…
给定 \(n\) 个数 \(m_i\),求 \((x_1,x_2,...,x_n)\) 的个数,使得 \(x_1 \ xor\ x_2\ xor\ ...\ xor\ x_n = k\),且 \(0 \leq x_i \leq m_i\) Solution 从最高位开始看起,毫无疑问,如果 \(m_i\) 的某一位是 \(0\),那么 \(x_i\) 的这一位只能填 \(0\),所以只有那些 \(m_i\) 最高位是 \(1\) 的才具有选择权. 考虑从最高位数起,哪一位 \(pos\) 开始,…
动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这个点的 maxlen 那么在这里,当增量添加的时候,如果一个节点有了儿子,那么它就可能成为一个新的 LCP 于是我们在操作父子关系的时候暴力修改一个 bool 数组即可,答案的维护是均摊 \(O(n)\) 的 注意需要对输出 \(0\) 的情况做特判,比如这个例子 aaaabbbbab 输出的结果应…
给出两幅 \(n(\leq 400)\) 个点的无向图 \(G_1 ,G_2\),对于 \(G_1\) 的每一颗生成树,它的权值定义为有多少条边在 \(G_2\) 中出现.求 \(G_1\) 所有生成树的权值和. Solution 很容易想到,设 \(G_1\) 中每条边的权值,这条边在 \(G_2\) 中出现则权值为 \(1\),否则权值为 \(0\). 现在就真的是求所有生成树的边权和的权值和了. 然而标准的 Matrix-Tree Theorem 求的是生成树的边权积的和. 现在我们定义每…
感谢这道题告诉我KM求的是 完备 最大权匹配 :( #include <bits/stdc++.h> using namespace std; #define reset(x) memset(x,0,sizeof x) #define int long long // Init: init() !!!!! // Input: make(u,v,cap,cost) // Solver: solve(s,t) // Output: ans, cost namespace flow { const…
#include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; cout<<n<<endl; for(int i=1;i<n;i++) cout<<-i<<" "<<i+1<<endl; cout<<-n<<" "<<-n<<endl;…
如果暴力维护,每次询问时需要对所有孩子做计算 考虑通过树剖来平衡修改与询问的时间,询问时计算重链和父树,轻链的贡献预先维护好,修改时则需要修改可能影响的轻链贡献,因为某个点到根的路径上轻重交替只有 \(O(\log n)\) 个,所以只需要修改这么多次,于是复杂度有保证,树状数组维护子树即可 我真是个憨憨,打错树剖调一晚,地上蛙血一大摊 #include <bits/stdc++.h> using namespace std; #define int long long const int N…