\(\mathcal{Description}\)   Link.   给定 \(m\) 个长度为 \(n\) 的有严格升序且不包含重复元素的序列 \(a_1,a_2,\cdots,a_m\),\(q\) 个询问,每次询问给出 \(x\),求 \(x\) 在每个序列中的非严格后继的异或和.强制在线.   \(m\le100\),\(n\le10^4\),\(q\le10^5\). \(\mathcal{Solution}\)   算是一种对多序列二分的优化科技/叭.   思考两种暴力做法:   …
\(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \((x_i,y_i)\),求一个不超过 \(n-1\) 次的多项式 \(f(x)\),使得 \(f(x_i)\equiv y_i\pmod{998244353}\).   \(n\le10^5\). \(\mathcal{Solution}\)   摆出 Lagrange 插值的式子: \[f(z)=\sum_{i=1}^ny_i\prod_{j\neq i}\frac{z-x_j}{x_i-x_j…
\(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排序,则重复冒泡排序零次或多次,直到存在某个位置 \(p\in[l,r)\),满足 \(\max_{i=l}^p\{a_i\}<\min_{i=p+1}^r\{a_i\}\),则递归入 \([l,p]\) 和 \((p,r]\),直到区间长度为 \(1\) 时停止.求所有冒泡排序所操作的区间长度之和.  …
\(\mathcal{Description}\)   Link.   给定点集 \(\{P_n\}\),\(P_i=(i,h_i)\),\(m\) 次修改,每次修改某个 \(h_i\),在每次修改后求出 \((0,0)\cup\{P_n\}\) 的下凸壳大小(输出时 \(-1\)).   \(n,m\le10^5\),\(h_i\ge0\). \(\mathcal{Solution}\)   令 \(k_i=\frac{h_i}{i}\),我们相当于要维护 \(\{k_n\}\) 中从 \(k…
\(\mathcal{Description}\)   Link.   给定二分图 \(G=(V=X\cup Y,E)\),\(|X|=|Y|=n\),边 \((u,v)\in E\) 有权 \(w(u,v)\),且保证存在完美匹配.求 \(G\) 的一个匹配 \(M\),最大化 \(\sum_{(u,v)\in M}w(u,v)\).   \(n\le500\). \(\mathcal{Solution}\)   首先我会费用流.   Kuhn-Munkres 算法,能够在 \(\mathca…
\(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的带点权树,删除 \(u\) 点的代价是该点点权 \(a_u\).\(m\) 次操作: 修改单点点权. 询问让某棵子树的根不可到达子树内任意一片叶子的代价.   \(n,m\le2\times10^5\). \(\mathcal{Solution}\)   不考虑修改,列出 DP: \[f(u)=\begin{cases}a_u&u\text{ is leaf}\\\min\{a_u,\sum_vf…
\(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个结点的带权树,\(m\) 次单点点权修改,求出每次修改后的带权最大独立集.   \(n,m\le10^5\). \(\mathcal{Solution}\)   不考虑修改,显然 DP.令 \(f(u,0/1)\) 表示选 / 不选结点 \(u\),\(u\) 子树内的带权最大独立集.那么: \[\begin{cases}f(u,0)=\sum_v\max\{f(v,0),f(v,1)\}\\f(u,…
\(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的仙人掌,\(q\) 组询问两点最短路.   \(n,q\le10^4\),\(m\le2\times10^4\). \(\mathcal{Solution}\)   提出一个环来考虑,从环上一点 \(u\) 到 \(v\),无非两条路径.可以按顺序处理一个前缀和.如图:   令 \(sum_2\) 为结点 \(1\) 到 \(2\) 的顺时针距离,\(sum_3\) 为结点 \(…
\(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的连通无向图,并给出 \(q\) 个点对 \((u,v)\),询问 \(u\) 到 \(v\) 的路径所必经的结点个数.   \(n,q\le5\times10^5\),\(q\le\min\{\frac{n(n-1)}2,10^6\}\). \(\mathcal{Solution}\)   大概是双倍经验吧.   建出圆方树,预处理圆方树上每个点到根经过的圆点个数,然后求 LCA…
\(\mathcal{Description}\)   link.   求包含 \(n\) 个点的边双连通图的个数.   \(n\le10^5\). \(\mathcal{Solution}\)   类似于这道题,仍令 \(D(x)\) 为有根无向连通图的 \(\text{EGF}\),\(B(x)\) 为边双连通图的 \(\text{EGF}\),考虑用 \(B\) 表示 \(D\).显然,根仅存在于一个边双连通分量中.我们可以在这个连通分量的任意一个点上挂一个有根连通图,这显然不会影响当前的…
\(\mathcal{Description}\)   link.   求有 \(n\) 个结点的点双连通图的个数,对 \(998244353\) 取模.   \(n\le10^5\). \(\mathcal{Solution}\)   奇怪的 GF 增加了 w!   对于带标号简单无向图,其 \(\text{EGF}\) 为 \(F(x)=\displaystyle\sum_{i=0}^{+\infty}\frac{2^{i\choose2}x^i}{i!}\)(任意两点间有连与不连两种情况.…
\(\mathcal{Description}\)   Link.   给定长度为 \(n\),仅包含小写字符的字符串 \(s\),\(m\) 次询问,每次询问一个子串 \(s[l:r]\) 的本质不同子串数量.   \(n\le10^5\),\(m\le2\times10^5\). \(\mathcal{Solution}\)   有种常见的离线技巧:类似扫描线,从左至右枚举右端点 \(r\),维护 \([1..r,r]\) 的答案.为了让 \(s[1:r]\) 里的每个子串都尽量参与贡献,可…
\(\mathcal{Description}\)   Link.   对于积性函数 \(f(x)\),有 \(f(p^k)=p^k(p^k-1)~(p\in\mathbb P,k\in\mathbb N_+)\).求 \(\sum_{i=1}^nf(i)\bmod(10^9+7)\).   \(n\le10^{10}\). \(\mathcal{Solution}\)   Min_25 筛是不可能的.   Powerful Number 三步走咯!考虑素数点值: \[f(p)=p^2-p \]…
\(\mathcal{Description}\)   Link.   容量为 \(n\),\(m\) 种物品的无限背包,求凑出每种容量的方案数,对 \(998244353\) 取模.   \(n,m\le10^5\). \(\mathcal{Solution}\)   感觉货币系统是这道题的弱化版 qwq.   还有这个博客园对齐公式自动编号的 feature 怎么去掉啊--   对于大小为 \(v\) 的物品,有生成函数: \[G(x)=\sum_{i=0}^{+\infty}x^{iv}…
\(\mathcal{Description}\)   Link.   给定 \(k\) 和 \(T\) 组 \(n,m\),对于每组,求 \[\sum_{i=1}^n\sum_{j=1}^m\operatorname{gcd}^k(i,j)\bmod(10^9+7) \]   \(T\le2\times10^3\),\(n,m,k\le5\times10^6\). \(\mathcal{Solution}\)   几个月没推式子找找手感 qwq.(   不妨设 \(n\le m\): \[\b…
\(\mathcal{Description}\)   Link.   给定一个 \(n\times n\) 的格点图,横纵相邻的两格点有一条边权为二元组 \((w,e)\) 的边.求对于 \(S=(1,1)\) 和 \(T=(n,n)\) 的一个割,使得 \((\sum w)(\sum c)\) 最小.   \(n\le400\). \(\mathcal{Solution}\)   套路题,P5540 + P4001.所以我把这两题题解合二为一.   假设边权都是普通的数字,考虑怎么快速求出这…
\(\mathcal{Description}\)   Link.   给定一个 \(n\times m\) 的矩阵 \(A\),构造一个 \(n\times m\) 的矩阵 \(B\),s.t. \((\forall i\in[1,n],j\in[1,m])(b_{ij}\in[L,R])\),且最小化: \[\max\left\{\max_{i=1}^n\{\left|\sum_{j=1}^m a_{ij}-b_{ij}\right|,\max_{j=1}^m\left| \sum_{i=1…
\(\mathcal{Description}\)   Link.    \(n\) 个结点的图,\(m\) 条形如 \((u,v,l,r)\) 的边,表示一条连接 \(u\) 和 \(v\) 的无向边会在时间 \((l,r]\) 内存在,时间范围在 \([0,K]\).判断每个时刻的图是否是二分图.   \(n,K\le10^5\),\(m\le2\times10^5\). \(\mathcal{Solution}\)   线段树分治其实和线段树没啥关系.(   个人感觉线段树分治节约时间的方…
\(\mathcal{Description}\)   Link.   给定 \(\{a_n\}\),求: \[\sum_{i=1}^n\sum_{j=1}^n\operatorname{lcm}(a_i,a_j) \]   \(1\le n,a_i\le5\times10^4\). \(\mathcal{Solution}\)   数论题在序列上搞不太现实,记最大值 \(m\),有 \(c_i\) 个 \(a_j=i\),推式子: \[\begin{aligned} \sum_{i=1}^n\…
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME pre=${name%.*} g++ -O2 $dir/$name -o $pre -g -Wall -std=c++11 if test $? -eq 0; then gnome-terminal -x bash -c "time $dir/$pre;echo;read;" fi*/ #…
\(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\times10^6\). \(\mathscr{Solution}\)   注意到一个显然的事实,对于某个前缀 \(S[:i]\) 以及两个起始下标 \(p,q\),若已有 \(S[p:i]<S[q:i]\),那么在所有的 \(j>i\) 中,都有 \(S[p:j]<S[q:j]\).换言之,最终…
\(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 \(u\) 到 \(v\) 的代价为 \(a\),\(v\) 到 \(u\) 的代价为 \(b\).求从结点 \(1\) 开始的,经过每个点至少一次,每条边恰好一次,最后回到结点 \(1\) 的路径,使得每条边代价的最大值最小.   \(n,a,b\le10^3\),\(m\le2\times10^…
\(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\{c_n\}\) 的个数,使得: \(\forall i~~~~c_i=0\lor c_i\in[a_i,b_i)\). \(\forall i<j~~~~c_i\not=0\land c_j\not=0\Rightarrow c_i<c_j\).   对 \(10^9+7\) 取模.   \(n…
\(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的无向连通图,边形如 \((u,v,l,a)\).每次询问给出 \(u,p\),回答所有从 \(u\) 出发,只经过 \(a\) 值 \(>p\) 的边能够到达的点中,到 \(1\) 号点的最小距离(以 \(l\) 之和为路径距离).强制在线,多测.   \(n\le2 \times 10^5\),\(m,q\le4 \times 10^5\). \(\mathcal{Soluti…
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照长度来排一个序. 如果询问和加边长度相同,这加边优先. 对于每一个连通块进行权值线段树. 权值线段树解决\(k\)大的问题. 每一次合并,并查集判联通,线段树暴力合并. 时间复杂度\(O(nlogn)\). 代码 #include <bits/stdc++.h> using namespace s…
题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\sum_{j>i} \frac{q_iq_j}{(i-j)^2}\] 根据题目给出的定义,带入\(E\)中 \[E_i=\sum_{j=1}^{i-1}\frac{q_j}{(i-j)^2}-\sum_{j=i+1}^{n}\frac{q_j}{(j-i)^2}\] 形式稍微改变了一下,本质一样 需要处理…
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nlogn\),均摊下来就是\(logn\). 判断联通性的问题就用并查集来解决. 如果在同一个联通块里,就不能合并,否则会出一点问题. 代码 #include <bits/stdc++.h> using namespace std; const int N = 3000000 + 6; int rt…
题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. 那么每一次翻转,\(s\)就变成了\(n-s\),\(n\)表示区间内所有灯的数量. 线段树维护一下就可以了. 代码 #include <bits/stdc++.h> using namespace std; const int N = 100000 + 6; int n, m; namespac…
题目链接 [洛谷传送门] 题解 按位处理. 把每一位对应的图都处理出来 然后单调栈处理一下就好了. \(and\)操作处理全\(1\). \(or\)操作处理全\(0\). 代码 #include <bits/stdc++.h> #define gc getchar using namespace std; typedef long long ll; const int N = 1000 + 4; const int P = 1e9 + 7; const int BIT = 31; int n…
题目链接 [洛谷传送门] 题解 很显然,当这个点不是割点的时候,答案是\(2*(n-1)\) 如果这个点是割点,那么答案就是两两被分开的联通分量之间求组合数. 代码 #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 500005; struct edge { int to, nt; } E[N << 1]; int dfn[N], low[N], H[N], sz[N];…