济南 清北学堂,NOIP考前十连测,题目整理。 # 清北学堂 10
连测
Round 1
A. yist
给出
n
求
n!mod232。
int main(){
A[0] = 1; rep(i, 1, 50) A[i] = (A[i - 1] * i) % MOD;
int T = read();
while(T--){
int x = read();
if(x <= 50) printf("%llu\n", A[x]);
else puts("0");
}
return 0;
}
B. ernd
有一个
n×m
的网格,网格上的数字都在
[1,nm]
之间且两两不同。
有个限制,直观描述是位置左、上的格子必须比右、下的格子小,精确地说:Ai,j<Ai+1,j,Ai,j<Ai,j+1
必须成立,如果不等式中的两个位置都在网格内的话。
你想知道对于一个
k,有多少个格子的值可以是
k(即存在一种网格,使得它的值是
k)。
考虑每个位置
(i,j)
能填哪些数字,这个位置到
(1,1)
形成的矩形中的值都要大于
(i,j)
的值,这个位置到
n,m
同理。
int ans[_T], C[_T];
void work(int n, int m){
memset(C, 0, sizeof(C));
rep(i, 1, n) rep(j, 1, m){
int L = i * j, R = n * m - ((n - i + 1) * (m - j + 1) - 1);
C[L]++; C[R + 1]--;
}
int now = 0;
rep(i, 1, n * m) now += C[i], ans[i] = now;
int q = read();
while(q--) printf("%d\n", ans[read()]);
}
C. sanrd
小Y有一个排列
P1..n,作为强迫症患者,她想要把排列排好序。共有
3 种操作。
花费
a
的代价交换相邻两个数。
花费
b
的代价翻转整个排列。
花费
c
的代价打乱整个排列,新排列随机生成。
小Y需要知道,在最优策略下,她需要花费多大的代价呢?
最优的操作,显然是先打乱排列(如果有),再翻转排列(如果有),最后交换相邻两个数(如果有)。
几个事实
- Ai>Aj,i+1=j
是交换相邻两个数字的必要条件。
- 执行一次交换操作逆序对数量会减少且仅减少一。
- 答案只与逆序对数量有关。
- 打乱后随机生成的代价就是
c
+ 长度为
n
的所有排列排好代价的平均值。只要使用最后一种操作,那么他们的答案一定相同。
设排列
[P]
的逆序对数为
x
,如果只使用前两种操作, 代价就是
min{(2n(n−1)−x)×a+b,x×a}。
把
[p]
的所有排列按照只用前两种操作的花费排好序,那么可能使用最后一种操作的一定是一段后缀。
以
[p]
的所有排列按照只用前两种操作的花费排好序的下标为
x
轴,代价为
y
轴,那么只用前两种操作就是绿色的图像。
如果对某些排列使用第三种操作,可以用橙色的图像表示。
其中被函数值压平的部分就是
c
+ 所有排列代价的平均值。
枚举是多长的后缀被压平(使用第三种操作)。然后解方程解出函数值平均值,选取最小的平均值即可。
如果排列数比较多,无法一个一个的算出来,可以通过 dp 求出长度为
n
的排列,逆序对个数为
k
的排列数。可以注意到,逆序对数相同的排列,答案一定是一样的,可以把逆序对是相同的排列捆绑计算,逆序对数一共有
2n×(n−1)+1
种取值。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <climits>
#include <assert.h>
#include <vector>
#define LL long long
#define int long long
#define rep(i, l, r) for(int i = (l), ___ = (r); i <= ___; i++)
#define per(i, l, r) for(int i = (r), ___ = (l); i >= ___; i--)
using namespace std;
struct Read_t{
template<typename T> const Read_t & operator() ( T & target ) const {
T x = 0; int sign = 1; char c = getchar();
while(c < '0' || c > '9') { if(c == '-') sign = -1; c = getchar(); }
while(c <= '9' && c >= '0') { x = (x << 1) + (x << 3); x += c - '0'; c = getchar(); }
target = x * sign; return *this;
}
} Read;
#warning dont forget enable int_64
const int _N = 500;
const int _S = 500;
LL gcd(LL a, LL b){ return b == 0 ? a : gcd(b, a % b); }
LL dp[_N][_S];
LL n, a, b, c, d;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
pair<LL, LL> Val[_S];
bool operator > (pair<LL, LL> A, pair<LL, LL> B){ return (A.fi * B.se > A.se * B.fi); }
LL A[_S];
void doit(){
Read(n)(a)(b)(c)(d); vector<pair<LL, LL> > V; V.clear();
rep(i, 0, (n) * (n - 1) / 2) V.pb(mp(min(i * a, ((n * (n - 1) / 2) - i) * a + b), dp[n][i]));
sort(V.begin(), V.end());
int tot = 0;
rep(L, 0, V.size() - 1){
int R = L; while(V[R + 1].fi == V[L].fi && R + 1 <= (int)(V.size()) - 1) R++; LL sum = 0;
rep(i, L, R) sum += V[i].se;
V[tot].fi = V[L].fi; V[tot].se = sum;
tot++;
L = R;
} LL S = 0; rep(i, 0, tot - 1) S += V[i].se;
rep(i, 0, tot - 1){
LL cnt = 0; rep(j, i, tot - 1) cnt += V[j].se;
LL A = cnt * c; rep(j, 0, i - 1) A += V[j].fi * V[j].se;
LL B = S - cnt;
LL g = gcd(A, B); Val[i] = mp(A / g, B / g);
}
int Mid = 0; rep(i, 0, tot - 1) if(Val[Mid] > Val[i]) Mid = i;
pair<LL, LL> MAns = Val[Mid]; MAns.fi += MAns.se * c; LL g = gcd(MAns.fi, MAns.se); MAns.fi /= g; MAns.se /= g;
while(d--){
rep(i, 1, n) Read(A[i]);
LL ans = 0;
rep(i, 1, n) rep(j, i + 1, n) ans += (A[i] > A[j]);
ans = min(ans * a, b + a * ((n * (n - 1) / 2) - ans));
if(ans * MAns.se < MAns.fi) printf("%lld/1\n", ans);
else printf("%lld/%lld\n", MAns.fi, MAns.se); assert(MAns.fi > 0); assert(MAns.se > 0);
}
}
void Init(int n) {
dp[1][0] = 1;
rep(i, 2, n) {
rep(j, 0, ((i) * (i - 1)) / 2) {
LL &ans = dp[i][j] = 0;
rep(k, 0, min(i - 1, j)) ans += dp[i - 1][j - k];
}
}
}
signed main(){ freopen("in.txt", "r", stdin);
Init(17);
int T; Read(T);
while(T--) doit();
return 0;
}
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(), x.end()
#define L(i, u) for (register int i = head[u]; i; i = nxt[i])
#define rep(i, a, b) for (register int i = (a); i <= (b); i++)
#define per(i, a, b) for (register int i = (a); i >= (b); i--)
using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned int ui;
typedef pair<ll, ll> Pll;
typedef vector<int> Vi;
template <class T>
inline void read(T &x){x = 0;char c = getchar();int f = 1; while (!isdigit(c)) { if (c == '-') f = -1; c = getchar(); } while (isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); } x *= f; }
template <class T>
T gcd(T a, T b) { return !b ? a : gcd(b, a % b); }
template <class T>
inline void umin(T &x, T y) { x = x < y ? x : y; }
template <class T>
inline void umax(T &x, T y) { x = x > y ? x : y; }
ll dp[1 << 16 | 3][141];
struct Yzr
{
int n;
ll gs[141];
void ini(int nn)
{
n = nn;
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
rep(s, 0, (1 << n) - 1) rep(i, 1, n) if (~s >> i - 1 & 1)
{
int del = 0, cnt = 0;
rep(j, i + 1, n) del += s >> j - 1 & 1;
rep(j, 1, n) cnt += s >> j - 1 & 1;
rep(k, 0, cnt * (cnt + 1) >> 1) dp[s | 1 << i - 1][k + del] += dp[s][k];
}
rep(k, 0, n * (n + 1) >> 1) gs[k] = dp[(1 << n) - 1][k];
}
} yzr[17];
bool cmp(Pll a, Pll b) { return (ld)a.fi / a.se < (ld)b.fi / b.se; }
ll n, a, b, c, d, qz[141], p[166];
Pll s[166];
ll calc(ll x) { return min(x * a, (n * (n - 1) / 2 - x) * a + b); }
int main()
{
freopen("in.txt", "r", stdin);
rep(n, 2, 16) yzr[n].ini(n);
int T;
read(T);
while (T--)
{
read(n); read(a); read(b); read(c); read(d);
Pll res(1e18, 1);
ll tot = 1;
rep(i, 1, n) tot *= i;
int len = 0;
rep(i, 0, n * (n + 1) / 2) if (yzr[n].gs[i]) s[++len] = mp(calc(i), yzr[n].gs[i]);
sort(s + 1, s + len + 1);
static ll qz[166], hz[166];
rep(i, 1, len) qz[i] = qz[i - 1] + s[i].fi * s[i].se;
hz[len + 1] = 0;
per(i, len, 1) hz[i] = hz[i + 1] + s[i].se;
rep(i, 1, len)
{
Pll cur = mp(qz[i] + hz[i + 1] * c, tot - hz[i + 1]);
if (cmp(cur, res))
res = cur;
}
pair<ll, ll> ans = mp(res.fi + c * res.se, res.se);
cerr << "N = " << n << endl;
cout << ans.fi << " " << ans.se << endl;
while (d--)
{
rep(i, 1, n) read(p[i]);
int nx = 0;
rep(i, 1, n) rep(j, i + 1, n) nx += p[i] > p[j];
Pll ans = mp(calc(nx), 1);
if (cmp(mp(res.fi + c * res.se, res.se), ans))
ans = mp(res.fi + c * res.se, res.se);
ll g = gcd(ans.fi, ans.se);
ans.fi /= g;
ans.se /= g;
printf("%lld/%lld\n", ans.fi, ans.se);
}
}
return 0;
}
D. sith
你有
k
棵点数均为
n
的树
对于每对点
i,j,你都需要求出,有多少个点
x,满足在所有树中都在
i↔j
的树链上(树链包含端点即
i,j)。
定义函数
dist(x,y)
为
x,y
这两个结点在树
t
上的最短距离(简单路径长度)。
对于一棵树
t
,“dist(i,j)=dist(i,x)+dist(x,j)”
为 “点
x
在
点i
↔
点
j
的树链上” 的充要条件。
扩展一下可以发现
对于森林
T,“t∈T∑dist(i,j)=t∈T∑dist(i,x)+t∈T∑dist(x,j)”
为 “对于每棵树 点
x
在
点i
↔
点
j
的树链上” 的充要条件。
这样就可以分开算了,随便做就好了。
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(), x.end()
#define L(i, u) for (register int i = head[u]; i; i = nxt[i])
#define rep(i, a, b) for (register int i = (a); i <= (b); i++)
#define per(i, a, b) for (register int i = (a); i >= (b); i--)
using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned int ui;
typedef pair<int, int> Pii;
typedef vector<int> Vi;
template <class T>
inline void read(T &x){x = 0;char c = getchar();int f = 1;while (!isdigit(c)){if (c == '-')f = -1;c = getchar();}while (isdigit(c)){x = x * 10 + c - '0';c = getchar();}x *= f;}
template <class T>
T gcd(T a, T b) { return !b ? a : gcd(b, a % b); }
template <class T>
inline void umin(T &x, T y) { x = x < y ? x : y; }
template <class T>
inline void umax(T &x, T y) { x = x > y ? x : y; }
template <class T>
inline T Abs(const T &x) { return x > 0 ? x : -x; }
inline ui R()
{
static ui seed = 613;
return seed ^= seed >> 5, seed ^= seed << 17, seed ^= seed >> 13;
}
const int N = 505;
int n, k, dis[N][N];
Vi e[N];
void dfs(int s, int u, int fa, int dep)
{
dis[s][u] += dep;
for (int v : e[u])
if (v != fa)
dfs(s, v, u, dep + 1);
}
int main()
{
read(n);read(k);
rep(tt, 1, k){
rep(i, 1, n) e[i].clear();
rep(i, 1, n - 1){
int u, v;read(u);read(v);
e[u].pb(v);e[v].pb(u);
}
rep(i, 1, n) dfs(i, i, 0, 0);
}
rep(i, 1, n) rep(j, 1, n)
{
int ans = 0;
rep(x, 1, n) ans += dis[i][x] + dis[j][x] == dis[i][j];
printf("%d%c", ans, j < n ? ' ' : '\n');
}
return 0;
}
Round 2
A. one
给你一个长度为
n
的数组,你需要将其划分为若干个连续段。对于一种划分,定义其权值为,求出每段的段内所有元素
xor 值,再把所有段的 xor 值相加即为权值。
你需要计算对于所有划分,这个权值的最小、最大值分别是多少。
n≤106
AxorB≤A+B
A &B≤A ∣ B≤A+B
全部拆开最大,全部合并最小。
int main(){
int n, MIN = 0; LL MAX = 0; Read(n);
rep(i, 1, n) { int x; Read(x); MIN ^= x; MAX += x; }
printf("%d %lld", MIN, MAX);
return 0;
}
B. two
有一个
1..n
依次连成的环,有一个从
1
开始移动的指针,每次指针所在位置有p的概率消失并将这个位置对应的下标(在
1..n
中)插入序列
B
的末尾,然后指针移动一格(
1
移到
2,n
移到
1
这样,一个位置若已经消失则不会被移动到)。所有位置都消失时游戏结束。最后
B
会是一个排列。
这道题跟序列
B
没什么关系,你只需要求出游戏期望进行几轮,答案对
998244353
取模。
读入描述: 一行三个整数
n,x,y。概率
p=yx
设
f[n]
为 长度为
n
还需要进行多少轮。
易知
f[n]=1+p×f[n−1]+(1−p)×f[n]
移项得
f[n]=n×p1
int main(){
Read(n)(x)(y);
printf("%d", int(n *1ll* y % MOD *1ll* inv(x, MOD) % MOD));
return 0;
}
C. three
小Y拥有一个序列ai(从0开始标号)。
小Y想要对序列进行Q次操作,操作有下面几种:
- t=0:对区间[l,r]执行ai=ai+x
- t=1:对区间[l,r]执行ai=⌊xai⌋
- t=2:查询区间[l,r]的maxai
- t=3:把区间[l,r]的ai恢复为初始给出的ai
ai≤108;n,Q≤105
定义一类特殊标记
记录标记
a,b,c
表示
x
变成
⌊bx+a⌋+c。
其中要求
a<b。
- 对于加法操作
c+=x
即可。 - 对于除法操作如果是除
d
:⌊d⌊bx+a⌋+c⌋=⌊d⌊bx+a+bc⌋⌋=⌊bdx+a+bc⌋
然后优化一下
x+a+bc
保持
a′<b′,类似于假分数换算带分数,保证不会爆long long
。
对于处理除数过大的情况:
if (fm > inf) fz = max(0ll, fz + (inf - fm)), fm = inf;
如果分母
>inf,那么
⌊bx+a⌋+c
等价于
[x≥b−a]+c
当分母很大时,可以使得
a,b
同时减去一个常数使得
b
不会溢出,对于
[x≥b−a]+c
不影响取值。
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(), x.end()
#define L(i, u) for (register int i = head[u]; i; i = nxt[i])
#define rep(i, a, b) for (register int i = (a); i <= (b); i++)
#define per(i, a, b) for (register int i = (a); i >= (b); i--)
using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned int ui;
typedef pair<int, int> Pii;
typedef vector<int> Vi;
template <class T>
T gcd(T a, T b) { return !b ? a : gcd(b, a % b); }
template <class T>
inline void umin(T &x, T y) { x = x < y ? x : y; }
template <class T>
inline void umax(T &x, T y) { x = x > y ? x : y; }
inline ui R()
{
static ui seed = 416;
return seed ^= seed >> 5, seed ^= seed << 17, seed ^= seed >> 13;
}
const int N = 233333, inf = 2e9 + 1e8;
struct node
{
ll ans;
bool emp;
ll a, b, c, mx; //(x+a)/b+c (a<b<=inf)
node() { b = 1; }
} tree[N << 2];
inline void pushadd(int k, ll x) {
tree[k].ans += x; tree[k].c += x;
}
inline void pushdiv(int k, int d) {
tree[k].ans /= d;
ll fm = 1ll * tree[k].b * d, tmp = (tree[k].a + 1ll * tree[k].b * tree[k].c) / fm;
ll fz = (tree[k].a + 1ll * tree[k].b * tree[k].c) - fm * tmp;
tree[k].c = tmp;
if (fm > inf) fz = max(0ll, fz + (inf - fm)), fm = inf;
tree[k].a = fz, tree[k].b = fm;
// printf("%d:%lld %lld %lld\n",k,tree[k].a,tree[k].b,tree[k].c);
}
inline void pushemp(int k) {
tree[k].emp = 1;
tree[k].a = tree[k].c = 0;
tree[k].b = 1;
tree[k].ans = tree[k].mx;
}
inline void pushdown(int k) {
if (tree[k].emp) pushemp(k << 1), pushemp(k << 1 | 1), tree[k].emp = 0;
if (tree[k].a) pushadd(k << 1, tree[k].a), pushadd(k << 1 | 1, tree[k].a), tree[k].a = 0;
if (tree[k].b != 1) pushdiv(k << 1, tree[k].b), pushdiv(k << 1 | 1, tree[k].b), tree[k].b = 1;
if (tree[k].c) pushadd(k << 1, tree[k].c), pushadd(k << 1 | 1, tree[k].c), tree[k].c = 0;
}
inline void upd(int k){ tree[k].ans = max(tree[k << 1].ans, tree[k << 1 | 1].ans); }
void mdy1(int k, int l, int r, int x, int L, int R) {
if (l == L && r == R) { pushadd(k, x); return; }
int mid = (L + R) >> 1;
pushdown(k);
if (r <= mid) mdy1(k << 1, l, r, x, L, mid);
else if (l > mid) mdy1(k << 1 | 1, l, r, x, mid + 1, R);
else mdy1(k << 1, l, mid, x, L, mid), mdy1(k << 1 | 1, mid + 1, r, x, mid + 1, R);
upd(k);
}
void mdy2(int k, int l, int r, int x, int L, int R) {
if (l == L && r == R) { pushdiv(k, x); return; }
int mid = (L + R) >> 1;
pushdown(k);
if (r <= mid) mdy2(k << 1, l, r, x, L, mid);
else if (l > mid) mdy2(k << 1 | 1, l, r, x, mid + 1, R);
else mdy2(k << 1, l, mid, x, L, mid), mdy2(k << 1 | 1, mid + 1, r, x, mid + 1, R);
upd(k);
}
void mdy3(int k, int l, int r, int x, int L, int R) {
if (l == L && r == R) { pushemp(k); return; }
int mid = (L + R) >> 1;
pushdown(k);
if (r <= mid) mdy3(k << 1, l, r, x, L, mid);
else if (l > mid) mdy3(k << 1 | 1, l, r, x, mid + 1, R);
else mdy3(k << 1, l, mid, x, L, mid), mdy3(k << 1 | 1, mid + 1, r, x, mid + 1, R);
upd(k);
}
int qry(int k, int l, int r, int x, int L, int R)
{
if (l == L && r == R) return tree[k].ans;
int mid = (L + R) >> 1;
pushdown(k);
if (r <= mid)
return qry(k << 1, l, r, x, L, mid);
else if (l > mid)
return qry(k << 1 | 1, l, r, x, mid + 1, R);
return max(qry(k << 1, l, mid, x, L, mid), qry(k << 1 | 1, mid + 1, r, x, mid + 1, R));
}
int n, q, a[N];
void build(int k, int l, int r)
{
if (l == r) { tree[k].mx = tree[k].ans = a[l]; return; }
int mid = (l + r) >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
tree[k].mx = tree[k].ans = max(tree[k << 1].mx, tree[k << 1 | 1].mx);
}
int main()
{
read(n); read(q); rep(i, 0, n - 1) read(a[i]);
build(1, 0, n - 1);
while (q--)
{
int op, l, r, x;
read(op); read(l); read(r); read(x);
if (op == 0) mdy1(1, l, r, x, 0, n - 1);
else if (op == 1) mdy2(1, l, r, x, 0, n - 1);
else if (op == 2) printf("%d\n", qry(1, l, r, 0, 0, n - 1));
else mdy3(1, l, r, x, 0, n - 1);
}
return 0;
}
浮点数运算控制精度
直接全部转化成浮点数运算,三标记线段树。
考虑到浮点数自带精度损失,对于较大的除数,自动使得原数变成零,long double
的精度可以支持。
爆零小技巧:ST
表空间开一倍
int ST[_][LOG + 3], Log[_];
void init_query(){
rep(i, 1, n) ST[i][0] = A[i];
rep(j, 1, LOG) rep(i, 1, n) ST[i][j] = max(ST[i][j - 1], ST[i + (1 << (j - 1))][j - 1]); // ST[i + (1 << (j - 1))][j - 1] 会访问 O( 2 * N )
Log[1] = 0; rep(i, 2, n) Log[i] = Log[i >> 1] + 1;
}
const int _ = 2e5 + 100;
int n, q; LL A[_];
namespace Acceptable_Solution{
const int _ = 2e5 + 100;
const int LOG = 17;
int ST[_][LOG + 3], Log[_];
void init_query(){
rep(i, 1, n) ST[i][0] = A[i];
rep(j, 1, LOG) rep(i, 1, n) ST[i][j] = max(ST[i][j - 1], ST[i + (1 << (j - 1))][j - 1]);
Log[1] = 0; rep(i, 2, n) Log[i] = Log[i >> 1] + 1;
}
int Query_Max(int L, int R) { int Lg = Log[R - L + 1]; int Len = (1 << Lg); return max(ST[L][Lg], ST[R - Len + 1][Lg]); }
#define LB long double
LB eps;
void print(LB x) { printf("%.20Lf\n", x); }
namespace SegmentTree{
bool same(LB x, LB y) { return fabs(x - y) <= 1e-12; }
const int _ = 6e5 + 100;
int ch[_][2], tot = 0;
LB v[_], tag_add[_], tag_mul[_];
bool tag_ret[_];
#define ls(o) (ch[o][0])
#define rs(o) (ch[o][1])
#define maintain(o) (v[o] = max(v[ls(o)], v[rs(o)]))
#define make (tot++, ch[tot][0] = ch[tot][1] = 0, tag_add[tot] = 0, tag_mul[tot] = 1, tag_ret[tot] = 0, tot)
int Groot(){ return make; }
void build(int o, int L, int R){
if(L == R) return (void)(v[o] = A[L]);
int mid = (L + R) >> 1; ls(o) = make; rs(o) = make;
build(ls(o), L, mid); build(rs(o), mid + 1, R);
maintain(o);
}
void tar_ret(int o, int L, int R){
v[o] = Query_Max(L, R);
tag_add[o] = 0; tag_mul[o] = 1;
tag_ret[o] = 1;
}
void push_ret(int o, int L, int R){
if(!tag_ret[o]) return ;
int mid = (L + R) >> 1;
tar_ret(ls(o), L, mid); tar_ret(rs(o), mid + 1, R);
tag_ret[o] = 0;
}
void tar_add(int o, LB Val, int L, int R){
push_ret(o, L, R);
v[o] += Val;
tag_add[o] += Val;
}
void tar_mul(int o, LB Val, int L, int R) {
push_ret(o, L, R);
v[o] *= Val;
tag_mul[o] *= Val;
tag_add[o] *= Val;
}
void push(int o, int L, int R){
push_ret(o, L, R);
int mid = (L + R) >> 1;
if(!same(tag_mul[o], 1)) {
tar_mul(ls(o), tag_mul[o], L, mid);
tar_mul(rs(o), tag_mul[o], mid + 1, R);
tag_mul[o] = 1;
}
if(!same(tag_add[o], 0)){
tar_add(ls(o), tag_add[o], L, mid);
tar_add(rs(o), tag_add[o], mid + 1, R);
tag_add[o] = 0;
}
}
void update_add(int o, int nowl, int nowr, int L, int R, int Val){
if(L <= nowl && nowr <= R) return tar_add(o, Val, nowl, nowr);
int mid = (nowl + nowr) >> 1;
push(o, nowl, nowr);
if(L <= mid) update_add(ls(o), nowl, mid, L, R, Val);
if(R > mid) update_add(rs(o), mid + 1, nowr, L, R, Val);
maintain(o);
}
void update_mul(int o, int nowl, int nowr, int L, int R, LB Val){
if(L <= nowl && nowr <= R) return tar_mul(o, Val, nowl, nowr);
int mid = (nowl + nowr) >> 1;
push(o, nowl, nowr);
if(L <= mid) update_mul(ls(o), nowl, mid, L, R, Val);
if(R > mid) update_mul(rs(o), mid + 1, nowr, L, R, Val);
maintain(o);
}
void update_ret(int o, int nowl, int nowr, int L, int R){
if(L <= nowl && nowr <= R) return tar_ret(o, nowl, nowr);
int mid = (nowl + nowr) >> 1;
push(o, nowl, nowr);
if(L <= mid) update_ret(ls(o), nowl, mid, L, R);
if(R > mid) update_ret(rs(o), mid + 1, nowr, L, R);
maintain(o);
}
LB query(int o, int nowl, int nowr, int L, int R){
if(L <= nowl && nowr <= R) return v[o];
int mid = (nowl + nowr) >> 1;
push(o, nowl, nowr);
LB ans = LLONG_MIN;
if(L <= mid) ans = max(ans, query(ls(o), nowl, mid, L, R));
if(R > mid) ans = max(ans, query(rs(o), mid + 1, nowr, L, R));
return ans;
}
}using SegmentTree::build; using SegmentTree::query; using SegmentTree::update_add;
using SegmentTree::update_mul; using SegmentTree::update_ret; using SegmentTree::Groot;
void work(){
init_query();
int root = Groot(); build(root, 1, n); LB one = 1;
while(q--) {
int t, L, R, x; Read(t)(L)(R)(x); L ++, R ++;
if(t == 0) update_add(root, 1, n, L, R, x);
if(t == 1) update_mul(root, 1, n, L, R, one / x);
if(t == 2) printf("%lld\n", (long long)(query(root, 1, n, L, R) + 1e-10));
if(t == 3) update_ret(root, 1, n, L, R);
}
}
}
int main(){ //freopen("in.txt", "r", stdin);
Read(n)(q); rep(i, 1, n) Read(A[i]);
Acceptable_Solution::work();
return 0;
}
D. four
你有
1..2n
共
2n
个数,有
n
个人,你会给每个人分两个随机的数,这样就把
2n
个数分完了,每个人获得的总数就是这两个数相加。这个随机过程可以认为是,先把
2n
个数随机排列,将前2个数分给第一个人,将接下来前2个数分给第二个人……不难看出这个过程是没有歧义的
你想知道有多大概率,使得总和最大的人唯一(不存在两个相同的最大值),答案模
998244353
没听懂…。
Round 3
A. diyiti
有
n
个物品,每个物品价格
Ai
,收益为
Bi
,由于一些奥妙重重的原因,当你买了一些物品,总价格为选择的
Ai
的按位或而不是代数相加!
你身上只有
k
元钱,你希望选择总价格不超过
k
的一些物品,来获得最大的收益。
对于所有数据,1≤n≤105,0≤k<230,0≤Ai<230,0≤Bi≤109。
一种天然的想法就是考虑枚举,每一个
i≤k
然后累加所有可以被选的物品求最大值,显然能保证正确性。得到一个
O(kn)
的优秀做法。 发现这样枚举的每一个
i
有很多没有必要的枚举。
其实可以枚举放弃
k
的哪一位 1
。
例如: 若
k=(1001101001)2
那么有意义的
i
就可能是: -
(0111111111)2
-
(1000111111)2
-
(1001011111)2
-
(1001100111)2
-
(1001101001)2
也就是枚举某一位
1
把这个
1
变成
0,然后把这后面的所有数字变成
1。
int n, k;
int Lim[_], Pr[_];
LL calc(int x){
LL ans = 0;
rep(i, 1, n) if((x | Lim[i]) == x) ans += Pr[i];
return ans;
}
int main(){
Read(n)(k); rep(i, 1, n) Read(Lim[i])(Pr[i]);
LL ans = calc(k);
for(int i = 30; i >= 0; i--){
if(k & (1 << i)) ; else continue;
int Lit = k;
Lit ^= (1 << i); Lit |= ((1 << i) - 1);
ans = max(calc(Lit), ans);
}
printf("%lld", ans);
return 0;
}
B. dierti
给你一个长度为
n
的数组
an,你需要求出一个最长的子序列
C,使得其相邻两项按位与的结果均非零
(∀ i, Ci & Ci+1>0)。
这比第一题好想多了吧。 考虑
dp[n]
表示
[1,n]
中强制
n
一定选 符合要求的最长子序列,可以考虑枚举
[1..n−1]
中上一个选择的是哪一个,即
dp[n]=1+i=1maxn−1dp[i][Ci&Cn>0]
这样的复杂度是
O(n2)
的。
考虑如果满足
Ci&Cj>0
那么需要
Ci,Cj
至少一个二进制位置相同。那就维护一个数组,Bmax[i]
表示
C
的第
i
位为
1
的所有
Cj
最大的
dp[j],即可实现
O(logCmax)
转移。同时需要
O(logCmax)
维护数组
Bmax。
总复杂度
O(nlogCmax)。
int n, A[_];
int Bmax[60];
int dp[_];
int main(){
n = read(); rep(i, 1, n) Read(A[i]);
dp[1] = 1; rep(j, 0, 30) if(A[1] & (1 << j)) Bmax[j] = max(Bmax[j], dp[1]);
rep(i, 2, n){
int ans = 0;
rep(j, 0, 30) if(A[i] & (1 << j)) ans = max(ans, Bmax[j]);
dp[i] = ans + 1;
rep(j, 0, 30) if(A[i] & (1 << j)) Bmax[j] = max(Bmax[j], dp[i]);
}
int ans = 0; rep(i, 1, n) ans = max(ans, dp[i]);
printf("%d", ans); cerr << "std's ans = " << ans << endl;
return 0;
}
C. disanti
statement
你有
n
个
10
进制下的位数为
m
的数
有些数字被抹去了,因此取值任意。
你希望这
n
个数单调递增,请求出所有满足这个条件的方案下,这
n
个数之和的总和。
答案对
998244353
取模。
n,m≤30
#### input
第一行两个整数
n,m(1≤n,m≤50)
接下来
n
行,每行
m
个字符,字符为
0..9
的数字或者?
。
INPUT0:
4 1
0
?
4
8
OUTPUT0:
42
INPUT1:
5 5
?1234
23333
???66
??666
?233?
OUTPUT1:
819525655
没听懂… 待补。
D. disiti
你有一堆n个石子的石子堆,你想要把石子堆裂成n个大小为1的石子堆。为了达成这个目的,你每次可以进行如下操作:假设现在有k堆石子,大小分别为a1,a2,...,ak,你可以指定一个非负整数序列b1,b2,...,bk,满足∑bi≤m,每堆石子就会分裂成两堆bi,ai−bi(如果为0就认为不存在,显然还需要满足bi≤ai)。你想要知道最少几次操作可以达成目的。
对于所有数据,T≤1000,1≤m≤n≤109
没听懂… 待补。
Round 4
A. 一
你是能看到第一题的friends呢。 ——hja
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
现在我们要执行若干代码,代码为对于变量的操作,包含以下三种: -
1、变量名=变量值,变量名由小写字母组成,变量值有可能是正整数或者字符串(小写字母或者数字),例如:a=3,b=“233”。
- 2、变量名,代表询问该变量的值,如果该变量未赋值,则输出no。 -
3、变量名+=值,如果该变量未定义,直接跳过该次操作。设该变量的值为x,加上的值为y,如果两者均为整数直接相加;如果x是整数y为字符串则跳过此次操作;如果x是字符串y是整数则将y转换为字符串进行字符串拼接;如果两者均为字符串直接进行字符串拼接。
-
全程 STL。
map<string , string> M;
map<string , bool > Type; // true for string , false for int
string tmp;
pair<string , string> Res;
int split(string S){
if(S.find('=') >= S.size() || S.find('=') < 0){ // TODO: check
return 2;
} else {
if(S.find('+') < S.size() && S.find('+') >= 0){
Res = make_pair(S.substr(0, S.find('+')), S.substr(S.find('=') + 1, S.size() - S.find('=') - 1));
return 3;
} else {
Res = make_pair(S.substr(0, S.find('=')), S.substr(S.find('=') + 1, S.size() - S.find('=') - 1));
return 1;
}
}
}
string calc(string A, string B){
long long ResA = 0;
rep(i, 0, A.size() - 1){
ResA *= 10;
ResA += A[i] - '0';
}
long long ResB = 0;
rep(i, 0, B.size() - 1){
ResB *= 10;
ResB += B[i] - '0';
}
ResA += ResB;
string Res, ans ; Res = "";
while(ResA) Res.push_back(ResA % 10 + '0'), ResA /= 10;
for(int i = Res.size() - 1; i >= 0; i--) ans.push_back(Res[i]);
return ans;
}
bool pdType(string &S) { return S[0] == '"'; } // true for string
int main(){ //freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout);
ios::sync_with_stdio(false);
int q; cin >> q;
while(q--){
cin >> tmp;
int r = split(tmp);
if(r == 1){
int re = pdType(Res.second); if(re) Res.second = (Res.second.size() == 2 ? string("") : Res.second.substr(1, Res.second.size() - 2));
M[Res.first] = Res.second;
Type[Res.first] = re;
} else if(r == 2){
if(M.count(tmp)) cout << M[tmp] << endl;
else cout << "no" << endl;
} else {
if(M.count(Res.first)) ; else continue;
int ex_t = pdType(Res.second); if(ex_t) Res.second = Res.second.substr(1, Res.second.size() - 2);
int no_t = Type[Res.first];
if( ex_t && no_t) M[Res.first] = M[Res.first] + Res.second;
if( ex_t && !no_t) { continue; }
if(!ex_t && no_t) M[Res.first] = M[Res.first] + Res.second;
if(!ex_t && !no_t) M[Res.first] = calc(M[Res.first], Res.second);
}
}
return 0;
}
B. 二
你是能看到第二题的friends呢。 ——aoao
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
N
个小写字母字符串, Alice 和 Bob 按照如下方法玩游戏: -
1、Alice选择一个字符串,并重新定义
26
个字母的字典序,然后再将这个字符串内部字符按照任意顺序重排。 -
2、Bob从剩下的字符串中选择一个,并将这个字符串内部字符按照任意顺序重排。
他们的目标是使得自己字符串的字典序比对面小,谁的字符串字典序更小谁就赢了。问
Alice 有多少个可以选择的字符串能够使得自己获胜?
N≤1000
因为可以重新排列字符串,所以对于每个字符串来说,有用的信息就是每个字符串中每个字符的出现次数。
可以考虑先枚举一个字符串,然后判断这个字符串是否能被 Alice
选。然后考虑确定字典序,可以以此考虑字典序最小的应该是哪个字符,确定了字典序最小的字符之后,可以排除掉一些字符串(字典序最小的字符在这些串中的出现次数
<
在枚举串中的出现次数),然后又转化成原来相同的问题。
关键在于如何确定当前情况下字典序最小的字符。显然,理想的字典序最小的字符
在当前枚举到的字符串中的出现次数一定不少于在其他串中的出现次数。但是这样的字符可能有多个,应该选哪个?
其实选哪个效果一样,本质上只是以此选择当前情况下字典序最小的字符,然后剔除一些字符串,但是剔除字符串的条件和剔除顺序无关。
最后判断是否所有字符串都被剔除掉即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#define rep(i, l, r) for(int i = (l), __ = (r); i <= __; i++)
const int _ = 1010;
using namespace std;
inline int idx(char c) { return c - 'a' + 1; }
int ch[_][30]; int n;
char S[_];
bool book[_];
bool bch[200];
int main(){
scanf("%d", &n); rep(i, 1, n) { scanf("%s", S + 1); int k = strlen(S + 1); rep(j, 1, k) ch[i][idx(S[j])] ++; }
int ans = 0;
rep(i, 1, n){
memset(book, 0, sizeof(book)); memset(bch, 0, sizeof(bch)); book[i] = 1;
rep(j, 1, 26) {
rep(k, 'a', 'z') { if(bch[k]) continue;
bool pass = true;
rep(l, 1, n) {
if(book[l]) continue;
if(ch[l][idx(k)] > ch[i][idx(k)]) { pass = false; break; }
}
if(pass){
bch[k] = 1;
rep(l, 1, n) if(ch[l][idx(k)] < ch[i][idx(k)]) book[l] = 1;
break;
}
}
}
bool pass = true; rep(i, 1, n) if(book[i] != 1) { pass = false; break; }
ans += pass;
}
printf("%d", ans);
return 0;
}
C. 三
你是能看到第三题的friends呢。 ——laekov
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
给定N个数,设总共有M个区间p1=[l1,r1],p2=[l2,r2],⋯,pM=[lm,rm]的逆序对数量不少于K个。定义函数f(pi,pj)为计算两个区间的交集大小的函数(即共同覆盖了多少个数)。求
∑i=1M∑j=i+1Mf(pi,pj)
N≤106
考虑每一个元素的贡献,不难发现,元素的贡献为
(2被覆盖的区间数)
,问题转化为怎么求每个元素被覆盖的次数。
考虑对于每一个左端点
L,合法的右端点取值一定是一段连续的区间,且
如果存在上界一定是
n
,对于每个左端点,求出其对应的最小的右端点,这里可以使用
two-point
。值域树状数组统计逆序对数。
考虑每个左端点为
L
的区间对元素覆盖数的贡献,发现一定是一条平直线和一个下降直线,可以对差分数组的差分数组做修改,然后两次前缀和还原出原序列。
const int _ = 2e6 + 100;
const int inv2 = 500000004;
int n, k, A[_];
namespace BIT{
#define lowbit(x) (x & (-x))
int C[_];
void add(int p, int x) { if(p == 0) return ; for(int i = p; i <= n; i += lowbit(i)) C[i] += x; }
int query(int p) { int ans = 0; for(int i = p; i >= 1; i -= lowbit(i)) ans += C[i]; return ans; }
} using BIT::add; using BIT::query;
int L = 0, R = 0;
int Rp[_];
int C[_];
int main(){
Read(n)(k); rep(i, 1, n) Read(A[i]);
LL ans = 0;
rep(L, 1, n){
if(L - 1 > 0) add(A[L - 1], -1);
if(L - 1 > 0) ans -= query(A[L - 1] - 1);
while((R < L) || (ans < k && R <= n)) { if(R == n) { R++; break; }; add(A[++R], 1); ans += query(n) - query(A[R]); }
Rp[L] = R;
}
rep(L, 1, n){
if(Rp[L] > n) continue; int cnt = (n - Rp[L] + 1);
C[L] = (C[L] +0ll+ cnt) % MOD; C[L + 1] = (C[L + 1] +0ll+ (MOD -0ll- cnt) % MOD) % MOD;
C[Rp[L] + 1] = (C[Rp[L] + 1] +0ll+ MOD - 1) % MOD;
}
rep(i, 1, n) C[i] = (C[i] +0ll+ C[i - 1]) % MOD;
rep(i, 1, n) C[i] = (C[i] +0ll+ C[i - 1]) % MOD;
ans = 0;
rep(i, 1, n) ans = (ans +0ll+ (C[i] *1ll* (C[i] - 1) % MOD *1ll* inv2 % MOD)) % MOD;
printf("%lld", ans);
return 0;
}
D. 四
你是能看到第四题的 friends 呢。 ——laekov
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
今天也是皮克敏们打工的一天,你有
N
只皮克敏,每只皮克敏有一颗炸弹。现在有一颗
N
个点的树,同时皮克敏们可以从
p1
或者
p2
两个点中的任意一个进入树。每次你需要派一只皮克敏去到某个点,然后将炸弹连同皮克敏和这个点一起炸掉。一个点被炸掉了之后皮克敏就再也不能通过了。现在你需要决定皮克敏们炸点的顺序,问
n!
种炸点方案中有多少种能炸掉所有点。
N≤1000
考虑 DP
。
首先考虑一个子树(子树内没有
p1,p2)全部被清空应该是什么顺序,一定是每个儿子的子树先被清空然后清楚当前点。
这里可以使用树形 dp 处理。
先考虑
p1↔p2
这一条链上的点应该是按照什么顺序被清空,任意时刻,被清空的点一定是链上的连续的一段,这里可以区间
dp
统计答案,转移考虑最后一次删除是删干净了链上最右边的点还是最左边的点。
然后和
p1,p2
的每个不在链上的儿子合并答案,最后决策先删除
p1
还是
p2。
代码还没写。
Round 5
A. 一
现在有四种颜色的东西,各有n1,n2,n3,n4个。你需要把他们放到一排里面,并且保证相邻的东西颜色不同,问方案数。
对于80%的数据,n1+n2+n3+n4≤10。
对于另外10%的数据,n1=0,n2,n3,n4≤50。
对于100%的数据,0≤n1,n2≤200,0≤n3,n4≤50000。
namespace subtask1{
int dp[_][_][_][_][5];
void work(){
memset(dp, 0, sizeof(dp));
dp[1][0][0][0][1] = dp[0][1][0][0][2] = dp[0][0][1][0][3] = dp[0][0][0][1][4] = 1;
rep(i, 0, A) rep(j, 0, B) rep(k, 0, C) rep(l, 0, D){
if(i + j + k + l == 1) continue;
if(i > 0) dp[i][j][k][l][1] = (dp[i - 1][j][k][l][2] +0ll+ dp[i - 1][j][k][l][3] +0ll+ dp[i - 1][j][k][l][4]) % MOD;
if(j > 0) dp[i][j][k][l][2] = (dp[i][j - 1][k][l][1] +0ll+ dp[i][j - 1][k][l][3] +0ll+ dp[i][j - 1][k][l][4]) % MOD;
if(k > 0) dp[i][j][k][l][3] = (dp[i][j][k - 1][l][2] +0ll+ dp[i][j][k - 1][l][1] +0ll+ dp[i][j][k - 1][l][4]) % MOD;
if(l > 0) dp[i][j][k][l][4] = (dp[i][j][k][l - 1][2] +0ll+ dp[i][j][k][l - 1][3] +0ll+ dp[i][j][k][l - 1][1]) % MOD;
}
printf("%d\n", ans1 = int((1ll* dp[A][B][C][D][1] + dp[A][B][C][D][2] + dp[A][B][C][D][3] + dp[A][B][C][D][4]) % MOD));
}
}
namespace subtask2{
const int _ = 53;
int dp[_][_][_][4];
void work(){
memset(dp, 0, sizeof(dp));
dp[1][0][0][1] = dp[0][1][0][2] = dp[0][0][1][3] = 1;
rep(i, 0, B) rep(j, 0, C) rep(k, 0, D){
if(i + j + k == 1) continue;
if(i > 0) dp[i][j][k][1] = (dp[i - 1][j][k][2] +0ll+ dp[i - 1][j][k][3]) % MOD;
if(j > 0) dp[i][j][k][2] = (dp[i][j - 1][k][1] +0ll+ dp[i][j - 1][k][3]) % MOD;
if(k > 0) dp[i][j][k][3] = (dp[i][j][k - 1][2] +0ll+ dp[i][j][k - 1][1]) % MOD;
}
printf("%d\n", ans2 = int(( dp[B][C][D][1] +0ll+ dp[B][C][D][2] +0ll+ dp[B][C][D][3] ) % MOD));
}
}
B. 二
N个二元组(ai,bi),定义c1=a1+b1,ci=bi+max(ci−1,∑j=1iaj)。现在你可以随意重排这N个二元组,求cN的最小值
N≤106;A,B≤N
考虑相邻两个二元组
(a1,b1)(a2,b2)
应该怎么比较大小。 分别列出
(a1,b1)
在
(a2,b2)
之前的答案和交换之后的答案。
如果
(a1,b1)
在
(a2,b2)
之前:设这两个二元组之前所有二元组中
a
的和为
x,设上一个二元组的
C
值为
y。
根据定义
C1=b1+max(y,a1+x),C2=b2+max(C1,x+a1+a2)
化简后得到
C2=max(y+b1+b2,x+a1+b1+b2,x+a1+a2+b2)
易知 交换后
C2′=max(y+b1+b2,x+a2+b1+b2,x+a1+a2+b1)
现在需要比较
C2
和
C2′
的大小。相当于对
6
个式子取最大值,看最大值出现在哪边。相同的项
y+b1+b2
可以消去,如果其为最大值,那么两个式子谁在前谁在后无所谓,如果其不是最大值,那么也没有影响。
消去每一项中相同的
x。
C2=max(a1+b1+b2,a1+a2+b2)
C2′=max(a2+b1+b2,a1+a2+b1)
提出共同的项:
C2=a1+b2+max(b1,a2)
C2′=a2+b1+max(b2,a1)
假设
C2<C2′
则
a1+b2+max(b1,a2)<a2+b1+max(b2,a1)
移项得
a1+b2−max(b2,a1)<a2+b1−max(b1,a2)
得出
min(a1,b2)<min(a2,b1)
一种特殊情况是取等的时候:举几个栗子得出 结论是取等时比较
a1<a2。
bool CMP(pair<int, int> x, pair<int, int > y){
int r0 = min(x.first, y.second);
int r1 = min(y.first, x.second);
if(r0 != r1) return r0 < r1;
return x.first < y.first;
}
C. 三
给定
N
个数,M
次操作,操作有以下四种: - 1、区间加一个数。 - 2、区间乘一个数。 -
3、区间变成一个数。 -
4、求所有子区间的平均值的和(MOD=109+7)。
ai,N,Q≤105
Ans=i=1∑nj=i∑nj−i+1k=i∑jak
考虑每个数字的贡献
Ans=k=1∑nak×i=1∑nj=i∑nj−i+11
算出贡献,线段树维护即可。可以考虑
k
每增加 1 贡献会变化多少。也可以发现贡献类似于一个梯形,可以直接算。
void work(){ cerr << "FUCK" << endl;
S[1] = 1; rep(i, 2, n) S[i] = (S[i - 1] +0ll+ inv(i)) % MOD;
int ans = 0, dp = 0;
rep(i, 1, n){
int last = i - 1; dp = (dp -0ll- S[last] + MOD) % MOD;
dp = (dp -0ll- (S[n] -0ll- S[n - last] +0ll+ MOD) % MOD +0ll+ MOD) % MOD;
dp = (dp +0ll+ (S[n] -0ll- S[i] +0ll+ MOD) % MOD) % MOD;
dp = ( dp +0ll+ S[i]) % MOD; // 这里的 dp 就是位置为 i 的数字对答案贡献的系数。
ans = (ans +0ll+ dp *1ll* A[i] % MOD) % MOD;
}
printf("%d", ans);
}
D. 四
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
皮克敏们打完工了,是时候将所有皮克敏处理掉了。现在皮克敏们躲在一棵树上(点和边的任意位置都有可能),你可以选择若干叶子节点释放毒气,毒气会以每单位时间一单位的距离沿着边蔓延开来。为了能够灭绝皮克敏,你需要保证树上每个位置都充满了毒气。但是仅仅是求一个最小的灭绝皮克敏的时间实在太无趣了,你想要知道你有多少种不同的方法能够灭绝皮克敏,两个方法不同当且仅当两种方法灭绝所有皮克敏的时间不同。
N≤200
第一行一个整数
N
代表树上点的个数。
接下来
N−1
行每行三个整数
s,e,d
代表一条边的两端和长度。
答案只能是某两个叶子之间的距离或者距离 $ / 2$ 。 枚举两个叶子,把 -
这个叶子之间的距离(只在一边放毒气)(如果能成为答案) -
两个叶子之间距离 $ / 2$(两个叶子上都放毒气)(如果能成为答案)
加入答案集合。 最后输出答案集合的大小。
枚举两个叶子,判断其距离是否能成为答案。考虑哪些其他叶子放毒气能让这个距离尽可能成为答案,就是那些放上毒气不会影响这两个枚举的叶子之间毒气传播时间的叶子都放上毒气,然后跑一遍最短路,算全树被毒气覆盖的时间是否等于当前枚举的叶子。
const int _ = 510;
pair<pair<int, int>, int > E[_];
int n, m;
int M[_][_];
set<int> Ans;
queue<int>Q; bool inQ[_];
int SPFA(){
static int dis[_]; memset(dis, 0x3f, sizeof(dis));
rep(i, 1, n) if(inQ[i]) dis[i] = 0;
while(!Q.empty()){
int now = Q.front(); Q.pop(); inQ[now] = 0;
for(int i = head[now]; i ;i = edge[i].nxt){
int ex = edge[i].node;
if(dis[now] + edge[i].w < dis[ex]) {
dis[ex] = dis[now] + edge[i].w;
if(!inQ[ex]) Q.push(ex), inQ[ex] = true;
}
}
}
int MAX = INT_MIN;
rep(i, 1, n - 1) {
pair<pair<int, int>, int> now = E[i];
int T = min(dis[now.first.first] + now.second, dis[now.first.second] + now.second, (dis[now.first.first] + dis[now.first.second] + now.second) / 2);
MAX = max(MAX, T);
}
return MAX;
}
int ind[_];
bool work1(int x, int y, int D) {
Q.push(x); inQ[x] = 1;
rep(i, 1, n) { if(i == x || i == y) continue; if(M[i][y] >= D && ind[i] == 1) Q.push(i), inQ[i] = 1; }
return SPFA() == D;
}
bool work2(int x, int y, int D){
Q.push(x); Q.push(y); inQ[x] = inQ[y] = 1;
rep(i, 1, n){
if(x == i || y == i) continue;
if(max(M[x][i], M[y][i]) / 2 >= D && ind[i] == 1) Q.push(i), inQ[i] = 1;
}
return SPFA() == D;
}
int main(){
memset(M, 0x3f, sizeof(M));
rep(i, 1, n) M[i][i] = 0;
Read(n); rep(i, 1, n - 1) { int u, v, w; Read(u)(v)(w); ind[u] ++; ind[v]++; w <<= 1; add(u, v, w); add(v, u, w); M[u][v] = M[v][u] = w; E[i] = make_pair(make_pair(u, v), w); }
rep(k, 1, n) rep(i, 1, n) rep(j, 1, n) M[i][j] = M[j][i] = min(M[i][j], M[i][k] + M[k][j]);
rep(i, 1, n) rep(j, 1, n){ if(i == j) continue; if(ind[i] != 1 || ind[j] != 1) continue;
if(!Ans.count(M[i][j]) && work1(i, j, M[i][j])) Ans.insert(M[i][j]);
if(!Ans.count(M[i][j] >> 1) && work2(i, j, M[i][j] >> 1)) Ans.insert(M[i][j] >> 1);
}
printf("%d", int(Ans.size()));
return 0;
}
Round 6
A. 一
现在我们有两队皮克敏,个数分别为n1,n2,现在我们要杀掉这些皮克敏,按照如下规则操作:对于第i轮杀皮克敏的操作,我们首先选择皮克敏较多的那一队,如果一样就选择第一队,然后杀掉这队中的i个皮克敏,如果不够,游戏结束,记做游戏在第i轮结束。问最后两队各剩下多少个皮克敏?
n≤1016
分成两阶段,一阶段是只杀多的那队,直到比另一队少。二阶段是两队交替着杀,可以证明,如果经过了第一阶段,那么第二阶段一定是交替着杀。
杀就完了。 分别二分即可,当然第一步也可以直接解方程。
LL A, B;
inline LL check(LL x) { return x * (x + 1) >> 1; }
LL Get(LL res){
LL L = 0, R = 1e9, ans = 0;
while(L < R){
LL mid = L + ((R - L + 1) >> 1);
if(check(mid) <= res) ans = mid, L = mid;
else R = mid - 1;
}
return ans;
}
LL Start = 0; LL tA, tB;
bool check0(LL Round, LL A, LL B){
LL dA, dB; bool sf = false;
if(A < B) sf = true, swap(A, B);
if(Round & 1) {
dA = (Start + (Start + Round - 1)) * (Round / 2 + 1) >> 1;
dB = (Start + 1 + (Start + Round - 2)) * (Round / 2) >> 1;
} else {
dA = (Start + (Start + Round - 2)) * (Round / 2) >> 1;
dB = (Start + 1 + (Start + Round - 1)) * (Round / 2) >> 1;
} A -= dA; B -= dB;
if(sf) swap(A, B);
tA = A; tB = B;
return A >= 0 && B >= 0;
}
void doit(){
Read(A)(B);
LL d = max(A, B) - min(A, B);
LL Round = Get(d); LL del = check(Round);
if(A < B) B -= del; else A -= del;
if(A == B) {
if(A < Round + 1) return (void)printf("%lld %lld %lld\n", Round + 1, A, B);
else Round ++, A -= Round;
} else {
if(max(A, B) < Round + 1) return (void)printf("%lld %lld %lld\n", Round + 1, A, B);
else Round ++, (A > B ? A -= Round : B -= Round);
}
LL L = 0, R = 1e9, ans = 0; Start = Round + 1;
while(L < R) {
LL mid = L + ((R - L + 1) >> 1);
if(check0(mid, A, B)) ans = mid, L = mid;
else R = mid - 1;
} check0(ans, A, B);
printf("%lld %lld %lld\n", ans + Round + 1, tA, tB);
}
int main(){
int T = read(); cerr << "std's T = " << T << endl;
while(T--) doit();
return 0;
}
B. 二
现在有三组N个数记做A,B,C,定义函数f(A,B)=∑i=1NAi×Bi。现在给定A,B,并告诉你f(A,C)=x,现在想求在满足∑i=1NCi=1,0≤Ci≤1的情况下f(B,C)的最大值。
对于100%的数据,1≤N,M≤100,1≤Ai,Bi≤100
[skip] 结论是只有两个点有用,只枚举两个点即可。
C. 三
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
现在有一个
N
的排列,将其每个数看做一个集合。定义一种对两个集合的运算为:f(s1,s2)=∑x∈s1[∃y∈s2,y<x]
也可以用这样一段伪代码去理解:
Ans=0
For x in s1:
Able = False
For y in s2:
If y<x:
Able=True
If Able:
Ans++
Return Ans
现在你每次可以合并两个相邻的集合将其变为两个集合的并集,其代价为f(s1,s2)+f(s2,s1)。求最小代价,将所有集合合并为一个集合。
N≤102
函数
f(A,B)
其实就是
A
中有多少元素大于
minBi
。按照定义区间 dp 即可,由于是小于
O(n2)
级别的二维数点,可以使用二维前缀和。 查询最小值随手预处理一下
ST
表即可。
const int _ = 600;
int dp[_][_];
int S[_][_];
int n, A[_];
int query(int L, int R, int up){ // how many elements in range[L, R] which is > up
return S[n][R] - S[up][R] - S[n][L - 1] + S[up][L - 1];
}
const int _S = 4000;
const int LOG = 10;
int ST[_S][LOG + 2];
int Log[_S];
void initQuery(){
rep(i, 1, n) ST[i][0] = A[i];
rep(j, 1, LOG) rep(i, 1, n) ST[i][j] = min(ST[i][j - 1], ST[i + (1 << (j - 1))][j - 1]);
Log[1] = 0; rep(i, 2, n) Log[i] = Log[i >> 1] + 1;
}
int RMQ(int L, int R){
int Ln = Log[R - L + 1];
return min(ST[L][Ln], ST[R - (1 << Ln) + 1][Ln]);
}
int calc(int L0, int R0, int L1, int R1){
int min0 = RMQ(L0, R0), min1 = RMQ(L1, R1);
return query(L0, R0, min1) + query(L1, R1, min0);
}
int main(){
Read(n); rep(i, 1, n) Read(A[i]); initQuery();
rep(i, 1, n) S[A[i]][i]++;
rep(i, 1, n) rep(j, 1, n) S[i][j] += S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1];
memset(dp, 0x3f, sizeof(dp)); rep(i, 1, n) dp[i][i] = 0;
rep(Len, 2, n){
rep(L, 1, n){
int R = L + Len - 1; if(R > n) break;
int &ans = dp[L][R];
rep(k, L, R - 1) ans = min(ans, dp[L][k] + dp[k + 1][R] + calc(L, k, k + 1, R));
}
}
printf("%d", dp[1][n]);
return 0;
}
D. 四
给定
1−N
的排列但其中
M
个位置的值被删去了(用
0
表示),现在你需要将其复原,问有多少种方案能够使得复原的序列的逆序对个数在
[L,R]
之间
折半搜索,中间
O(n2)
合并。
Round 7
AK。 ### A. 一
有一个n×n的矩阵,矩阵中的每个数都是整数。现在要从矩阵中取m个数,要求每一行最多取一个数,每一列也最多取一个数。这m个数的和最大能是多少?
n≤15,m≤3,Ai,j≤105
const int _ = 20;
int n, m, A[_][_];
int main(){
Read(n)(m); rep(i, 1, n) rep(j, 1, n) Read(A[i][j]);
if(m == 1) {
int MAX = 0; rep(i, 1, n) rep(j, 1, n) MAX = max(MAX, A[i][j]);
printf("%d", MAX);
} else if(m == 2){
int MAX = 0;
rep(a, 1, n) rep(b, 1, n) rep(c, 1, n) rep(d, 1, n){
if(a == c || b == d) continue;
MAX = max(MAX, A[a][b] + A[c][d]);
}
printf("%d", MAX);
} else if(m == 3){
int MAX = 0;
rep(a, 1, n) rep(b, 1, n) rep(c, 1, n) rep(d, 1, n) rep(e, 1, n) rep(f, 1, n){
if(a == c || c == e || a == e || b == d || d == f || b == f) continue;
MAX = max(MAX, A[a][b] + A[c][d] + A[e][f]);
}
printf("%d", MAX);
}
return 0;
}
B. 二
有多少整数大于等于x,小于等于y,而且是7的倍数,又不是2,3,5的倍数呢?
x,y≤1018
容斥原理
LL calc(LL R){
LL ans = 0;
ans += R / 7; ans -= R / 14; ans -= R / 21; ans -= R / 35; ans += R / 42; ans += R / 70; ans += R / 105; ans -= R / 210;
return ans;
}
int main(){
LL L, R; Read(L)(R);
printf("%lld", calc(R) - calc(L - 1));
return 0;
}
C. 三
给出一个n个点m条边的图。
现在想要选择两个整数a和b,满足1≤a<b<n,然后把编号在区间[1,a]中的点染成蓝色,把编号在区间[a+1,b]中的点染成红色,编号在区间[b+1,n]中的点染成蓝色。
如果一条边的两个端点颜色不同,我们称这条边为双色边,否则称之为单色边。
如何选择a,b,能够最小化双色边的数量?
n,m≤105
经典套路,按顺序枚举
a,线段树维护
b
的每一个取值时的双色边数量,枚举
a
的过程中维护
b
的取值,更新答案即可。
int n, m;
const int _ = 3e5 + 100;
vector<int> ToL[_];
vector<int> ToR[_];
namespace SegmentTree{ // maintain the number of double-color edge;
// the min number ;
const int _ = 2e6 + 100;
int ch[_][2], v[_], tag_add[_], tot = 0;
#define ls(o) (ch[o][0])
#define rs(o) (ch[o][1])
#define maintain(o) (v[o] = min(v[ls(o)], v[rs(o)]))
#define make (tot++, ch[tot][0] = ch[tot][1] = v[tot] = tag_add[tot] = 0, tot)
int Groot(){ return make; }
void build(int o, int L, int R){
if(L == R) return (void)(v[o] = 0); int mid = (L + R) >> 1;
ls(o) = make; rs(o) = make;
build(ls(o), L, mid); build(rs(o), mid + 1, R);
maintain(o);
}
void tar(int o, int _v){ tag_add[o] += _v; v[o] += _v; }
void push(int o) { if(!tag_add[o]) return ; tar(ls(o), tag_add[o]); tar(rs(o), tag_add[o]); tag_add[o] = 0; }
void update(int o, int nowl, int nowr, int L, int R, int Val){
if(L <= nowl && nowr <= R) return tar(o, Val);
int mid = (nowl + nowr) >> 1; push(o);
if(L <= mid) update(ls(o), nowl, mid, L, R, Val);
if(R > mid) update(rs(o), mid + 1, nowr, L, R, Val);
maintain(o);
}
int query(int o, int nowl, int nowr, int L, int R){
if(L <= nowl && nowr <= R) return v[o];
int mid = (nowl + nowr) >> 1; push(o);
int ans = INT_MAX;
if(L <= mid) ans = min(ans, query(ls(o), nowl, mid, L, R));
if(R > mid) ans = min(ans, query(rs(o), mid + 1, nowr, L, R));
return ans;
}
} using SegmentTree::update; using SegmentTree::build;
using SegmentTree::query; using SegmentTree::Groot;
int main(){
Read(n)(m);
int root = Groot(); build(root, 1, n); int ans = INT_MAX;
rep(i, 1, m){
int u, v; Read(u)(v); if(u > v) swap(u, v);
ToL[v].push_back(u); ToR[u].push_back(v); update(root, 1, n, u, v - 1, 1);
}
rep(i, 1, n - 2) {
update(root, 1, n, i + 1, n - 1, -int(ToL[i].size()));
rep(j, 0, ToR[i].size() - 1) update(root, 1, n, i, ToR[i][j] - 1, -1), update(root, 1, n, ToR[i][j], n, 1);
ans = min(ans, query(root, 1, n, i + 1, n - 1));
}
printf("%d", ans);
return 0;
}
D. 四
n个小伙伴(编号从0到n−1)围坐一圈玩游戏。按照顺时针方向给n个位置编号,从0到n−1。最初,第0号小伙伴在第0号位置,第1号小伙伴在第1号位置,…,依此类推。游戏规则如下:
-
有一个序列A={a1,…,am},其中每个数互不相同,且都是[1,n−1]中的正整数。
-
每一轮从A中选择一个数a,第0号位置上的小伙伴顺时针走到第a号位置,第1号位置小伙伴走到第a+1号位置。依此类推,第n−a号位置上的小伙伴走到第0号位置,第n−a+1号位置上的小伙伴走到第1号位置,…,第n−1号位置上的小伙伴顺时针走到第a−1号位置。也就是说,第i号位置上的小伙伴走到第(i+a)mod n号位置
游戏进行t轮。由于每一轮都需要从A中的m个数中选一个数,所以游戏共有mt种玩法。其中有多少种玩法能够使得游戏结束时,第0号小伙伴所在的位置编号是d的倍数?(0也是d的倍数)、
对
109+7取模。
1≤m≤n≤1000,1≤t≤109,1≤d≤n。
设
dp[i]
为进行若干轮之后在位置
i
的方案数。 转移显然是卷积。 包装了循环卷积的定义。
namespace subtask_acceptable_solution{
const int _ = 1500;
struct Matrix{
int dp[_];
Matrix (){ memset(dp, 0, sizeof(dp)); }
Matrix operator * (const Matrix & rhs) {
Matrix Res;
rep(i, 0, n - 1) rep(j, 0, n - 1) Res.dp[(i + j) % n] = (Res.dp[(i + j) % n] +0ll+ dp[i] *1ll* rhs.dp[j] % MOD) % MOD;
return Res;
}
};
Matrix pow(Matrix a, int b){
Matrix ans = a; b--;
while(b){
if(b & 1) ans = ans * a;
a = a * a;
b >>= 1;
}
return ans;
}
void work(){
Matrix a;
rep(i, 1, m) a.dp[A[i]] ++;
Matrix Ans = pow(a, t);
int ans = 0;
for(int i = 0; i < n; i += d) ans = (ans +0ll+ Ans.dp[i]) % MOD;
printf("%d\n", ans);
}
}
int main(){ //freopen("in.txt", "r", stdin);
Read(n)(m)(t)(d); rep(i, 1, m) A[i] = read() % n;
subtask_acceptable_solution::work();
return 0;
}
Round 8
A. 双挂
今年期中考试考了《程序设计》、《算法设计》和《数据结构》共三门课。由于考试太难了,好多同学都挂科了。班里一共n个人,其中a个人挂了《程序设计》,b个人挂了《算法设计》,c个人挂了《数据结构》。
如果一个同学挂了恰好两门课,那么我们就说他“双挂”了。
给出n,a,b,c,问最少有多少同学“双挂”了。
0≤a,b,c≤n,n≤109
设三门课挂科的人对应集合分别为
A,B,C
显然并不是所有人都会挂科目。
∣A∪B∪C∣=∣A∣+∣B∣+∣C∣−∣A∩B∣−∣A∩C∣−∣B∩C∣+∣A∩B∩C∣≤n
移项得
为了方便:设
S=A∩B∩C
(∣A∩B∣−∣S∣)+(∣A∩C∣−∣S∣)+(∣B∩C∣−∣S∣)≥∣A∣+∣B∣+∣C∣+∣S∣−n−3∣S∣
答案取值为
∣A∣+∣B∣+∣C∣−2∣S∣−n,其中
∣S∣
越大 答案越小,其最大取值就是
max{A,B,C}
LL n, a, b, c; Read(n)(a)(b)(c);
printf("%lld", max(0LL, a + b + c - 2 * min(a, min(b, c)) - n));
B. DDL选手
DDL选手总是在最后做作业。
有n个作业,第i个作业的DDL时间是di,做这个作业需要ti的时间。
做作业要一心一意,所以不能同时做两个作业。如果现在开始做第i个作业,那么接下来ti的时间都要做这个作业,不能做别的。
DDL选手总是先做DDL时间早的作业。如果两个作业的DDL时间一样,那么DDL选手会先做其中编号小的
为DDL选手设计每个作业开始做的时间,使得DDL选手先做DDL早的作业(如果两个作业的DDL时间一样,那么先做其中编号小的),而且每个作业都能在DDL时间之前做完(时间是连续的,“之前”的意思是,最晚恰好这个时间完成。)。在保证完成的前提下,尽可能把开始做作业的时间往后推。(也就是如果有多个方案可以做完作业,选择开始时间最晚的方案。可以证明,最优方案中,每一个作业的开始时间都不早于其他方案的开始时间。输出这个最优方案。)
n≤105,ti≤104
依照题意反向模拟。
const int _ = 2e5 + 100;
#define int long long
struct HomeWork_t{
int d, t, id;
}H[_]; int n ;
int Ans[_];
bool CMP(const HomeWork_t & A, const HomeWork_t & B) { return (A.d < B.d) || (A.d == B.d && A.id < B.id); }
#undef int
int main(){
Read(n); rep(i, 1, n) Read(H[i].d)(H[i].t), H[i].id = i;
sort(H + 1, H + 1 + n, CMP);
#define int long long
int Last = LLONG_MAX;
for(int i = n; i >= 1; i--){
if(Last >= H[i].d) {
Last = H[i].d - H[i].t;
Ans[H[i].id] = Last;
} else {
Last = (Last) - H[i].t;
Ans[H[i].id] = Last;
}
}
rep(i, 1, n) printf("%lld\n", Ans[i]);
#undef int
return 0;
}
C. 约数链
如果n个数a1,…,an满足:对于1≤i<n,ai是ai+1的约数,那么a1,…,an被称为一个约数链。一个约数链的权值是它所包含的n个数的乘积。
给出n,m,只允许使用不超过m的正整数组成长为n的约数链,会有非常多的方式。求所有这些方式得到的约数链的权值之和。
n≤10,m≤107
可以 dp 一下,设
dp[n][k]
为长度为
n
的约数链,结尾是
k
的权值和。 转移为刷表。复杂度做到
O(nmlogm)。根本过不去。
设
fn(k)=dp[n][k]
其中 函数
fk(x)
为积性函数。
对于
a⊥b
设
c=a×b
对于
fn(c)
所统计的方案中的每一个数字都可以质因数分解成两组,一组是只属于
a
的质因子,另一组是只属于
b
的质因子。手举几个栗子就能发现符合积性函数的性质。
const int _ = 1e7 + 100;
const int MOD = 1e9 + 7;
int np[_], prime[int(1e6)], tot = 0, Mid[_];
void Init(int n){
Mid[1] = 0; np[1] = 1;
for(int i = 2; i <= n; i++){
if(!np[i]) prime[++tot] = i, Mid[i] = i;
for(int j = 1; j <= tot && prime[j] * i <= n; j++){
int x = prime[j] * i;
np[x] = 1; Mid[x] = prime[j];
if(i % prime[j] == 0) break;
}
}
}
int n, m;
int dp[int(20)][int(30)]; int Ans[_];
long long t = 1;
int main(){ //freopen("in.txt", "r", stdin);
Init(1e7 + 2); Read(n)(m);
rep(S, 1, tot){
int now = prime[S];
memset(dp, 0, sizeof(dp));
t = 1; for(int j = 0; t <= m; j++, t *= now) dp[1][j] = t;
rep(i, 2, n){
t = 1; for(int j = 0; t <= m; j++, t *= now) {
int &ans = dp[i][j] = 0;
rep(k, 0, j) ans = (ans +0ll+ dp[i - 1][k] *1ll* t % MOD) % MOD;
}
}
t = 1; for(int j = 0; t <= m; j++, t *= now) Ans[t] = dp[n][j];
}
Ans[1] = 1;
rep(i, 2, m){
if(Ans[i]) continue;
int A = i, B = 1;
while(A % Mid[i] == 0) A /= Mid[i], B *= Mid[i];
Ans[i] = (Ans[A] *1ll* Ans[B]) % MOD;
}
int ans = 0;
rep(i, 1, m) ans = (ans +0ll+ Ans[i]) % MOD;
printf("%d", ans);
return 0;
}
D. 连通
给出一张无向图,求有多少种方案使得删除三条边,使原图不连通。
n,m≤2000
考虑枚举删除的第一条边是那条,然后问题转化成了
求在一张图中删除两条边使图不连通的方案数。
先删去一条边,考虑剩下的图的形态, -
图已经不连通了,那答案的贡献就是每条边两两配对的方案数 -
图是联通的,考虑对图建一个生成树,考虑删边的方式 - 删除两条非树边
一定不合法,之前的树仍然存在,保证了图的连通性。 -
删除一条树边,一条非树边
被计入答案,当且仅当,这条树边被这条非树边唯一覆盖。这里的正确性显然。 -
删除两条非树边 被计入答案,当且仅当,这两条边被相同的一组非树边覆盖。 -
证明可以考虑,对于原树来说,如果删除两条树边,断成三份,如果两条边被相同的一组非树边覆盖,没有边可以联通断开的中间部分。
-
考虑如何实现,对每一条非树边赋一个随机权值,然后树边的权值定义为覆盖其的每一条非树边的权值异或和。统计删除两条边后图不联通的方案数,就转化为,统计有多少种方案选出两条边,使其权值相同。
树上差分即可,异或有自反性,其标记在 LCA 处自动消失。
const int _ = 4100;
int head[_];
struct edges{
int node;
int nxt;
}edge[_]; int tot = 1;
const int MOD = 1e9 + 7;
int n, m;
int ToEid[_];
int ToNid[_];
int book[_];
u64 tag[int(2100)];
bool vis[int(2100)];
u64 EVal[int(2100)];
void add(int u, int v){
tot++;
edge[tot].node = v;
edge[tot].nxt = head[u];
head[u] = tot;
}
u64 gen(){
u64 A = rand() *1ull* rand() * rand() *1ull* rand();
u64 B = rand() *1ull* rand() * rand() *1ull* rand();
return A + B + rand();
}
void dfs0(int now, int f){
vis[now] = 1;
for(int i = head[now]; i ; i = edge[i].nxt){
int ex = edge[i].node; if(ex == f) continue; if(book[i]) continue;
if(!vis[ex]) dfs0(ex, now);
else {
if( EVal[ToNid[i]]) continue;
u64 g = EVal[ToNid[i]] = gen();
tag[now] ^= g; tag[ex] ^= g;
}
}
}
void dfs1(int now, int f){
u64 &ntag = tag[now];
for(int i = head[now]; i ; i = edge[i].nxt){
int ex = edge[i].node; if(ex == f) continue; if(book[i]) continue;
if(!EVal[ToNid[i]]) dfs1(ex, now), EVal[ToNid[i]] = tag[ex], ntag ^= tag[ex];
}
}
map<u64, int> M;
const int inv6 = 166666668;
int main(){// freopen("in.txt", "r", stdin);
Read(n)(m); int *seed = new int; srand(*seed + n + m);
rep(i, 1, m){
int u, v; Read(u)(v);
ToEid[i] = tot + 1; ToNid[tot + 1] = ToNid[tot + 2] = i;
add(u, v); add(v, u);
}
int Pans = 0;
rep(i, 1, m){
int rs = ToEid[i];
book[rs] = book[rs ^ 1] = 1;
memset(tag, 0, sizeof(tag)); memset(vis, 0, sizeof(vis)); memset(EVal, 0, sizeof(EVal)); M.clear();
dfs0(1, 1);
bool pass = true;
rep(j, 1, n) if(!vis[j]) { pass = false; break; }
if(!pass) { int t = m - 1; Pans = (Pans +0ll+ (t * (t - 1))) % MOD; book[rs] = book[rs ^ 1] = 0; continue; }
dfs1(1, 1);
rep(j, 1, m) if(i != j) M[EVal[j]] ++;
int ans = 0;
for(map<u64, int> :: iterator i = M.begin(); i != M.end(); i++){
if(i->first == 0ull)
ans = (ans +0ll+ (i->second *1ll* (i->second - 1)) % MOD) % MOD,
ans = (ans +0ll+ (((m - 1) - (i->second)) *2ll* (i->second)) % MOD) % MOD;
else
ans = (ans +0ll+ (i->second *1ll* (i->second - 1)) % MOD) % MOD;
}
Pans = (ans +0ll+ Pans) % MOD;
book[rs] = book[rs ^ 1] = 0;
}
printf("%d", int(Pans *1ll* inv6 % MOD));
return 0;
}
Round 9
降智场。 ### A. 最大公约数
给出一个长度为
n
的序列。 设
k=maxi<jgcd(Ai,Aj),
求出: -
k
-
i<j∑[gcd(Ai,Aj)=k]
-
i<j∑[gcd(Ai,Aj)=k]Ai×Aj
枚举一下
gcd
可能以这个数字为
gcd
的两个数字一定是
gcd
的倍数。 从大到小枚举
gcd
查询有多少倍数,如果大于
2
,这个
gcd
就可以。 剩余的两项在得到
k
的基础上判断即可。
const int MOD = 998244353;
const int _ = 2e6 + 100;
const int inv2 = 499122177;
int book[_];
int A[_], n, MAX = 0;
int K = 0;
int main(){
Read(n); rep(i, 1, n) Read(A[i]), book[A[i]]++, MAX = max(MAX, A[i]);
for(int i = MAX; i >= 1; i--){
int cnt = 0;
for(int j = i; j <= MAX; j += i) cnt += book[j];
if(cnt >= 2) { K = i; break; }
}
int SUM = 0, ans1 = 0, ans2 = 0;
for(int i = K; i <= MAX; i += K){
if(!book[i]) continue;
ans1 += book[i]; SUM = (SUM +0ll+ book[i] *1ll* i % MOD) % MOD;
}
ans1 = ((ans1 *1ll* (ans1 - 1)) % MOD *1ll* inv2) % MOD;
for(int i = K; i <= MAX; i += K){
if(!book[i]) continue;
ans2 = (ans2 +0ll+ ( (SUM -0ll- i + MOD) % MOD *1ll* i % MOD *1ll* book[i]) % MOD ) % MOD;
}
printf("%d %d %d\n", K, ans1, ans2 *1ll* inv2 % MOD);
return 0;
}
B. 紧急出口
在一个走廊里共有
N
个楼梯,其中
N
个楼梯之间有
N−1
个间隔, 个间隔会贴有一个紧急出口的指示牌指向左侧或者右侧。
问在所有的
2N−1
种指示牌的贴法当中,有多少种贴法满足恰好有
M
个楼梯(包括最左最右)的左右侧的紧急出口标识都不指向自己。
输出的答案对
998244353
取模。
N≤103,M≤109
倍增DP
待填
隔板法
称 “左右侧的紧急出口标识都不指向自己的点” 为关键点。
考虑如果选定了一个点是关键点,那么他们两边就形如
< o >
,可以发现相邻的两个关键点
O1,O2
之间贴牌的方案一定形如
...<O1>o>...>o<...<o<O2>...
显然,其实是把原序列分成连续的
2m
段,每段内方向相同,相邻两段方向相反。 隔板即可。
考虑组合数的通项公式,项数只有
m
项。
int n, m; Read(n)(m); printf("%d", C(n, 2 * m - 1));
C. 合影
众所周知, ACM ICPC 是三人组队参赛的比赛。现在在 ICPC WF2020 现场,有
k
支参赛队伍要站成一排拍照!
摄影师小Z想促进队伍间的交流,于是小Z要求每个队伍的3个队员不能都挨在一起
现在小Z想问一问你,这
k
支队伍有多少种拍照方式呢?由于数字很大,所以对
998244353
取模就好~
k≤106
要求是每一队的三个队员不能全部挨在一起。
无法直接全部满足,考虑容斥。
假如所有人按任意顺序排列有
(3k)!
种排列方式。
显然会算入了不合法的情况,考虑去除这些
钦定哪一队全部挨在一起了,如果强制某一队挨在一起可以吧那一队捆成一个人
这样的方案数为
(3k−2)!,算入答案就是
(1k)(3k−2)!(3!)1
最后一个是因为同一队中的队员也有顺序。
显然会去除多了,如果有多队同时不合法,这些方案会被去除多次,钦定哪两队全部挨在一起了,算入答案就是
(2k)(3k−4)!(3!)2。
显然加多了……
然后就是容斥原理了。
答案应该是
i=0∑k(−1)i(ik)(3k−2i)!(3!)i
int C(int n, int m){ return frac[n] *1ll* ifrac[n - m] % MOD *1ll* ifrac[m] % MOD; }
int main(){
int k; Read(k); Init((k + 1) * 3);
int ans = 0;
rep(i, 0, k){
int tans = 0;
tans = C(k, i) *1ll* frac[3 * k - 2 * i] % MOD *1ll* pow(6, i, MOD) % MOD;
tans = (i & 1) ? MOD - tans : tans;
ans = (ans +0ll+ tans) % MOD;
}
printf("%d", ans);
return 0;
}
D. 路径
给定一个n个顶点的无根树,顶点编号
1 n。
同时给定树上的
k
条带权路径,要求支持以下操作:
1 k
,删除第
k
条带权路径。
2 k v
,将第
k
条带权路径的权值修改为
v
。
3 p
,给定一个树上节点
p
,询问所有没有被删去的带权路径中,不与该节点相交的所有路径中的最小权值。
n,k,q≤105
做法一:树剖 +
std::set
维护标记 标记永久化线段树
O((k+q)log23n)
先树剖,路径补集仍然是线段树上
log2(n)
段,可以在这些段里面加入可选的边,为了防止删除重复,std::set
内层数据类型为 pair<int, int>
分别存储路径的权值和编号。然后就直接做就好了。 后记:被出题人卡成了
30
……。
#define rep(i, l, r) for(int i = l, __ = r; i <= __; i++)
using namespace std;
int n, k, p;
const int _ = 2e6 + 100;
int head[_];
struct edges{
int node;
int nxt;
}edge[_]; int tot = 0;
void add(int u, int v) {
tot++;
edge[tot].node = v;
edge[tot].nxt = head[u];
head[u] = tot;
}
struct Path{ int u, v, Val; Path(int a, int b, int c) { u = a; v = b; Val = c; } Path(){} } P[_];
int dfn[_], rnk[_], dfc, dep[_], top[_], fa[_], si[_], son[_];
void dfs0(int now, int f, int dp){
fa[now] = f; dep[now] = dp; int &Mid = son[now] = 0; int &Si = si[now] = 1;
for(int i = head[now]; i ; i = edge[i].nxt){
int ex = edge[i].node; if(ex == f) continue;
dfs0(ex, now, dp + 1); Si += si[ex]; if(si[ex] > si[Mid]) Mid = ex;
}
}
void dfs1(int now, int f, int tp){
dfn[now] = ++dfc; top[now] = tp;
if(son[now]) dfs1(son[now], now, tp);
for(int i = head[now]; i ; i = edge[i].nxt){
int ex = edge[i].node; if(ex == f || ex == son[now]) continue;
dfs1(ex, now, ex);
}
}
namespace SegmentTree{
const int _ = 3e6 + 100;
int ch[_][2]; set<pair<int ,int>, less <pair<int ,int> > > v[_];
int tot = 0;
#define ls(o) (ch[o][0])
#define rs(o) (ch[o][1])
#define make (tot++, ch[tot][0] = ch[tot][1] = 0, v[tot].clear(), tot)
int Groot(){ return make; }
void build(int o, int L, int R){
if(L == R) return (void)v[o].insert(make_pair(INT_MAX, -1));
int mid = (L + R) >> 1;
ls(o) = make; rs(o) = make; v[o].insert(make_pair(INT_MAX, -1));
build(ls(o), L, mid); build(rs(o), mid + 1, R);
}
void update_add(int o, int nowl, int nowr, int L, int R, int V, int id){
if(L > R) return ;
if(L <= nowl && nowr <= R) return (void)v[o].insert(make_pair(V, id));
int mid = (nowl + nowr) >> 1;
if(L <= mid) update_add(ls(o), nowl, mid, L, R, V, id);
if(R > mid) update_add(rs(o), mid + 1, nowr, L, R, V, id);
}
void update_del(int o, int nowl, int nowr, int L, int R, int V, int id){
if(L > R) return ;
if(L <= nowl && nowr <= R) return (void)v[o].erase(make_pair(V, id));
int mid = (nowl + nowr) >> 1;
if(L <= mid) update_del(ls(o), nowl, mid, L, R, V, id);
if(R > mid) update_del(rs(o), mid + 1, nowr, L, R, V, id);
}
pair<int, int > query(int o, int nowl, int nowr, int p, pair<int, int > ans = make_pair(INT_MAX, -1)){
if(nowl == nowr) return min(ans, *(v[o].begin()));
int mid = (nowl + nowr) >> 1; ans = min(ans, *(v[o].begin()));
return p <= mid ? query(ls(o), nowl, mid, p, ans) : query(rs(o), mid + 1, nowr, p, ans);
}
} using SegmentTree::query; using SegmentTree::update_add; using SegmentTree::Groot;
using SegmentTree::build; using SegmentTree::update_del;
#define fi first
#define se second
vector<pair<int, int > > TMP;
int root = 0;
void AddWithoutPath(int u, int v, int Val, int id){
TMP.clear();
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u, v);
TMP.push_back(make_pair(dfn[top[u]], dfn[u])); u = fa[top[u]];
}
if(dep[u] < dep[v]) swap(u, v);
TMP.push_back(make_pair(dfn[v], dfn[u]));
sort(TMP.begin(), TMP.end());
rep(i, 0, TMP.size() - 2) update_add(root, 1, n, TMP[i].se + 1, TMP[i + 1].fi - 1, Val, id);
update_add(root, 1, n, 1, TMP[0].fi - 1, Val, id);
update_add(root, 1, n, TMP[TMP.size() - 1].se + 1, n, Val, id);
}
void DelWithoutPath(int u, int v, int Val, int id){
TMP.clear();
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u, v);
TMP.push_back(make_pair(dfn[top[u]], dfn[u])); u = fa[top[u]];
}
if(dep[u] < dep[v]) swap(u, v);
TMP.push_back(make_pair(dfn[v], dfn[u]));
sort(TMP.begin(), TMP.end());
rep(i, 0, TMP.size() - 2) update_del(root, 1, n, TMP[i].se + 1, TMP[i + 1].fi - 1, Val, id);
update_del(root, 1, n, 1, TMP[0].fi - 1, Val, id);
update_del(root, 1, n, TMP[TMP.size() - 1].se + 1, n, Val, id);
}
int main(){ // freopen("in.txt", "r", stdin);
Read(n)(k)(p);
rep(i, 1, n - 1){
int u, v; Read(u)(v);
add(u, v); add(v, u);
}
rep(i, 1, k) {
int p, q, v; Read(p)(q)(v);
P[i] = Path(p, q, v);
}
dfs0(1, 1, 1); dfs1(1, 1, 1);
root = Groot(); build(root, 1, n);
rep(i, 1, k) AddWithoutPath(P[i].u, P[i].v, P[i].Val, i);
while(p--){
int opt, k; Read(opt)(k);
if(opt == 1){
DelWithoutPath(P[k].u, P[k].v, P[k].Val, k);
} else if(opt == 2){
DelWithoutPath(P[k].u, P[k].v, P[k].Val, k);
Read(P[k].Val);
AddWithoutPath(P[k].u, P[k].v, P[k].Val, k);
} else {
pair<int, int > r = query(root, 1, n, dfn[k]);
printf("%d\n", r.first < INT_MAX ? r.first : -1);
}
}
return 0;
}
做法二:线段树维护路径交集
+ 二分最小值
巧妙绝伦的做法。
要求回答的是:不与节点
p
相交的所有路径中的最小权值。
考虑二分一个最小权值
x,然后判断是所有权值小于
x
的路径是不是全都和点
p
有交。
如果把所有路径按照权值排序,那么成为答案的那条路径之前的路径一定都和点
p
有交,这就可以直接二分答案了。
但是路径需要支持删除和修改。 显然需要数据结构。
一个显然的事实是:两条路径的交
也是一条路径(定义一个点或者空都属于路径)。
线段树就可以快速求出一段路径区间内所有路径的交集路径。
所有路径按照权值排好序后的一个前缀全部和点
p
有交,等价于,这个前缀所有的路径的交集和点
p
有交。
对于删除操作,可以考虑在线段树对应操作上打删除标记。对于修改操作,因为没有强制在线,可以考虑一开始把这条路径的所有权值排好序后加入线段树,然后对于当前无用的版本,打上删除标记即可。对于一次修改,转化成一次删除和一次恢复操作。
当然平衡树可以轻易完成这样的工作,在平衡树上维护树上路径交集,写不出来啊…
这样就可以直接用线段树求出某个前缀的所有路径的交集路径了。线段树合并信息时,需要询问
LCA
,算上二分,这样的单次询问复杂度可以做到
O(logklogwlogn)(倍增
LCA
),或者
O(logklogw)(O(n)−O(1)
LCA
)。
注意到线段树本身就是一个分治的结构,可以直接在线段树上二分,这样就可以做到
O(logklogn)(倍增
LCA
),或者
O(logk)(O(n)−O(1)
LCA
)。
我的实现是 倍增 LCA
+
线段树二分,算上预处理,总时间复杂度为
O(nlog(n)+qlog(q+k)logn)
const int _ = 2e5 + 100;
int head[_], tot = 0;
struct edges{
int node;
int nxt;
}edge[_];
void add(int u, int v){
tot++;
edge[tot].node = v;
edge[tot].nxt = head[u];
head[u] = tot;
}
int n, k, q;
const int LOG = 18;
int fa[_][LOG + 2], dep[_];
void dfs0(int now, int f, int dp){
fa[now][0] = f; dep[now] = dp;
for(int i = head[now]; i ; i = edge[i].nxt){
int ex = edge[i].node; if(ex == f) continue;
dfs0(ex, now, dp + 1);
}
}
map < pair<int, int> , int > Mem;
int LCA(int u, int v){
pair<int, int> P = make_pair(min(u, v), max(u, v));
if(Mem.count(P)) return Mem[P];
if(dep[u] < dep[v]) swap(u, v);
int d = dep[u] - dep[v];
int x = u, y = v;
rep(i, 0, LOG) if(d & (1 << i)) x = fa[x][i];
if(x == y) return x;
for(int i = LOG; i >= 0; i--){
if(fa[x][i] == fa[y][i]) continue;
x = fa[x][i]; y = fa[y][i];
}
return Mem[P] = fa[x][0];
}
void InitQuery(){
dfs0(1, 1, 1);
rep(j, 1, LOG) rep(i, 1, n) fa[i][j] = fa[fa[i][j - 1]][j - 1];
}
struct Path_t{
int id, u, v, w, ver;
Path_t(int a, int b, int c, int d, int e) { id = a; u = b; v = c; w = d; ver = e; }
Path_t() { }
};
bool CMP(const Path_t & A, const Path_t & B) { return A.w < B.w; }
struct Q_t{
int type, a, b;
Q_t(int x, int y, int z) { type = x; a = y; b = z; }
Q_t() {}
}Q[_];
int nowv[_];
vector<Path_t> P;
vector<int> Pv[_];
int dis(int u, int v) { return dep[u] + dep[v] - (dep[LCA(u, v)] << 1); }
pair<int, int> cross(int u0, int v0, int u1, int v1) {
int t0 = LCA(u0, v0);
int t1 = LCA(u0, u1);
int t2 = LCA(u0, v1);
int t3 = LCA(v0, u1);
int t4 = LCA(v0, v1);
int target0 = t0; // t0 t1 t3
if(dep[target0] < dep[t1]) target0 = t1;
if(dep[target0] < dep[t3]) target0 = t3;
int target1 = t0; // t0 t2 t4
if(dep[target1] < dep[t2]) target1 = t2;
if(dep[target1] < dep[t4]) target1 = t4;
if(target1 == target0 && dis(target1, u1) + dis(target1, v1) != dis(u1, v1)) return make_pair(-1, -1);
else return make_pair(target0, target1);
}
bool crossx(int u, int v, int x) { if(u == -1 || v == -1) return false; return dis(u, v) == dis(u, x) + dis(v, x); }
namespace SegmentTree{ // To maintain the merge path
struct Node_t{
int u, v;
bool isDel, isNul;
void clear(){
isDel = false; isNul = true; u = v = 0;
}
};
const int _ = 1e6 + 100;
int ch[_][2], tot = 0; Node_t v[_];
#define ls(o) (ch[o][0])
#define rs(o) (ch[o][1])
#define make (tot++, ch[tot][0] = ch[tot][1] = 0, v[tot].clear(), tot)
int Groot() { return make; }
void maintain(int o) {
v[o].isDel = (v[ls(o)].isDel && v[rs(o)].isDel);
v[o].isNul = (v[ls(o)].isNul || v[rs(o)].isNul);
if(!v[o].isDel && !v[o].isNul){
if(v[ls(o)].isDel && !v[rs(o)].isDel) v[o].u = v[rs(o)].u, v[o].v = v[rs(o)].v;
else if(v[rs(o)].isDel && !v[ls(o)].isDel) v[o].u = v[ls(o)].u, v[o].v = v[ls(o)].v;
else {
pair<int, int> R = cross(v[ls(o)].u, v[ls(o)].v, v[rs(o)].u, v[rs(o)].v);
if(R.first == -1) {
v[o].isNul = true;
}
v[o].u = R.first; v[o].v = R.second;
}
}
}
void build(int o, int L, int R){
if(L == R) {
v[o].isNul = false;
v[o].isDel = (P[L - 1].ver != 1);
v[o].u = P[L - 1].u;
v[o].v = P[L - 1].v;
return ;
} ls(o) = make; rs(o) = make;
int mid = (L + R) >> 1;
build(ls(o), L, mid); build(rs(o), mid + 1, R);
maintain(o);
}
void update(int o, int nowl, int nowr, int p, bool V){
if(nowl == nowr) return (void)(v[o].isDel = V);
int mid = (nowl + nowr) >> 1;
if(p <= mid) update(ls(o), nowl, mid, p, V);
if(p > mid) update(rs(o), mid + 1, nowr, p, V);
maintain(o);
}
int query(int o, int nowl, int nowr, int x){
if(!v[o].isNul && !v[o].isDel && crossx(v[o].u, v[o].v, x)) return -1;
if(nowl == nowr) return P[nowl - 1].w;
bool r0 = !(v[ls(o)].isNul || !crossx(v[ls(o)].u, v[ls(o)].v, x)) || v[ls(o)].isDel;
bool r1 = !(v[rs(o)].isNul || !crossx(v[rs(o)].u, v[rs(o)].v, x)) || v[rs(o)].isDel;
int mid = (nowl + nowr) >> 1;
if(!r0) return query(ls(o), nowl, mid, x); else if(!r1) return query(rs(o), mid + 1, nowr, x); else return -1;
}
} using SegmentTree::build; using SegmentTree::Groot;
using SegmentTree::query; using SegmentTree::update;
int main() { freopen("in.txt", "r", stdin);
Read(n)(k)(q); rep(i, 1, n - 1) { int u, v; Read(u)(v); add(u, v); add(v, u); } InitQuery();
rep(i, 1, k){
int u, v, w; Read(u)(v)(w);
P.push_back(Path_t(i, u, v, w, 1)); nowv[i] = 1;
}
rep(i, 1, q){
int type, a, b; Read(type)(a);
if(type == 2) Read(b), Q[i] = Q_t(type, a, b);
else Q[i] = Q_t(type, a, 0);
}
rep(i, 1, q){
Q_t &now = Q[i];
if(now.type == 2) P.push_back(Path_t(now.a, P[now.a - 1].u, P[now.a - 1].v, now.b, ++nowv[now.a]));
}
rep(i, 1, k) Pv[i].resize(nowv[i] + 2);
sort(P.begin(), P.end(), CMP);
rep(i, 0, P.size() - 1) Pv[P[i].id][P[i].ver] = i + 1;
int root = Groot(), U; U = P.size(); build(root, 1, U);
rep(i, 1, k) nowv[i] = 1;
rep(i, 1, q){
Q_t &now = Q[i];
if(now.type == 1){
int Pl = Pv[now.a][nowv[now.a]];
update(root, 1, U, Pl, 1);
} else if(now.type == 2){
int Pl0 = Pv[now.a][ nowv[now.a]];
int Pl1 = Pv[now.a][++nowv[now.a]];
update(root, 1, U, Pl0, 1);
update(root, 1, U, Pl1, 0);
} else {
printf("%d\n", query(root, 1, U, now.a));
}
}
return 0;
}
做法三:CDQ 分治
学了再说。
QAQ /kel
🔗 Source Hash:
122bdbf2c96c059dc61391e3b3045b878f7deaecb376950bc53a8ef1eadc229d
Build Logs
Build Log - Filtered
================================================
📋 Information:
• Path information has been filtered for privacy protection
• File names are preserved for debugging purposes
• All build status and error messages are kept intact
🔍 Filter Rules:
• /absolute/path/file.ext → .../file.ext
• /home/username → .../[user]
• /tmp/files → .../[temp]
• /usr/share/packages → .../[system]
================================================
html log:
CMD: ['pandoc', '-s', 'cache/oi-blog_「学习总结」清北学堂-十连测.md', '--filter', 'pandoc-crossref', '--filter', 'pandoc-katex', '--template=cache/pandoc_html_template.html', '-o', 'cache.../oi-blog_「学习总结」清北学堂-十连测.md.html', '--metadata', '--verbose', '--highlight-style=tango']
STDOUT:
STDERR: WARNING: pandoc-crossref was compiled with pandoc 3.6.2 but is being run through 3.6.4. This is not supported. Strange things may (and likely will) happen silently.
====================================================================================================
pdf log:
CMD: ['pandoc', '-s', 'cache.../379bd1829a.pdf.md', '-o', 'cache/379bd1829a.pdf', '-H', 'static/pandoc.header.tex', '--pdf-engine=xelatex', '--verbose']
STDOUT:
STDERR: [INFO] Loaded static.../pandoc.header.tex from static.../pandoc.header.tex
[WARNING] Could not fetch resource /post_images/qbxt_Round0_C.png: /post_images/qbxt_Round0_C.png: withBinaryFile: does not exist (No such file or directory)
Replacing image with description.
[INFO] Not rendering RawInline (Format "html") ""
[INFO] Not rendering RawInline (Format "html") ""
[INFO] Not rendering RawInline (Format "html") ""
[INFO] Not rendering RawInline (Format "html") ""
[INFO] Not rendering RawInline (Format "html") ""
[INFO] Not rendering RawInline (Format "html") ""
[INFO] Not rendering RawInline (Format "html") ""
[INFO] [makePDF] Temp dir:
.../[temp]
[INFO] [makePDF] Command line:
xelatex "-halt-on-error" "-interaction" "nonstopmode" "-output-directory" ".../[temp] ".../[temp]
[INFO] [makePDF] Relevant environment variables:
("TEXINPUTS",".../[temp]
("TEXMFOUTPUT",".../[temp]
("SHELL","/bin/bash")
("PWD",".../[user]/projects/blog")
("HOME",".../[user]
("LANG","zh_CN.UTF-8")
("PATH",".../[user]/.local/bin:.../[user]/.cargo/bin:.../[user]/miniconda3/envs/myblog/bin:.../[user]/miniconda3/condabin:.../[temp]
[INFO] [makePDF] Source:
% Options for packages loaded elsewhere
\PassOptionsToPackage{unicode}{hyperref}
\PassOptionsToPackage{hyphens}{url}
\PassOptionsToPackage{space}{xeCJK}
\documentclass[
]{article}
\usepackage{xcolor}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage{amsmath,amssymb}
\setcounter{secnumdepth}{-\maxdimen} % remove section numbering
\usepackage{iftex}
\ifPDFTeX
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp} % provide euro and other symbols
\else % if luatex or xetex
\usepackage{unicode-math} % this also loads fontspec
\defaultfontfeatures{Scale=MatchLowercase}
\defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1}
\fi
\usepackage{lmodern}
\ifPDFTeX\else
% xetex/luatex font selection
\setmainfont[]{Latin Modern Roman}
\ifXeTeX
\usepackage{xeCJK}
\setCJKmainfont[]{AR PL UKai CN}
\fi
\ifLuaTeX
\usepackage[]{luatexja-fontspec}
\setmainjfont[]{AR PL UKai CN}
\fi
\fi
% Use upquote if available, for straight quotes in verbatim environments
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\IfFileExists{microtype.sty}{% use microtype if available
\usepackage[]{microtype}
\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
}{}
\usepackage{setspace}
\makeatletter
\@ifundefined{KOMAClassName}{% if non-KOMA class
\IfFileExists{parskip.sty}{%
\usepackage{parskip}
}{% else
\setlength{\parindent}{0pt}
\setlength{\parskip}{6pt plus 2pt minus 1pt}}
}{% if KOMA class
\KOMAoptions{parskip=half}}
\makeatother
\usepackage{color}
\usepackage{fancyvrb}
\newcommand{\VerbBar}{|}
\newcommand{\VERB}{\Verb[commandchars=\\\{\}]}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
% Add ',fontsize=\small' for more characters per line
\newenvironment{Shaded}{}{}
\newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
\newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{#1}}
\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\BuiltInTok}[1]{\textcolor[rgb]{0.00,0.50,0.00}{#1}}
\newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{#1}}}
\newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{#1}}
\newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{#1}}
\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{#1}}}
\newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
\newcommand{\ExtensionTok}[1]{#1}
\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{#1}}
\newcommand{\ImportTok}[1]{\textcolor[rgb]{0.00,0.50,0.00}{\textbf{#1}}}
\newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
\newcommand{\NormalTok}[1]{#1}
\newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}}
\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{#1}}
\newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{#1}}
\newcommand{\RegionMarkerTok}[1]{#1}
\newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{#1}}
\newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{#1}}
\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\setlength{\emergencystretch}{3em} % prevent overfull lines
\providecommand{\tightlist}{%
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
% \usepackage{xeCJK}
% \setCJKmainfont{AR PL UKai CN}
% \usepackage{unicode-math}
\setmathfont{Latin Modern Math}
\usepackage{bookmark}
\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available
\urlstyle{same}
\hypersetup{
pdftitle={「学习总结」清北学堂 十连测},
pdfauthor={Jiayi Su (ShuYuMo)},
hidelinks,
pdfcreator={LaTeX via pandoc}}
\title{「学习总结」清北学堂 十连测}
\author{Jiayi Su (ShuYuMo)}
\date{2020-12-01 09:16:52}
\begin{document}
\maketitle
\setstretch{1.3}
济南 清北学堂,NOIP考前十连测,题目整理。 \# 清北学堂 10 连测
\subsection{Round 1}\label{round-1}
\subsubsection{A. yist}\label{a.-yist}
给出 \(n\) 求 \(n! \operatorname{mod} 2^{32}\)。
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ A}\OperatorTok{[}\DecValTok{0}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,} \DecValTok{50}\OperatorTok{)}\NormalTok{ A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]} \OperatorTok{*}\NormalTok{ i}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ T }\OperatorTok{=}\NormalTok{ read}\OperatorTok{();}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{T}\OperatorTok{{-}{-})\{}
\DataTypeTok{int}\NormalTok{ x }\OperatorTok{=}\NormalTok{ read}\OperatorTok{();}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{x }\OperatorTok{\textless{}=} \DecValTok{50}\OperatorTok{)}\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%llu\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ A}\OperatorTok{[}\NormalTok{x}\OperatorTok{]);}
\ControlFlowTok{else}\NormalTok{ puts}\OperatorTok{(}\StringTok{"0"}\OperatorTok{);}
\OperatorTok{\}}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{B. ernd}\label{b.-ernd}
有一个 \(n\times m\) 的网格,网格上的数字都在 \([1,nm]\)
之间且两两不同。
有个限制,直观描述是位置左、上的格子必须比右、下的格子小,精确地说:\(A_{i,j} < A_{i+1,j},A_{i,j} < A_{i,j+1}\)
必须成立,如果不等式中的两个位置都在网格内的话。
你想知道对于一个 \(k\),有多少个格子的值可以是
\(k\)(即存在一种网格,使得它的值是 \(k\))。
考虑每个位置 \((i, j)\) 能填哪些数字,这个位置到 \((1, 1)\)
形成的矩形中的值都要大于 \((i, j)\) 的值,这个位置到 \(n, m\) 同理。
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{int}\NormalTok{ ans}\OperatorTok{[}\NormalTok{\_T}\OperatorTok{],}\NormalTok{ C}\OperatorTok{[}\NormalTok{\_T}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ work}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ m}\OperatorTok{)\{}
\NormalTok{ memset}\OperatorTok{(}\NormalTok{C}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{C}\OperatorTok{));}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ m}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ L }\OperatorTok{=}\NormalTok{ i }\OperatorTok{*}\NormalTok{ j}\OperatorTok{,}\NormalTok{ R }\OperatorTok{=}\NormalTok{ n }\OperatorTok{*}\NormalTok{ m }\OperatorTok{{-}} \OperatorTok{((}\NormalTok{n }\OperatorTok{{-}}\NormalTok{ i }\OperatorTok{+} \DecValTok{1}\OperatorTok{)} \OperatorTok{*} \OperatorTok{(}\NormalTok{m }\OperatorTok{{-}}\NormalTok{ j }\OperatorTok{+} \DecValTok{1}\OperatorTok{)} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{);}
\NormalTok{ C}\OperatorTok{[}\NormalTok{L}\OperatorTok{]++;}\NormalTok{ C}\OperatorTok{[}\NormalTok{R }\OperatorTok{+} \DecValTok{1}\OperatorTok{]{-}{-};}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ now }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n }\OperatorTok{*}\NormalTok{ m}\OperatorTok{)}\NormalTok{ now }\OperatorTok{+=}\NormalTok{ C}\OperatorTok{[}\NormalTok{i}\OperatorTok{],}\NormalTok{ ans}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ now}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ q }\OperatorTok{=}\NormalTok{ read}\OperatorTok{();}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{q}\OperatorTok{{-}{-})}\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{[}\NormalTok{read}\OperatorTok{()]);}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{C. sanrd}\label{c.-sanrd}
小Y有一个排列 \(P_{1..n}\),作为强迫症患者,她想要把排列排好序。共有 3
种操作。
花费 \(a\) 的代价交换相邻两个数。
花费 \(b\) 的代价翻转整个排列。
花费 \(c\) 的代价打乱整个排列,新排列随机生成。
小Y需要知道,在最优策略下,她需要花费多大的代价呢?
最优的操作,显然是先打乱排列(如果有),再翻转排列(如果有),最后交换相邻两个数(如果有)。
\paragraph{几个事实}\label{ux51e0ux4e2aux4e8bux5b9e}
\begin{itemize}
\tightlist
\item
\(A_i > A_j, i + 1 = j\) 是交换相邻两个数字的必要条件。
\item
执行一次交换操作逆序对数量会减少且仅减少一。
\item
答案只与逆序对数量有关。
\item
打乱后随机生成的代价就是 \(c\) + 长度为 \(n\)
的所有排列排好代价的平均值。只要使用最后一种操作,那么他们的答案一定相同。
\end{itemize}
设排列 \([P]\) 的逆序对数为 \(x\) ,如果只使用前两种操作, 代价就是
\(\operatorname{min}\{\left(\frac{n(n - 1)}{2} - x\right) \times a + b, x \times a\}\)。
把 \([p]\)
的所有排列按照只用前两种操作的花费排好序,那么可能使用最后一种操作的一定是一段后缀。
以 \([p]\) 的所有排列按照只用前两种操作的花费排好序的下标为 \(x\)
轴,代价为 \(y\) 轴,那么只用前两种操作就是绿色的图像。
如果对某些排列使用第三种操作,可以用橙色的图像表示。 {Round0\_C.png}
其中被函数值压平的部分就是 \(c\) + 所有排列代价的平均值。
枚举是多长的后缀被压平(使用第三种操作)。然后解方程解出函数值平均值,选取最小的平均值即可。
如果排列数比较多,无法一个一个的算出来,可以通过 dp 求出长度为 \(n\)
的排列,逆序对个数为 \(k\)
的排列数。可以注意到,逆序对数相同的排列,答案一定是一样的,可以把逆序对是相同的排列捆绑计算,逆序对数一共有
\(\frac{n \times (n - 1)}{2} + 1\) 种取值。
\begin{Shaded}
\begin{Highlighting}[]
\PreprocessorTok{\#include }\ImportTok{\textless{}cstdio\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}cstring\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}cmath\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}iostream\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}cmath\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}algorithm\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}climits\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}assert.h\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}vector\textgreater{}}
\PreprocessorTok{\#define LL }\DataTypeTok{long}\PreprocessorTok{ }\DataTypeTok{long}\PreprocessorTok{ }
\PreprocessorTok{\#define int }\DataTypeTok{long}\PreprocessorTok{ }\DataTypeTok{long}\PreprocessorTok{ }
\PreprocessorTok{\#define rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{l}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{r}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{l}\OperatorTok{),}\PreprocessorTok{ }\NormalTok{\_\_\_}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{r}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{\textless{}=}\PreprocessorTok{ }\NormalTok{\_\_\_}\OperatorTok{;}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{++)}
\PreprocessorTok{\#define per}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{l}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{r}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{r}\OperatorTok{),}\PreprocessorTok{ }\NormalTok{\_\_\_}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{l}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{\textgreater{}=}\PreprocessorTok{ }\NormalTok{\_\_\_}\OperatorTok{;}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{{-}{-})}
\KeywordTok{using} \KeywordTok{namespace}\NormalTok{ std}\OperatorTok{;}
\KeywordTok{struct} \DataTypeTok{Read\_t}\OperatorTok{\{}
\KeywordTok{template}\OperatorTok{\textless{}}\KeywordTok{typename}\NormalTok{ T}\OperatorTok{\textgreater{}} \AttributeTok{const} \DataTypeTok{Read\_t} \OperatorTok{\&} \KeywordTok{operator}\OperatorTok{()} \OperatorTok{(}\NormalTok{ T }\OperatorTok{\&}\NormalTok{ target }\OperatorTok{)} \AttributeTok{const} \OperatorTok{\{}
\NormalTok{ T x }\OperatorTok{=} \DecValTok{0}\OperatorTok{;} \DataTypeTok{int}\NormalTok{ sign }\OperatorTok{=} \DecValTok{1}\OperatorTok{;} \DataTypeTok{char}\NormalTok{ c }\OperatorTok{=}\NormalTok{ getchar}\OperatorTok{();}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{c }\OperatorTok{\textless{}} \CharTok{\textquotesingle{}0\textquotesingle{}} \OperatorTok{||}\NormalTok{ c }\OperatorTok{\textgreater{}} \CharTok{\textquotesingle{}9\textquotesingle{}}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{c }\OperatorTok{==} \CharTok{\textquotesingle{}{-}\textquotesingle{}}\OperatorTok{)}\NormalTok{ sign }\OperatorTok{=} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{;}\NormalTok{ c }\OperatorTok{=}\NormalTok{ getchar}\OperatorTok{();} \OperatorTok{\}}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{c }\OperatorTok{\textless{}=} \CharTok{\textquotesingle{}9\textquotesingle{}} \OperatorTok{\&\&}\NormalTok{ c }\OperatorTok{\textgreater{}=} \CharTok{\textquotesingle{}0\textquotesingle{}}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ x }\OperatorTok{=} \OperatorTok{(}\NormalTok{x }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{)} \OperatorTok{+} \OperatorTok{(}\NormalTok{x }\OperatorTok{\textless{}\textless{}} \DecValTok{3}\OperatorTok{);}\NormalTok{ x }\OperatorTok{+=}\NormalTok{ c }\OperatorTok{{-}} \CharTok{\textquotesingle{}0\textquotesingle{}}\OperatorTok{;}\NormalTok{ c }\OperatorTok{=}\NormalTok{ getchar}\OperatorTok{();} \OperatorTok{\}}
\NormalTok{ target }\OperatorTok{=}\NormalTok{ x }\OperatorTok{*}\NormalTok{ sign}\OperatorTok{;} \ControlFlowTok{return} \OperatorTok{*}\KeywordTok{this}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}\NormalTok{ Read}\OperatorTok{;}
\PreprocessorTok{\#warning dont forget enable int\_64}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_N }\OperatorTok{=} \DecValTok{500}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_S }\OperatorTok{=} \DecValTok{500}\OperatorTok{;}
\NormalTok{LL gcd}\OperatorTok{(}\NormalTok{LL a}\OperatorTok{,}\NormalTok{ LL b}\OperatorTok{)\{} \ControlFlowTok{return}\NormalTok{ b }\OperatorTok{==} \DecValTok{0} \OperatorTok{?}\NormalTok{ a }\OperatorTok{:}\NormalTok{ gcd}\OperatorTok{(}\NormalTok{b}\OperatorTok{,}\NormalTok{ a }\OperatorTok{\%}\NormalTok{ b}\OperatorTok{);} \OperatorTok{\}}
\NormalTok{LL dp}\OperatorTok{[}\NormalTok{\_N}\OperatorTok{][}\NormalTok{\_S}\OperatorTok{];}
\NormalTok{LL n}\OperatorTok{,}\NormalTok{ a}\OperatorTok{,}\NormalTok{ b}\OperatorTok{,}\NormalTok{ c}\OperatorTok{,}\NormalTok{ d}\OperatorTok{;}
\PreprocessorTok{\#define pb }\NormalTok{push\_back}
\PreprocessorTok{\#define mp }\NormalTok{make\_pair}
\PreprocessorTok{\#define fi }\NormalTok{first}
\PreprocessorTok{\#define se }\NormalTok{second}
\NormalTok{pair}\OperatorTok{\textless{}}\NormalTok{LL}\OperatorTok{,}\NormalTok{ LL}\OperatorTok{\textgreater{}}\NormalTok{ Val}\OperatorTok{[}\NormalTok{\_S}\OperatorTok{];}
\DataTypeTok{bool} \KeywordTok{operator} \OperatorTok{\textgreater{}} \OperatorTok{(}\NormalTok{pair}\OperatorTok{\textless{}}\NormalTok{LL}\OperatorTok{,}\NormalTok{ LL}\OperatorTok{\textgreater{}}\NormalTok{ A}\OperatorTok{,}\NormalTok{ pair}\OperatorTok{\textless{}}\NormalTok{LL}\OperatorTok{,}\NormalTok{ LL}\OperatorTok{\textgreater{}}\NormalTok{ B}\OperatorTok{)\{} \ControlFlowTok{return} \OperatorTok{(}\NormalTok{A}\OperatorTok{.}\NormalTok{fi }\OperatorTok{*}\NormalTok{ B}\OperatorTok{.}\NormalTok{se }\OperatorTok{\textgreater{}}\NormalTok{ A}\OperatorTok{.}\NormalTok{se }\OperatorTok{*}\NormalTok{ B}\OperatorTok{.}\NormalTok{fi}\OperatorTok{);} \OperatorTok{\}}
\NormalTok{LL A}\OperatorTok{[}\NormalTok{\_S}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ doit}\OperatorTok{()\{}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{a}\OperatorTok{)(}\NormalTok{b}\OperatorTok{)(}\NormalTok{c}\OperatorTok{)(}\NormalTok{d}\OperatorTok{);}\NormalTok{ vector}\OperatorTok{\textless{}}\NormalTok{pair}\OperatorTok{\textless{}}\NormalTok{LL}\OperatorTok{,}\NormalTok{ LL}\OperatorTok{\textgreater{}} \OperatorTok{\textgreater{}}\NormalTok{ V}\OperatorTok{;}\NormalTok{ V}\OperatorTok{.}\NormalTok{clear}\OperatorTok{();}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \OperatorTok{(}\NormalTok{n}\OperatorTok{)} \OperatorTok{*} \OperatorTok{(}\NormalTok{n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \OperatorTok{/} \DecValTok{2}\OperatorTok{)}\NormalTok{ V}\OperatorTok{.}\NormalTok{pb}\OperatorTok{(}\NormalTok{mp}\OperatorTok{(}\NormalTok{min}\OperatorTok{(}\NormalTok{i }\OperatorTok{*}\NormalTok{ a}\OperatorTok{,} \OperatorTok{((}\NormalTok{n }\OperatorTok{*} \OperatorTok{(}\NormalTok{n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \OperatorTok{/} \DecValTok{2}\OperatorTok{)} \OperatorTok{{-}}\NormalTok{ i}\OperatorTok{)} \OperatorTok{*}\NormalTok{ a }\OperatorTok{+}\NormalTok{ b}\OperatorTok{),}\NormalTok{ dp}\OperatorTok{[}\NormalTok{n}\OperatorTok{][}\NormalTok{i}\OperatorTok{]));}
\NormalTok{ sort}\OperatorTok{(}\NormalTok{V}\OperatorTok{.}\NormalTok{begin}\OperatorTok{(),}\NormalTok{ V}\OperatorTok{.}\NormalTok{end}\OperatorTok{());}
\DataTypeTok{int}\NormalTok{ tot }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{L}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ V}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ R }\OperatorTok{=}\NormalTok{ L}\OperatorTok{;} \ControlFlowTok{while}\OperatorTok{(}\NormalTok{V}\OperatorTok{[}\NormalTok{R }\OperatorTok{+} \DecValTok{1}\OperatorTok{].}\NormalTok{fi }\OperatorTok{==}\NormalTok{ V}\OperatorTok{[}\NormalTok{L}\OperatorTok{].}\NormalTok{fi }\OperatorTok{\&\&}\NormalTok{ R }\OperatorTok{+} \DecValTok{1} \OperatorTok{\textless{}=} \OperatorTok{(}\DataTypeTok{int}\OperatorTok{)(}\NormalTok{V}\OperatorTok{.}\NormalTok{size}\OperatorTok{())} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{)}\NormalTok{ R}\OperatorTok{++;}\NormalTok{ LL sum }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{)}\NormalTok{ sum }\OperatorTok{+=}\NormalTok{ V}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{se}\OperatorTok{;}
\NormalTok{ V}\OperatorTok{[}\NormalTok{tot}\OperatorTok{].}\NormalTok{fi }\OperatorTok{=}\NormalTok{ V}\OperatorTok{[}\NormalTok{L}\OperatorTok{].}\NormalTok{fi}\OperatorTok{;}\NormalTok{ V}\OperatorTok{[}\NormalTok{tot}\OperatorTok{].}\NormalTok{se }\OperatorTok{=}\NormalTok{ sum}\OperatorTok{;}
\NormalTok{ tot}\OperatorTok{++;}
\NormalTok{ L }\OperatorTok{=}\NormalTok{ R}\OperatorTok{;}
\OperatorTok{\}}\NormalTok{ LL S }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ tot }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)}\NormalTok{ S }\OperatorTok{+=}\NormalTok{ V}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{se}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ tot }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)\{}
\NormalTok{ LL cnt }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,}\NormalTok{ i}\OperatorTok{,}\NormalTok{ tot }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)}\NormalTok{ cnt }\OperatorTok{+=}\NormalTok{ V}\OperatorTok{[}\NormalTok{j}\OperatorTok{].}\NormalTok{se}\OperatorTok{;}
\NormalTok{ LL A }\OperatorTok{=}\NormalTok{ cnt }\OperatorTok{*}\NormalTok{ c}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)}\NormalTok{ A }\OperatorTok{+=}\NormalTok{ V}\OperatorTok{[}\NormalTok{j}\OperatorTok{].}\NormalTok{fi }\OperatorTok{*}\NormalTok{ V}\OperatorTok{[}\NormalTok{j}\OperatorTok{].}\NormalTok{se}\OperatorTok{;}
\NormalTok{ LL B }\OperatorTok{=}\NormalTok{ S }\OperatorTok{{-}}\NormalTok{ cnt}\OperatorTok{;}
\NormalTok{ LL g }\OperatorTok{=}\NormalTok{ gcd}\OperatorTok{(}\NormalTok{A}\OperatorTok{,}\NormalTok{ B}\OperatorTok{);}\NormalTok{ Val}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ mp}\OperatorTok{(}\NormalTok{A }\OperatorTok{/}\NormalTok{ g}\OperatorTok{,}\NormalTok{ B }\OperatorTok{/}\NormalTok{ g}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ Mid }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ tot }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{Val}\OperatorTok{[}\NormalTok{Mid}\OperatorTok{]} \OperatorTok{\textgreater{}}\NormalTok{ Val}\OperatorTok{[}\NormalTok{i}\OperatorTok{])}\NormalTok{ Mid }\OperatorTok{=}\NormalTok{ i}\OperatorTok{;}
\NormalTok{ pair}\OperatorTok{\textless{}}\NormalTok{LL}\OperatorTok{,}\NormalTok{ LL}\OperatorTok{\textgreater{}}\NormalTok{ MAns }\OperatorTok{=}\NormalTok{ Val}\OperatorTok{[}\NormalTok{Mid}\OperatorTok{];}\NormalTok{ MAns}\OperatorTok{.}\NormalTok{fi }\OperatorTok{+=}\NormalTok{ MAns}\OperatorTok{.}\NormalTok{se }\OperatorTok{*}\NormalTok{ c}\OperatorTok{;}\NormalTok{ LL g }\OperatorTok{=}\NormalTok{ gcd}\OperatorTok{(}\NormalTok{MAns}\OperatorTok{.}\NormalTok{fi}\OperatorTok{,}\NormalTok{ MAns}\OperatorTok{.}\NormalTok{se}\OperatorTok{);}\NormalTok{ MAns}\OperatorTok{.}\NormalTok{fi }\OperatorTok{/=}\NormalTok{ g}\OperatorTok{;}\NormalTok{ MAns}\OperatorTok{.}\NormalTok{se }\OperatorTok{/=}\NormalTok{ g}\OperatorTok{;}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{d}\OperatorTok{{-}{-})\{}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Read}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\NormalTok{ LL ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,}\NormalTok{ i }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{+=} \OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{\textgreater{}}\NormalTok{ A}\OperatorTok{[}\NormalTok{j}\OperatorTok{]);}
\NormalTok{ ans }\OperatorTok{=}\NormalTok{ min}\OperatorTok{(}\NormalTok{ans }\OperatorTok{*}\NormalTok{ a}\OperatorTok{,}\NormalTok{ b }\OperatorTok{+}\NormalTok{ a }\OperatorTok{*} \OperatorTok{((}\NormalTok{n }\OperatorTok{*} \OperatorTok{(}\NormalTok{n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \OperatorTok{/} \DecValTok{2}\OperatorTok{)} \OperatorTok{{-}}\NormalTok{ ans}\OperatorTok{));}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{ans }\OperatorTok{*}\NormalTok{ MAns}\OperatorTok{.}\NormalTok{se }\OperatorTok{\textless{}}\NormalTok{ MAns}\OperatorTok{.}\NormalTok{fi}\OperatorTok{)}\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld}\StringTok{/1}\SpecialCharTok{\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{);}
\ControlFlowTok{else}\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld}\StringTok{/}\SpecialCharTok{\%lld\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ MAns}\OperatorTok{.}\NormalTok{fi}\OperatorTok{,}\NormalTok{ MAns}\OperatorTok{.}\NormalTok{se}\OperatorTok{);} \OtherTok{assert}\OperatorTok{(}\NormalTok{MAns}\OperatorTok{.}\NormalTok{fi }\OperatorTok{\textgreater{}} \DecValTok{0}\OperatorTok{);} \OtherTok{assert}\OperatorTok{(}\NormalTok{MAns}\OperatorTok{.}\NormalTok{se }\OperatorTok{\textgreater{}} \DecValTok{0}\OperatorTok{);}
\OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ Init}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ n}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ dp}\OperatorTok{[}\DecValTok{1}\OperatorTok{][}\DecValTok{0}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{2}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \OperatorTok{((}\NormalTok{i}\OperatorTok{)} \OperatorTok{*} \OperatorTok{(}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{))} \OperatorTok{/} \DecValTok{2}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ LL }\OperatorTok{\&}\NormalTok{ans }\OperatorTok{=}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{k}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ min}\OperatorTok{(}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{,}\NormalTok{ j}\OperatorTok{))}\NormalTok{ ans }\OperatorTok{+=}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}}\NormalTok{ k}\OperatorTok{];}
\OperatorTok{\}}
\OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{signed}\NormalTok{ main}\OperatorTok{()\{}\NormalTok{ freopen}\OperatorTok{(}\StringTok{"in.txt"}\OperatorTok{,} \StringTok{"r"}\OperatorTok{,}\NormalTok{ stdin}\OperatorTok{);}
\NormalTok{ Init}\OperatorTok{(}\DecValTok{17}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ T}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{T}\OperatorTok{);}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{T}\OperatorTok{{-}{-})}\NormalTok{ doit}\OperatorTok{();}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\begin{Shaded}
\begin{Highlighting}[]
\PreprocessorTok{\#include }\ImportTok{\textless{}bits/stdc++.h\textgreater{}}
\PreprocessorTok{\#define fi }\NormalTok{first}
\PreprocessorTok{\#define se }\NormalTok{second}
\PreprocessorTok{\#define pb }\NormalTok{push\_back}
\PreprocessorTok{\#define mp }\NormalTok{make\_pair}
\PreprocessorTok{\#define SZ}\OperatorTok{(}\NormalTok{x}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{((}\DataTypeTok{int}\OperatorTok{)}\NormalTok{x}\OperatorTok{.}\NormalTok{size}\OperatorTok{())}
\PreprocessorTok{\#define ALL}\OperatorTok{(}\NormalTok{x}\OperatorTok{)}\PreprocessorTok{ }\NormalTok{x}\OperatorTok{.}\NormalTok{begin}\OperatorTok{(),}\PreprocessorTok{ }\NormalTok{x}\OperatorTok{.}\NormalTok{end}\OperatorTok{()}
\PreprocessorTok{\#define L}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{u}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\PreprocessorTok{ }\OperatorTok{(}\AttributeTok{register}\PreprocessorTok{ }\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{head}\OperatorTok{[}\NormalTok{u}\OperatorTok{];}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{;}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{nxt}\OperatorTok{[}\NormalTok{i}\OperatorTok{])}
\PreprocessorTok{\#define rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{a}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{b}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\PreprocessorTok{ }\OperatorTok{(}\AttributeTok{register}\PreprocessorTok{ }\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{a}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{\textless{}=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{b}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{++)}
\PreprocessorTok{\#define per}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{a}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{b}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\PreprocessorTok{ }\OperatorTok{(}\AttributeTok{register}\PreprocessorTok{ }\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{a}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{\textgreater{}=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{b}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{{-}{-})}
\KeywordTok{using} \KeywordTok{namespace}\NormalTok{ std}\OperatorTok{;}
\KeywordTok{typedef} \DataTypeTok{long} \DataTypeTok{double}\NormalTok{ ld}\OperatorTok{;}
\KeywordTok{typedef} \DataTypeTok{long} \DataTypeTok{long}\NormalTok{ ll}\OperatorTok{;}
\KeywordTok{typedef} \DataTypeTok{unsigned} \DataTypeTok{int}\NormalTok{ ui}\OperatorTok{;}
\KeywordTok{typedef}\NormalTok{ pair}\OperatorTok{\textless{}}\NormalTok{ll}\OperatorTok{,}\NormalTok{ ll}\OperatorTok{\textgreater{}}\NormalTok{ Pll}\OperatorTok{;}
\KeywordTok{typedef}\NormalTok{ vector}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ Vi}\OperatorTok{;}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ read}\OperatorTok{(}\NormalTok{T }\OperatorTok{\&}\NormalTok{x}\OperatorTok{)\{}\NormalTok{x }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\DataTypeTok{char}\NormalTok{ c }\OperatorTok{=}\NormalTok{ getchar}\OperatorTok{();}\DataTypeTok{int}\NormalTok{ f }\OperatorTok{=} \DecValTok{1}\OperatorTok{;} \ControlFlowTok{while} \OperatorTok{(!}\NormalTok{isdigit}\OperatorTok{(}\NormalTok{c}\OperatorTok{))} \OperatorTok{\{} \ControlFlowTok{if} \OperatorTok{(}\NormalTok{c }\OperatorTok{==} \CharTok{\textquotesingle{}{-}\textquotesingle{}}\OperatorTok{)}\NormalTok{ f }\OperatorTok{=} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{;}\NormalTok{ c }\OperatorTok{=}\NormalTok{ getchar}\OperatorTok{();} \OperatorTok{\}} \ControlFlowTok{while} \OperatorTok{(}\NormalTok{isdigit}\OperatorTok{(}\NormalTok{c}\OperatorTok{))} \OperatorTok{\{}\NormalTok{ x }\OperatorTok{=}\NormalTok{ x }\OperatorTok{*} \DecValTok{10} \OperatorTok{+}\NormalTok{ c }\OperatorTok{{-}} \CharTok{\textquotesingle{}0\textquotesingle{}}\OperatorTok{;}\NormalTok{ c }\OperatorTok{=}\NormalTok{ getchar}\OperatorTok{();} \OperatorTok{\}}\NormalTok{ x }\OperatorTok{*=}\NormalTok{ f}\OperatorTok{;} \OperatorTok{\}}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\NormalTok{T gcd}\OperatorTok{(}\NormalTok{T a}\OperatorTok{,}\NormalTok{ T b}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return} \OperatorTok{!}\NormalTok{b }\OperatorTok{?}\NormalTok{ a }\OperatorTok{:}\NormalTok{ gcd}\OperatorTok{(}\NormalTok{b}\OperatorTok{,}\NormalTok{ a }\OperatorTok{\%}\NormalTok{ b}\OperatorTok{);} \OperatorTok{\}}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ umin}\OperatorTok{(}\NormalTok{T }\OperatorTok{\&}\NormalTok{x}\OperatorTok{,}\NormalTok{ T y}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ x }\OperatorTok{=}\NormalTok{ x }\OperatorTok{\textless{}}\NormalTok{ y }\OperatorTok{?}\NormalTok{ x }\OperatorTok{:}\NormalTok{ y}\OperatorTok{;} \OperatorTok{\}}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ umax}\OperatorTok{(}\NormalTok{T }\OperatorTok{\&}\NormalTok{x}\OperatorTok{,}\NormalTok{ T y}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ x }\OperatorTok{=}\NormalTok{ x }\OperatorTok{\textgreater{}}\NormalTok{ y }\OperatorTok{?}\NormalTok{ x }\OperatorTok{:}\NormalTok{ y}\OperatorTok{;} \OperatorTok{\}}
\NormalTok{ll dp}\OperatorTok{[}\DecValTok{1} \OperatorTok{\textless{}\textless{}} \DecValTok{16} \OperatorTok{|} \DecValTok{3}\OperatorTok{][}\DecValTok{141}\OperatorTok{];}
\KeywordTok{struct}\NormalTok{ Yzr}
\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{;}
\NormalTok{ ll gs}\OperatorTok{[}\DecValTok{141}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ ini}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ nn}\OperatorTok{)}
\OperatorTok{\{}
\NormalTok{ n }\OperatorTok{=}\NormalTok{ nn}\OperatorTok{;}
\NormalTok{ memset}\OperatorTok{(}\NormalTok{dp}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{dp}\OperatorTok{));}
\NormalTok{ dp}\OperatorTok{[}\DecValTok{0}\OperatorTok{][}\DecValTok{0}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{s}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ n}\OperatorTok{)} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \ControlFlowTok{if} \OperatorTok{(\textasciitilde{}}\NormalTok{s }\OperatorTok{\textgreater{}\textgreater{}}\NormalTok{ i }\OperatorTok{{-}} \DecValTok{1} \OperatorTok{\&} \DecValTok{1}\OperatorTok{)}
\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ del }\OperatorTok{=} \DecValTok{0}\OperatorTok{,}\NormalTok{ cnt }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,}\NormalTok{ i }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ del }\OperatorTok{+=}\NormalTok{ s }\OperatorTok{\textgreater{}\textgreater{}}\NormalTok{ j }\OperatorTok{{-}} \DecValTok{1} \OperatorTok{\&} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ cnt }\OperatorTok{+=}\NormalTok{ s }\OperatorTok{\textgreater{}\textgreater{}}\NormalTok{ j }\OperatorTok{{-}} \DecValTok{1} \OperatorTok{\&} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{k}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ cnt }\OperatorTok{*} \OperatorTok{(}\NormalTok{cnt }\OperatorTok{+} \DecValTok{1}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{)}\NormalTok{ dp}\OperatorTok{[}\NormalTok{s }\OperatorTok{|} \DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{k }\OperatorTok{+}\NormalTok{ del}\OperatorTok{]} \OperatorTok{+=}\NormalTok{ dp}\OperatorTok{[}\NormalTok{s}\OperatorTok{][}\NormalTok{k}\OperatorTok{];}
\OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{k}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ n }\OperatorTok{*} \OperatorTok{(}\NormalTok{n }\OperatorTok{+} \DecValTok{1}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{)}\NormalTok{ gs}\OperatorTok{[}\NormalTok{k}\OperatorTok{]} \OperatorTok{=}\NormalTok{ dp}\OperatorTok{[(}\DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ n}\OperatorTok{)} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{k}\OperatorTok{];}
\OperatorTok{\}}
\OperatorTok{\}}\NormalTok{ yzr}\OperatorTok{[}\DecValTok{17}\OperatorTok{];}
\DataTypeTok{bool}\NormalTok{ cmp}\OperatorTok{(}\NormalTok{Pll a}\OperatorTok{,}\NormalTok{ Pll b}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return} \OperatorTok{(}\NormalTok{ld}\OperatorTok{)}\NormalTok{a}\OperatorTok{.}\NormalTok{fi }\OperatorTok{/}\NormalTok{ a}\OperatorTok{.}\NormalTok{se }\OperatorTok{\textless{}} \OperatorTok{(}\NormalTok{ld}\OperatorTok{)}\NormalTok{b}\OperatorTok{.}\NormalTok{fi }\OperatorTok{/}\NormalTok{ b}\OperatorTok{.}\NormalTok{se}\OperatorTok{;} \OperatorTok{\}}
\NormalTok{ll n}\OperatorTok{,}\NormalTok{ a}\OperatorTok{,}\NormalTok{ b}\OperatorTok{,}\NormalTok{ c}\OperatorTok{,}\NormalTok{ d}\OperatorTok{,}\NormalTok{ qz}\OperatorTok{[}\DecValTok{141}\OperatorTok{],}\NormalTok{ p}\OperatorTok{[}\DecValTok{166}\OperatorTok{];}
\NormalTok{Pll s}\OperatorTok{[}\DecValTok{166}\OperatorTok{];}
\NormalTok{ll calc}\OperatorTok{(}\NormalTok{ll x}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return}\NormalTok{ min}\OperatorTok{(}\NormalTok{x }\OperatorTok{*}\NormalTok{ a}\OperatorTok{,} \OperatorTok{(}\NormalTok{n }\OperatorTok{*} \OperatorTok{(}\NormalTok{n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \OperatorTok{/} \DecValTok{2} \OperatorTok{{-}}\NormalTok{ x}\OperatorTok{)} \OperatorTok{*}\NormalTok{ a }\OperatorTok{+}\NormalTok{ b}\OperatorTok{);} \OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()}
\OperatorTok{\{}
\NormalTok{ freopen}\OperatorTok{(}\StringTok{"in.txt"}\OperatorTok{,} \StringTok{"r"}\OperatorTok{,}\NormalTok{ stdin}\OperatorTok{);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{n}\OperatorTok{,} \DecValTok{2}\OperatorTok{,} \DecValTok{16}\OperatorTok{)}\NormalTok{ yzr}\OperatorTok{[}\NormalTok{n}\OperatorTok{].}\NormalTok{ini}\OperatorTok{(}\NormalTok{n}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ T}\OperatorTok{;}
\NormalTok{ read}\OperatorTok{(}\NormalTok{T}\OperatorTok{);}
\ControlFlowTok{while} \OperatorTok{(}\NormalTok{T}\OperatorTok{{-}{-})}
\OperatorTok{\{}
\NormalTok{ read}\OperatorTok{(}\NormalTok{n}\OperatorTok{);}\NormalTok{ read}\OperatorTok{(}\NormalTok{a}\OperatorTok{);}\NormalTok{ read}\OperatorTok{(}\NormalTok{b}\OperatorTok{);}\NormalTok{ read}\OperatorTok{(}\NormalTok{c}\OperatorTok{);}\NormalTok{ read}\OperatorTok{(}\NormalTok{d}\OperatorTok{);}
\NormalTok{ Pll res}\OperatorTok{(}\FloatTok{1e18}\OperatorTok{,} \DecValTok{1}\OperatorTok{);}
\NormalTok{ ll tot }\OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ tot }\OperatorTok{*=}\NormalTok{ i}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ len }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ n }\OperatorTok{*} \OperatorTok{(}\NormalTok{n }\OperatorTok{+} \DecValTok{1}\OperatorTok{)} \OperatorTok{/} \DecValTok{2}\OperatorTok{)} \ControlFlowTok{if} \OperatorTok{(}\NormalTok{yzr}\OperatorTok{[}\NormalTok{n}\OperatorTok{].}\NormalTok{gs}\OperatorTok{[}\NormalTok{i}\OperatorTok{])}\NormalTok{ s}\OperatorTok{[++}\NormalTok{len}\OperatorTok{]} \OperatorTok{=}\NormalTok{ mp}\OperatorTok{(}\NormalTok{calc}\OperatorTok{(}\NormalTok{i}\OperatorTok{),}\NormalTok{ yzr}\OperatorTok{[}\NormalTok{n}\OperatorTok{].}\NormalTok{gs}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\NormalTok{ sort}\OperatorTok{(}\NormalTok{s }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ s }\OperatorTok{+}\NormalTok{ len }\OperatorTok{+} \DecValTok{1}\OperatorTok{);}
\AttributeTok{static}\NormalTok{ ll qz}\OperatorTok{[}\DecValTok{166}\OperatorTok{],}\NormalTok{ hz}\OperatorTok{[}\DecValTok{166}\OperatorTok{];}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ len}\OperatorTok{)}\NormalTok{ qz}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ qz}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]} \OperatorTok{+}\NormalTok{ s}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{fi }\OperatorTok{*}\NormalTok{ s}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{se}\OperatorTok{;}
\NormalTok{ hz}\OperatorTok{[}\NormalTok{len }\OperatorTok{+} \DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ per}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\NormalTok{ len}\OperatorTok{,} \DecValTok{1}\OperatorTok{)}\NormalTok{ hz}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ hz}\OperatorTok{[}\NormalTok{i }\OperatorTok{+} \DecValTok{1}\OperatorTok{]} \OperatorTok{+}\NormalTok{ s}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{se}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ len}\OperatorTok{)}
\OperatorTok{\{}
\NormalTok{ Pll cur }\OperatorTok{=}\NormalTok{ mp}\OperatorTok{(}\NormalTok{qz}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{+}\NormalTok{ hz}\OperatorTok{[}\NormalTok{i }\OperatorTok{+} \DecValTok{1}\OperatorTok{]} \OperatorTok{*}\NormalTok{ c}\OperatorTok{,}\NormalTok{ tot }\OperatorTok{{-}}\NormalTok{ hz}\OperatorTok{[}\NormalTok{i }\OperatorTok{+} \DecValTok{1}\OperatorTok{]);}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{cmp}\OperatorTok{(}\NormalTok{cur}\OperatorTok{,}\NormalTok{ res}\OperatorTok{))}
\NormalTok{ res }\OperatorTok{=}\NormalTok{ cur}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ pair}\OperatorTok{\textless{}}\NormalTok{ll}\OperatorTok{,}\NormalTok{ ll}\OperatorTok{\textgreater{}}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ mp}\OperatorTok{(}\NormalTok{res}\OperatorTok{.}\NormalTok{fi }\OperatorTok{+}\NormalTok{ c }\OperatorTok{*}\NormalTok{ res}\OperatorTok{.}\NormalTok{se}\OperatorTok{,}\NormalTok{ res}\OperatorTok{.}\NormalTok{se}\OperatorTok{);}
\NormalTok{ cerr }\OperatorTok{\textless{}\textless{}} \StringTok{"N = "} \OperatorTok{\textless{}\textless{}}\NormalTok{ n }\OperatorTok{\textless{}\textless{}}\NormalTok{ endl}\OperatorTok{;}
\NormalTok{ cout }\OperatorTok{\textless{}\textless{}}\NormalTok{ ans}\OperatorTok{.}\NormalTok{fi }\OperatorTok{\textless{}\textless{}} \StringTok{" "} \OperatorTok{\textless{}\textless{}}\NormalTok{ ans}\OperatorTok{.}\NormalTok{se }\OperatorTok{\textless{}\textless{}}\NormalTok{ endl}\OperatorTok{;}
\ControlFlowTok{while} \OperatorTok{(}\NormalTok{d}\OperatorTok{{-}{-})}
\OperatorTok{\{}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ read}\OperatorTok{(}\NormalTok{p}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\DataTypeTok{int}\NormalTok{ nx }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,}\NormalTok{ i }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ nx }\OperatorTok{+=}\NormalTok{ p}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{\textgreater{}}\NormalTok{ p}\OperatorTok{[}\NormalTok{j}\OperatorTok{];}
\NormalTok{ Pll ans }\OperatorTok{=}\NormalTok{ mp}\OperatorTok{(}\NormalTok{calc}\OperatorTok{(}\NormalTok{nx}\OperatorTok{),} \DecValTok{1}\OperatorTok{);}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{cmp}\OperatorTok{(}\NormalTok{mp}\OperatorTok{(}\NormalTok{res}\OperatorTok{.}\NormalTok{fi }\OperatorTok{+}\NormalTok{ c }\OperatorTok{*}\NormalTok{ res}\OperatorTok{.}\NormalTok{se}\OperatorTok{,}\NormalTok{ res}\OperatorTok{.}\NormalTok{se}\OperatorTok{),}\NormalTok{ ans}\OperatorTok{))}
\NormalTok{ ans }\OperatorTok{=}\NormalTok{ mp}\OperatorTok{(}\NormalTok{res}\OperatorTok{.}\NormalTok{fi }\OperatorTok{+}\NormalTok{ c }\OperatorTok{*}\NormalTok{ res}\OperatorTok{.}\NormalTok{se}\OperatorTok{,}\NormalTok{ res}\OperatorTok{.}\NormalTok{se}\OperatorTok{);}
\NormalTok{ ll g }\OperatorTok{=}\NormalTok{ gcd}\OperatorTok{(}\NormalTok{ans}\OperatorTok{.}\NormalTok{fi}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{.}\NormalTok{se}\OperatorTok{);}
\NormalTok{ ans}\OperatorTok{.}\NormalTok{fi }\OperatorTok{/=}\NormalTok{ g}\OperatorTok{;}
\NormalTok{ ans}\OperatorTok{.}\NormalTok{se }\OperatorTok{/=}\NormalTok{ g}\OperatorTok{;}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld}\StringTok{/}\SpecialCharTok{\%lld\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{.}\NormalTok{fi}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{.}\NormalTok{se}\OperatorTok{);}
\OperatorTok{\}}
\OperatorTok{\}}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{D. sith}\label{d.-sith}
你有 \(k\) 棵点数均为 \(n\) 的树
对于每对点 \(i,j\),你都需要求出,有多少个点 \(x\),满足在所有树中都在
\(i\leftrightarrow j\) 的树链上(树链包含端点即 \(i,j\))。
定义函数 \(\operatorname{dis_t}(x, y)\) 为 \(x\),\(y\) 这两个结点在树
\(t\) 上的最短距离(简单路径长度)。
对于一棵树 \(t\)
,“\(\operatorname{dis_t}(i, j) = \operatorname{dis_t}(i, x) + \operatorname{dis_t}(x, j)\)”
为 “点 \(x\) 在 点\(i\) \(\leftrightarrow\) 点 \(j\) 的树链上”
的充要条件。
扩展一下可以发现
对于森林
\(T\),“\(\sum_{t \in T}\limits{\operatorname{dis_t}(i, j)} = \sum_{t \in T}\limits{\operatorname{dis_t}(i, x)} + \sum_{t \in T}\limits{\operatorname{dis_t}(x, j)}\)”
为 “对于每棵树 点 \(x\) 在 点\(i\) \(\leftrightarrow\) 点 \(j\)
的树链上” 的充要条件。
这样就可以分开算了,随便做就好了。
\begin{Shaded}
\begin{Highlighting}[]
\PreprocessorTok{\#include }\ImportTok{\textless{}bits/stdc++.h\textgreater{}}
\PreprocessorTok{\#define fi }\NormalTok{first}
\PreprocessorTok{\#define se }\NormalTok{second}
\PreprocessorTok{\#define pb }\NormalTok{push\_back}
\PreprocessorTok{\#define mp }\NormalTok{make\_pair}
\PreprocessorTok{\#define SZ}\OperatorTok{(}\NormalTok{x}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{((}\DataTypeTok{int}\OperatorTok{)}\NormalTok{x}\OperatorTok{.}\NormalTok{size}\OperatorTok{())}
\PreprocessorTok{\#define ALL}\OperatorTok{(}\NormalTok{x}\OperatorTok{)}\PreprocessorTok{ }\NormalTok{x}\OperatorTok{.}\NormalTok{begin}\OperatorTok{(),}\PreprocessorTok{ }\NormalTok{x}\OperatorTok{.}\NormalTok{end}\OperatorTok{()}
\PreprocessorTok{\#define L}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{u}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\PreprocessorTok{ }\OperatorTok{(}\AttributeTok{register}\PreprocessorTok{ }\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{head}\OperatorTok{[}\NormalTok{u}\OperatorTok{];}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{;}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{nxt}\OperatorTok{[}\NormalTok{i}\OperatorTok{])}
\PreprocessorTok{\#define rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{a}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{b}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\PreprocessorTok{ }\OperatorTok{(}\AttributeTok{register}\PreprocessorTok{ }\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{a}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{\textless{}=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{b}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{++)}
\PreprocessorTok{\#define per}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{a}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{b}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\PreprocessorTok{ }\OperatorTok{(}\AttributeTok{register}\PreprocessorTok{ }\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{a}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{\textgreater{}=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{b}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{{-}{-})}
\KeywordTok{using} \KeywordTok{namespace}\NormalTok{ std}\OperatorTok{;}
\KeywordTok{typedef} \DataTypeTok{long} \DataTypeTok{double}\NormalTok{ ld}\OperatorTok{;}
\KeywordTok{typedef} \DataTypeTok{long} \DataTypeTok{long}\NormalTok{ ll}\OperatorTok{;}
\KeywordTok{typedef} \DataTypeTok{unsigned} \DataTypeTok{int}\NormalTok{ ui}\OperatorTok{;}
\KeywordTok{typedef}\NormalTok{ pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ Pii}\OperatorTok{;}
\KeywordTok{typedef}\NormalTok{ vector}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ Vi}\OperatorTok{;}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ read}\OperatorTok{(}\NormalTok{T }\OperatorTok{\&}\NormalTok{x}\OperatorTok{)\{}\NormalTok{x }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\DataTypeTok{char}\NormalTok{ c }\OperatorTok{=}\NormalTok{ getchar}\OperatorTok{();}\DataTypeTok{int}\NormalTok{ f }\OperatorTok{=} \DecValTok{1}\OperatorTok{;}\ControlFlowTok{while} \OperatorTok{(!}\NormalTok{isdigit}\OperatorTok{(}\NormalTok{c}\OperatorTok{))\{}\ControlFlowTok{if} \OperatorTok{(}\NormalTok{c }\OperatorTok{==} \CharTok{\textquotesingle{}{-}\textquotesingle{}}\OperatorTok{)}\NormalTok{f }\OperatorTok{=} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{;}\NormalTok{c }\OperatorTok{=}\NormalTok{ getchar}\OperatorTok{();\}}\ControlFlowTok{while} \OperatorTok{(}\NormalTok{isdigit}\OperatorTok{(}\NormalTok{c}\OperatorTok{))\{}\NormalTok{x }\OperatorTok{=}\NormalTok{ x }\OperatorTok{*} \DecValTok{10} \OperatorTok{+}\NormalTok{ c }\OperatorTok{{-}} \CharTok{\textquotesingle{}0\textquotesingle{}}\OperatorTok{;}\NormalTok{c }\OperatorTok{=}\NormalTok{ getchar}\OperatorTok{();\}}\NormalTok{x }\OperatorTok{*=}\NormalTok{ f}\OperatorTok{;\}}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\NormalTok{T gcd}\OperatorTok{(}\NormalTok{T a}\OperatorTok{,}\NormalTok{ T b}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return} \OperatorTok{!}\NormalTok{b }\OperatorTok{?}\NormalTok{ a }\OperatorTok{:}\NormalTok{ gcd}\OperatorTok{(}\NormalTok{b}\OperatorTok{,}\NormalTok{ a }\OperatorTok{\%}\NormalTok{ b}\OperatorTok{);} \OperatorTok{\}}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ umin}\OperatorTok{(}\NormalTok{T }\OperatorTok{\&}\NormalTok{x}\OperatorTok{,}\NormalTok{ T y}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ x }\OperatorTok{=}\NormalTok{ x }\OperatorTok{\textless{}}\NormalTok{ y }\OperatorTok{?}\NormalTok{ x }\OperatorTok{:}\NormalTok{ y}\OperatorTok{;} \OperatorTok{\}}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ umax}\OperatorTok{(}\NormalTok{T }\OperatorTok{\&}\NormalTok{x}\OperatorTok{,}\NormalTok{ T y}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ x }\OperatorTok{=}\NormalTok{ x }\OperatorTok{\textgreater{}}\NormalTok{ y }\OperatorTok{?}\NormalTok{ x }\OperatorTok{:}\NormalTok{ y}\OperatorTok{;} \OperatorTok{\}}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\KeywordTok{inline}\NormalTok{ T Abs}\OperatorTok{(}\AttributeTok{const}\NormalTok{ T }\OperatorTok{\&}\NormalTok{x}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return}\NormalTok{ x }\OperatorTok{\textgreater{}} \DecValTok{0} \OperatorTok{?}\NormalTok{ x }\OperatorTok{:} \OperatorTok{{-}}\NormalTok{x}\OperatorTok{;} \OperatorTok{\}}
\KeywordTok{inline}\NormalTok{ ui R}\OperatorTok{()}
\OperatorTok{\{}
\AttributeTok{static}\NormalTok{ ui seed }\OperatorTok{=} \DecValTok{613}\OperatorTok{;}
\ControlFlowTok{return}\NormalTok{ seed }\OperatorTok{\^{}=}\NormalTok{ seed }\OperatorTok{\textgreater{}\textgreater{}} \DecValTok{5}\OperatorTok{,}\NormalTok{ seed }\OperatorTok{\^{}=}\NormalTok{ seed }\OperatorTok{\textless{}\textless{}} \DecValTok{17}\OperatorTok{,}\NormalTok{ seed }\OperatorTok{\^{}=}\NormalTok{ seed }\OperatorTok{\textgreater{}\textgreater{}} \DecValTok{13}\OperatorTok{;}
\OperatorTok{\}}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ N }\OperatorTok{=} \DecValTok{505}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ k}\OperatorTok{,}\NormalTok{ dis}\OperatorTok{[}\NormalTok{N}\OperatorTok{][}\NormalTok{N}\OperatorTok{];}
\NormalTok{Vi e}\OperatorTok{[}\NormalTok{N}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ dfs}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ s}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ u}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ fa}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ dep}\OperatorTok{)}
\OperatorTok{\{}
\NormalTok{ dis}\OperatorTok{[}\NormalTok{s}\OperatorTok{][}\NormalTok{u}\OperatorTok{]} \OperatorTok{+=}\NormalTok{ dep}\OperatorTok{;}
\ControlFlowTok{for} \OperatorTok{(}\DataTypeTok{int}\NormalTok{ v }\OperatorTok{:}\NormalTok{ e}\OperatorTok{[}\NormalTok{u}\OperatorTok{])}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{v }\OperatorTok{!=}\NormalTok{ fa}\OperatorTok{)}
\NormalTok{ dfs}\OperatorTok{(}\NormalTok{s}\OperatorTok{,}\NormalTok{ v}\OperatorTok{,}\NormalTok{ u}\OperatorTok{,}\NormalTok{ dep }\OperatorTok{+} \DecValTok{1}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()}
\OperatorTok{\{}
\NormalTok{ read}\OperatorTok{(}\NormalTok{n}\OperatorTok{);}\NormalTok{read}\OperatorTok{(}\NormalTok{k}\OperatorTok{);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{tt}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ k}\OperatorTok{)\{}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ e}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{clear}\OperatorTok{();}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{;}\NormalTok{read}\OperatorTok{(}\NormalTok{u}\OperatorTok{);}\NormalTok{read}\OperatorTok{(}\NormalTok{v}\OperatorTok{);}
\NormalTok{ e}\OperatorTok{[}\NormalTok{u}\OperatorTok{].}\NormalTok{pb}\OperatorTok{(}\NormalTok{v}\OperatorTok{);}\NormalTok{e}\OperatorTok{[}\NormalTok{v}\OperatorTok{].}\NormalTok{pb}\OperatorTok{(}\NormalTok{u}\OperatorTok{);}
\OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ dfs}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\NormalTok{ i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \DecValTok{0}\OperatorTok{);}
\OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}
\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{x}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{+=}\NormalTok{ dis}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{x}\OperatorTok{]} \OperatorTok{+}\NormalTok{ dis}\OperatorTok{[}\NormalTok{j}\OperatorTok{][}\NormalTok{x}\OperatorTok{]} \OperatorTok{==}\NormalTok{ dis}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{];}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d\%c}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{,}\NormalTok{ j }\OperatorTok{\textless{}}\NormalTok{ n }\OperatorTok{?} \CharTok{\textquotesingle{} \textquotesingle{}} \OperatorTok{:} \CharTok{\textquotesingle{}}\SpecialCharTok{\textbackslash{}n}\CharTok{\textquotesingle{}}\OperatorTok{);}
\OperatorTok{\}}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsection{Round 2}\label{round-2}
\subsubsection{A. one}\label{a.-one}
给你一个长度为 \(n\)
的数组,你需要将其划分为若干个连续段。对于一种划分,定义其权值为,求出每段的段内所有元素
xor 值,再把所有段的 xor 值相加即为权值。
你需要计算对于所有划分,这个权值的最小、最大值分别是多少。
\(n \le 10^6\)
\(A \operatorname{xor} B \le A + B\)
\(A \ \And B \le A\ |\ B \le A + B\)
全部拆开最大,全部合并最小。
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ MIN }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ LL MAX }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \OperatorTok{\{} \DataTypeTok{int}\NormalTok{ x}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{x}\OperatorTok{);}\NormalTok{ MIN }\OperatorTok{\^{}=}\NormalTok{ x}\OperatorTok{;}\NormalTok{ MAX }\OperatorTok{+=}\NormalTok{ x}\OperatorTok{;} \OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{ }\SpecialCharTok{\%lld}\StringTok{"}\OperatorTok{,}\NormalTok{ MIN}\OperatorTok{,}\NormalTok{ MAX}\OperatorTok{);}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{B. two}\label{b.-two}
有一个 \(1..n\) 依次连成的环,有一个从 \(1\)
开始移动的指针,每次指针所在位置有\(p\)的概率消失并将这个位置对应的下标(在
\(1..n\) 中)插入序列 \(B\) 的末尾,然后指针移动一格( \(1\) 移到
\(2\),\(n\) 移到 \(1\)
这样,一个位置若已经消失则不会被移动到)。所有位置都消失时游戏结束。最后
\(B\) 会是一个排列。
这道题跟序列 \(B\) 没什么关系,你只需要求出游戏期望进行几轮,答案对
\(998244353\) 取模。
读入描述: 一行三个整数 \(n,x,y\)。概率 \(p=\frac x y\)
设 \(f[n]\) 为 长度为 \(n\) 还需要进行多少轮。
易知 \(f[n] = 1 + p \times f[n - 1] + \left(1 - p \right) \times f[n]\)
移项得 \(f[n] = n \times \frac{1}{p}\)
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{x}\OperatorTok{)(}\NormalTok{y}\OperatorTok{);}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{(}\NormalTok{n }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ y }\OperatorTok{\%}\NormalTok{ MOD }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ inv}\OperatorTok{(}\NormalTok{x}\OperatorTok{,}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{));}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{C. three}\label{c.-three}
小Y拥有一个序列\(a_i\)(从0开始标号)。
小Y想要对序列进行\(Q\)次操作,操作有下面几种:
\begin{itemize}
\tightlist
\item
\(t=0\):对区间\([l,r]\)执行\(a_i=a_i+x\)
\item
\(t=1\):对区间\([l,r]\)执行\(a_i=\lfloor \frac {a_i} {x} \rfloor\)
\item
\(t=2\):查询区间\([l,r]\)的\(\max {a_i}\)
\item
\(t=3\):把区间\([l,r]\)的\(a_i\)恢复为初始给出的\(a_i\)
\(a_i \le 10^8; n, Q \le 10^5\)
\end{itemize}
\paragraph{定义一类特殊标记}\label{ux5b9aux4e49ux4e00ux7c7bux7279ux6b8aux6807ux8bb0}
记录标记 \(a, b, c\) 表示 \(x\) 变成
\(\lfloor \frac{x + a}{b} \rfloor + c\)。 其中要求 \(a < b\)。 -
对于加法操作 \(c += x\) 即可。 - 对于除法操作如果是除 \(d\)
:\(\lfloor \frac{ \lfloor \frac{x + a}{b} \rfloor + c}{d} \rfloor = \lfloor \frac{ \lfloor \frac{x + a + bc}{b} \rfloor}{d} \rfloor = \lfloor \frac{x + a + bc}{bd} \rfloor\)
然后优化一下 \(x + a + bc\) 保持
\(a' < b'\),类似于假分数换算带分数,保证不会爆\texttt{long\ long}。
对于处理除数过大的情况:
\begin{Shaded}
\begin{Highlighting}[]
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{fm }\OperatorTok{\textgreater{}}\NormalTok{ inf}\OperatorTok{)}\NormalTok{ fz }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{,}\NormalTok{ fz }\OperatorTok{+} \OperatorTok{(}\NormalTok{inf }\OperatorTok{{-}}\NormalTok{ fm}\OperatorTok{)),}\NormalTok{ fm }\OperatorTok{=}\NormalTok{ inf}\OperatorTok{;}
\end{Highlighting}
\end{Shaded}
如果分母 \(> \operatorname{inf}\),那么
\(\lfloor \frac{x + a}{b} \rfloor + c\) 等价于 \([x \ge b - a] + c\)
当分母很大时,可以使得 \(a, b\) 同时减去一个常数使得 \(b\)
不会溢出,对于 \([x \ge b - a] + c\) 不影响取值。
\begin{Shaded}
\begin{Highlighting}[]
\PreprocessorTok{\#include }\ImportTok{\textless{}bits/stdc++.h\textgreater{}}
\PreprocessorTok{\#define fi }\NormalTok{first}
\PreprocessorTok{\#define se }\NormalTok{second}
\PreprocessorTok{\#define pb }\NormalTok{push\_back}
\PreprocessorTok{\#define mp }\NormalTok{make\_pair}
\PreprocessorTok{\#define SZ}\OperatorTok{(}\NormalTok{x}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{((}\DataTypeTok{int}\OperatorTok{)}\NormalTok{x}\OperatorTok{.}\NormalTok{size}\OperatorTok{())}
\PreprocessorTok{\#define ALL}\OperatorTok{(}\NormalTok{x}\OperatorTok{)}\PreprocessorTok{ }\NormalTok{x}\OperatorTok{.}\NormalTok{begin}\OperatorTok{(),}\PreprocessorTok{ }\NormalTok{x}\OperatorTok{.}\NormalTok{end}\OperatorTok{()}
\PreprocessorTok{\#define L}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{u}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\PreprocessorTok{ }\OperatorTok{(}\AttributeTok{register}\PreprocessorTok{ }\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{head}\OperatorTok{[}\NormalTok{u}\OperatorTok{];}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{;}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{nxt}\OperatorTok{[}\NormalTok{i}\OperatorTok{])}
\PreprocessorTok{\#define rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{a}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{b}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\PreprocessorTok{ }\OperatorTok{(}\AttributeTok{register}\PreprocessorTok{ }\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{a}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{\textless{}=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{b}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{++)}
\PreprocessorTok{\#define per}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{a}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{b}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\PreprocessorTok{ }\OperatorTok{(}\AttributeTok{register}\PreprocessorTok{ }\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{a}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{\textgreater{}=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{b}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{{-}{-})}
\KeywordTok{using} \KeywordTok{namespace}\NormalTok{ std}\OperatorTok{;}
\KeywordTok{typedef} \DataTypeTok{long} \DataTypeTok{double}\NormalTok{ ld}\OperatorTok{;}
\KeywordTok{typedef} \DataTypeTok{long} \DataTypeTok{long}\NormalTok{ ll}\OperatorTok{;}
\KeywordTok{typedef} \DataTypeTok{unsigned} \DataTypeTok{int}\NormalTok{ ui}\OperatorTok{;}
\KeywordTok{typedef}\NormalTok{ pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ Pii}\OperatorTok{;}
\KeywordTok{typedef}\NormalTok{ vector}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ Vi}\OperatorTok{;}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\NormalTok{T gcd}\OperatorTok{(}\NormalTok{T a}\OperatorTok{,}\NormalTok{ T b}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return} \OperatorTok{!}\NormalTok{b }\OperatorTok{?}\NormalTok{ a }\OperatorTok{:}\NormalTok{ gcd}\OperatorTok{(}\NormalTok{b}\OperatorTok{,}\NormalTok{ a }\OperatorTok{\%}\NormalTok{ b}\OperatorTok{);} \OperatorTok{\}}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ umin}\OperatorTok{(}\NormalTok{T }\OperatorTok{\&}\NormalTok{x}\OperatorTok{,}\NormalTok{ T y}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ x }\OperatorTok{=}\NormalTok{ x }\OperatorTok{\textless{}}\NormalTok{ y }\OperatorTok{?}\NormalTok{ x }\OperatorTok{:}\NormalTok{ y}\OperatorTok{;} \OperatorTok{\}}
\KeywordTok{template} \OperatorTok{\textless{}}\KeywordTok{class}\NormalTok{ T}\OperatorTok{\textgreater{}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ umax}\OperatorTok{(}\NormalTok{T }\OperatorTok{\&}\NormalTok{x}\OperatorTok{,}\NormalTok{ T y}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ x }\OperatorTok{=}\NormalTok{ x }\OperatorTok{\textgreater{}}\NormalTok{ y }\OperatorTok{?}\NormalTok{ x }\OperatorTok{:}\NormalTok{ y}\OperatorTok{;} \OperatorTok{\}}
\KeywordTok{inline}\NormalTok{ ui R}\OperatorTok{()}
\OperatorTok{\{}
\AttributeTok{static}\NormalTok{ ui seed }\OperatorTok{=} \DecValTok{416}\OperatorTok{;}
\ControlFlowTok{return}\NormalTok{ seed }\OperatorTok{\^{}=}\NormalTok{ seed }\OperatorTok{\textgreater{}\textgreater{}} \DecValTok{5}\OperatorTok{,}\NormalTok{ seed }\OperatorTok{\^{}=}\NormalTok{ seed }\OperatorTok{\textless{}\textless{}} \DecValTok{17}\OperatorTok{,}\NormalTok{ seed }\OperatorTok{\^{}=}\NormalTok{ seed }\OperatorTok{\textgreater{}\textgreater{}} \DecValTok{13}\OperatorTok{;}
\OperatorTok{\}}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ N }\OperatorTok{=} \DecValTok{233333}\OperatorTok{,}\NormalTok{ inf }\OperatorTok{=} \FloatTok{2e9} \OperatorTok{+} \FloatTok{1e8}\OperatorTok{;}
\KeywordTok{struct}\NormalTok{ node}
\OperatorTok{\{}
\NormalTok{ ll ans}\OperatorTok{;}
\DataTypeTok{bool}\NormalTok{ emp}\OperatorTok{;}
\NormalTok{ ll a}\OperatorTok{,}\NormalTok{ b}\OperatorTok{,}\NormalTok{ c}\OperatorTok{,}\NormalTok{ mx}\OperatorTok{;} \CommentTok{//(x+a)/b+c (a\textless{}b\textless{}=inf)}
\NormalTok{ node}\OperatorTok{()} \OperatorTok{\{}\NormalTok{ b }\OperatorTok{=} \DecValTok{1}\OperatorTok{;} \OperatorTok{\}}
\OperatorTok{\}}\NormalTok{ tree}\OperatorTok{[}\NormalTok{N }\OperatorTok{\textless{}\textless{}} \DecValTok{2}\OperatorTok{];}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ pushadd}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ k}\OperatorTok{,}\NormalTok{ ll x}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{ans }\OperatorTok{+=}\NormalTok{ x}\OperatorTok{;}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{c }\OperatorTok{+=}\NormalTok{ x}\OperatorTok{;}
\OperatorTok{\}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ pushdiv}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ k}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ d}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{ans }\OperatorTok{/=}\NormalTok{ d}\OperatorTok{;}
\NormalTok{ ll fm }\OperatorTok{=} \DecValTok{1}\BuiltInTok{ll} \OperatorTok{*}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{b }\OperatorTok{*}\NormalTok{ d}\OperatorTok{,}\NormalTok{ tmp }\OperatorTok{=} \OperatorTok{(}\NormalTok{tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{a }\OperatorTok{+} \DecValTok{1}\BuiltInTok{ll} \OperatorTok{*}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{b }\OperatorTok{*}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{c}\OperatorTok{)} \OperatorTok{/}\NormalTok{ fm}\OperatorTok{;}
\NormalTok{ ll fz }\OperatorTok{=} \OperatorTok{(}\NormalTok{tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{a }\OperatorTok{+} \DecValTok{1}\BuiltInTok{ll} \OperatorTok{*}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{b }\OperatorTok{*}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{c}\OperatorTok{)} \OperatorTok{{-}}\NormalTok{ fm }\OperatorTok{*}\NormalTok{ tmp}\OperatorTok{;}
\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{c }\OperatorTok{=}\NormalTok{ tmp}\OperatorTok{;}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{fm }\OperatorTok{\textgreater{}}\NormalTok{ inf}\OperatorTok{)}\NormalTok{ fz }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{,}\NormalTok{ fz }\OperatorTok{+} \OperatorTok{(}\NormalTok{inf }\OperatorTok{{-}}\NormalTok{ fm}\OperatorTok{)),}\NormalTok{ fm }\OperatorTok{=}\NormalTok{ inf}\OperatorTok{;}
\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{a }\OperatorTok{=}\NormalTok{ fz}\OperatorTok{,}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{b }\OperatorTok{=}\NormalTok{ fm}\OperatorTok{;}
\CommentTok{// printf("\%d:\%lld \%lld \%lld\textbackslash{}n",k,tree[k].a,tree[k].b,tree[k].c);}
\OperatorTok{\}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ pushemp}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ k}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{emp }\OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{a }\OperatorTok{=}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{c }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{b }\OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{ans }\OperatorTok{=}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{mx}\OperatorTok{;}
\OperatorTok{\}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ pushdown}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ k}\OperatorTok{)} \OperatorTok{\{}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{emp}\OperatorTok{)}\NormalTok{ pushemp}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{),}\NormalTok{ pushemp}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{),}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{emp }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{a}\OperatorTok{)}\NormalTok{ pushadd}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{a}\OperatorTok{),}\NormalTok{ pushadd}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{a}\OperatorTok{),}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{a }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{b }\OperatorTok{!=} \DecValTok{1}\OperatorTok{)}\NormalTok{ pushdiv}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{b}\OperatorTok{),}\NormalTok{ pushdiv}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{b}\OperatorTok{),}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{b }\OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{c}\OperatorTok{)}\NormalTok{ pushadd}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{c}\OperatorTok{),}\NormalTok{ pushadd}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{c}\OperatorTok{),}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{c }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\KeywordTok{inline} \DataTypeTok{void}\NormalTok{ upd}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ k}\OperatorTok{)\{}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{ans }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{tree}\OperatorTok{[}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{].}\NormalTok{ans}\OperatorTok{,}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{].}\NormalTok{ans}\OperatorTok{);} \OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ mdy1}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ k}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ l}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ r}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ x}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\{}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{l }\OperatorTok{==}\NormalTok{ L }\OperatorTok{\&\&}\NormalTok{ r }\OperatorTok{==}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ pushadd}\OperatorTok{(}\NormalTok{k}\OperatorTok{,}\NormalTok{ x}\OperatorTok{);} \ControlFlowTok{return}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{L }\OperatorTok{+}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ pushdown}\OperatorTok{(}\NormalTok{k}\OperatorTok{);}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{r }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ mdy1}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}
\ControlFlowTok{else} \ControlFlowTok{if} \OperatorTok{(}\NormalTok{l }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ mdy1}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\ControlFlowTok{else}\NormalTok{ mdy1}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{),}\NormalTok{ mdy1}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ upd}\OperatorTok{(}\NormalTok{k}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ mdy2}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ k}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ l}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ r}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ x}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\{}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{l }\OperatorTok{==}\NormalTok{ L }\OperatorTok{\&\&}\NormalTok{ r }\OperatorTok{==}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ pushdiv}\OperatorTok{(}\NormalTok{k}\OperatorTok{,}\NormalTok{ x}\OperatorTok{);} \ControlFlowTok{return}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{L }\OperatorTok{+}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ pushdown}\OperatorTok{(}\NormalTok{k}\OperatorTok{);}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{r }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ mdy2}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}
\ControlFlowTok{else} \ControlFlowTok{if} \OperatorTok{(}\NormalTok{l }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ mdy2}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\ControlFlowTok{else}\NormalTok{ mdy2}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{),}\NormalTok{ mdy2}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ upd}\OperatorTok{(}\NormalTok{k}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ mdy3}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ k}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ l}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ r}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ x}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\{}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{l }\OperatorTok{==}\NormalTok{ L }\OperatorTok{\&\&}\NormalTok{ r }\OperatorTok{==}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ pushemp}\OperatorTok{(}\NormalTok{k}\OperatorTok{);} \ControlFlowTok{return}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{L }\OperatorTok{+}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ pushdown}\OperatorTok{(}\NormalTok{k}\OperatorTok{);}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{r }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ mdy3}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}
\ControlFlowTok{else} \ControlFlowTok{if} \OperatorTok{(}\NormalTok{l }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ mdy3}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\ControlFlowTok{else}\NormalTok{ mdy3}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{),}\NormalTok{ mdy3}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ upd}\OperatorTok{(}\NormalTok{k}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ qry}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ k}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ l}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ r}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ x}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)}
\OperatorTok{\{}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{l }\OperatorTok{==}\NormalTok{ L }\OperatorTok{\&\&}\NormalTok{ r }\OperatorTok{==}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{ans}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{L }\OperatorTok{+}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ pushdown}\OperatorTok{(}\NormalTok{k}\OperatorTok{);}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{r }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}
\ControlFlowTok{return}\NormalTok{ qry}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}
\ControlFlowTok{else} \ControlFlowTok{if} \OperatorTok{(}\NormalTok{l }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}
\ControlFlowTok{return}\NormalTok{ qry}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\ControlFlowTok{return}\NormalTok{ max}\OperatorTok{(}\NormalTok{qry}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{),}\NormalTok{ qry}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{));}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ q}\OperatorTok{,}\NormalTok{ a}\OperatorTok{[}\NormalTok{N}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ build}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ k}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ l}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ r}\OperatorTok{)}
\OperatorTok{\{}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{l }\OperatorTok{==}\NormalTok{ r}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{mx }\OperatorTok{=}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{ans }\OperatorTok{=}\NormalTok{ a}\OperatorTok{[}\NormalTok{l}\OperatorTok{];} \ControlFlowTok{return}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{l }\OperatorTok{+}\NormalTok{ r}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ build}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}
\NormalTok{ build}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{,}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ r}\OperatorTok{);}
\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{mx }\OperatorTok{=}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{ans }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{tree}\OperatorTok{[}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{].}\NormalTok{mx}\OperatorTok{,}\NormalTok{ tree}\OperatorTok{[}\NormalTok{k }\OperatorTok{\textless{}\textless{}} \DecValTok{1} \OperatorTok{|} \DecValTok{1}\OperatorTok{].}\NormalTok{mx}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()}
\OperatorTok{\{}
\NormalTok{ read}\OperatorTok{(}\NormalTok{n}\OperatorTok{);}\NormalTok{ read}\OperatorTok{(}\NormalTok{q}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)}\NormalTok{ read}\OperatorTok{(}\NormalTok{a}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\NormalTok{ build}\OperatorTok{(}\DecValTok{1}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{);}
\ControlFlowTok{while} \OperatorTok{(}\NormalTok{q}\OperatorTok{{-}{-})}
\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ op}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{;}
\NormalTok{ read}\OperatorTok{(}\NormalTok{op}\OperatorTok{);}\NormalTok{ read}\OperatorTok{(}\NormalTok{l}\OperatorTok{);}\NormalTok{ read}\OperatorTok{(}\NormalTok{r}\OperatorTok{);}\NormalTok{ read}\OperatorTok{(}\NormalTok{x}\OperatorTok{);}
\ControlFlowTok{if} \OperatorTok{(}\NormalTok{op }\OperatorTok{==} \DecValTok{0}\OperatorTok{)}\NormalTok{ mdy1}\OperatorTok{(}\DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{);}
\ControlFlowTok{else} \ControlFlowTok{if} \OperatorTok{(}\NormalTok{op }\OperatorTok{==} \DecValTok{1}\OperatorTok{)}\NormalTok{ mdy2}\OperatorTok{(}\DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{);}
\ControlFlowTok{else} \ControlFlowTok{if} \OperatorTok{(}\NormalTok{op }\OperatorTok{==} \DecValTok{2}\OperatorTok{)}\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ qry}\OperatorTok{(}\DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{));}
\ControlFlowTok{else}\NormalTok{ mdy3}\OperatorTok{(}\DecValTok{1}\OperatorTok{,}\NormalTok{ l}\OperatorTok{,}\NormalTok{ r}\OperatorTok{,}\NormalTok{ x}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{);}
\OperatorTok{\}}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\paragraph{浮点数运算控制精度}\label{ux6d6eux70b9ux6570ux8fd0ux7b97ux63a7ux5236ux7cbeux5ea6}
直接全部转化成浮点数运算,三标记线段树。
考虑到浮点数自带精度损失,对于较大的除数,自动使得原数变成零,\texttt{long\ double}
的精度可以支持。
爆零小技巧:\texttt{ST}表空间开一倍
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{int}\NormalTok{ ST}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\NormalTok{LOG }\OperatorTok{+} \DecValTok{3}\OperatorTok{],}\NormalTok{ Log}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ init\_query}\OperatorTok{()\{}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ ST}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\DecValTok{0}\OperatorTok{]} \OperatorTok{=}\NormalTok{ A}\OperatorTok{[}\NormalTok{i}\OperatorTok{];}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ LOG}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ ST}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{ST}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{],}\NormalTok{ ST}\OperatorTok{[}\NormalTok{i }\OperatorTok{+} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}} \OperatorTok{(}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{))][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]);} \CommentTok{// ST[i + (1 \textless{}\textless{} (j {-} 1))][j {-} 1] 会访问 O( 2 * N )}
\NormalTok{ Log}\OperatorTok{[}\DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{2}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Log}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ Log}\OperatorTok{[}\NormalTok{i }\OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{]} \OperatorTok{+} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\begin{Shaded}
\begin{Highlighting}[]
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{2e5} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ q}\OperatorTok{;}\NormalTok{ LL A}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\KeywordTok{namespace}\NormalTok{ Acceptable\_Solution}\OperatorTok{\{}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{2e5} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ LOG }\OperatorTok{=} \DecValTok{17}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ ST}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\NormalTok{LOG }\OperatorTok{+} \DecValTok{3}\OperatorTok{],}\NormalTok{ Log}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ init\_query}\OperatorTok{()\{}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ ST}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\DecValTok{0}\OperatorTok{]} \OperatorTok{=}\NormalTok{ A}\OperatorTok{[}\NormalTok{i}\OperatorTok{];}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ LOG}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ ST}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{ST}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{],}\NormalTok{ ST}\OperatorTok{[}\NormalTok{i }\OperatorTok{+} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}} \OperatorTok{(}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{))][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]);}
\NormalTok{ Log}\OperatorTok{[}\DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{2}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Log}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ Log}\OperatorTok{[}\NormalTok{i }\OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{]} \OperatorTok{+} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ Query\_Max}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\{} \DataTypeTok{int}\NormalTok{ Lg }\OperatorTok{=}\NormalTok{ Log}\OperatorTok{[}\NormalTok{R }\OperatorTok{{-}}\NormalTok{ L }\OperatorTok{+} \DecValTok{1}\OperatorTok{];} \DataTypeTok{int}\NormalTok{ Len }\OperatorTok{=} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ Lg}\OperatorTok{);} \ControlFlowTok{return}\NormalTok{ max}\OperatorTok{(}\NormalTok{ST}\OperatorTok{[}\NormalTok{L}\OperatorTok{][}\NormalTok{Lg}\OperatorTok{],}\NormalTok{ ST}\OperatorTok{[}\NormalTok{R }\OperatorTok{{-}}\NormalTok{ Len }\OperatorTok{+} \DecValTok{1}\OperatorTok{][}\NormalTok{Lg}\OperatorTok{]);} \OperatorTok{\}}
\PreprocessorTok{\#define LB }\DataTypeTok{long}\PreprocessorTok{ }\DataTypeTok{double}\PreprocessorTok{ }
\NormalTok{ LB eps}\OperatorTok{;}
\DataTypeTok{void}\NormalTok{ print}\OperatorTok{(}\NormalTok{LB x}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%.20Lf\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ x}\OperatorTok{);} \OperatorTok{\}}
\KeywordTok{namespace}\NormalTok{ SegmentTree}\OperatorTok{\{}
\DataTypeTok{bool}\NormalTok{ same}\OperatorTok{(}\NormalTok{LB x}\OperatorTok{,}\NormalTok{ LB y}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return}\NormalTok{ fabs}\OperatorTok{(}\NormalTok{x }\OperatorTok{{-}}\NormalTok{ y}\OperatorTok{)} \OperatorTok{\textless{}=} \FloatTok{1e{-}12}\OperatorTok{;} \OperatorTok{\}}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{6e5} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ ch}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\DecValTok{2}\OperatorTok{],}\NormalTok{ tot }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ LB v}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ tag\_mul}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{bool}\NormalTok{ tag\_ret}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\PreprocessorTok{\#define ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{ch}\OperatorTok{[}\NormalTok{o}\OperatorTok{][}\DecValTok{0}\OperatorTok{])}
\PreprocessorTok{\#define rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{ch}\OperatorTok{[}\NormalTok{o}\OperatorTok{][}\DecValTok{1}\OperatorTok{])}
\PreprocessorTok{\#define maintain}\OperatorTok{(}\NormalTok{o}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{max}\OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)],}\PreprocessorTok{ }\NormalTok{v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)]))}
\PreprocessorTok{\#define make }\OperatorTok{(}\NormalTok{tot}\OperatorTok{++,}\PreprocessorTok{ }\NormalTok{ch}\OperatorTok{[}\NormalTok{tot}\OperatorTok{][}\DecValTok{0}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{ch}\OperatorTok{[}\NormalTok{tot}\OperatorTok{][}\DecValTok{1}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\DecValTok{0}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{tag\_add}\OperatorTok{[}\NormalTok{tot}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\DecValTok{0}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{tag\_mul}\OperatorTok{[}\NormalTok{tot}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\DecValTok{1}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{tag\_ret}\OperatorTok{[}\NormalTok{tot}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\DecValTok{0}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{tot}\OperatorTok{)}
\DataTypeTok{int}\NormalTok{ Groot}\OperatorTok{()\{} \ControlFlowTok{return}\NormalTok{ make}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ build}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{==}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return} \OperatorTok{(}\DataTypeTok{void}\OperatorTok{)(}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{=}\NormalTok{ A}\OperatorTok{[}\NormalTok{L}\OperatorTok{]);}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{L }\OperatorTok{+}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}\NormalTok{ ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)} \OperatorTok{=}\NormalTok{ make}\OperatorTok{;}\NormalTok{ rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)} \OperatorTok{=}\NormalTok{ make}\OperatorTok{;}
\NormalTok{ build}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}\NormalTok{ build}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ maintain}\OperatorTok{(}\NormalTok{o}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ tar\_ret}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{=}\NormalTok{ Query\_Max}\OperatorTok{(}\NormalTok{L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ tag\_mul}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ tag\_ret}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ push\_ret}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{tag\_ret}\OperatorTok{[}\NormalTok{o}\OperatorTok{])} \ControlFlowTok{return} \OperatorTok{;}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{L }\OperatorTok{+}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ tar\_ret}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}\NormalTok{ tar\_ret}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ tag\_ret}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ tar\_add}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,}\NormalTok{ LB Val}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\NormalTok{ push\_ret}\OperatorTok{(}\NormalTok{o}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{+=}\NormalTok{ Val}\OperatorTok{;}
\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{+=}\NormalTok{ Val}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ tar\_mul}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,}\NormalTok{ LB Val}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ push\_ret}\OperatorTok{(}\NormalTok{o}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{*=}\NormalTok{ Val}\OperatorTok{;}
\NormalTok{ tag\_mul}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{*=}\NormalTok{ Val}\OperatorTok{;}
\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{*=}\NormalTok{ Val}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ push}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\NormalTok{ push\_ret}\OperatorTok{(}\NormalTok{o}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{L }\OperatorTok{+}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{same}\OperatorTok{(}\NormalTok{tag\_mul}\OperatorTok{[}\NormalTok{o}\OperatorTok{],} \DecValTok{1}\OperatorTok{))} \OperatorTok{\{}
\NormalTok{ tar\_mul}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ tag\_mul}\OperatorTok{[}\NormalTok{o}\OperatorTok{],}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}
\NormalTok{ tar\_mul}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ tag\_mul}\OperatorTok{[}\NormalTok{o}\OperatorTok{],}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ tag\_mul}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{same}\OperatorTok{(}\NormalTok{tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{],} \DecValTok{0}\OperatorTok{))\{}
\NormalTok{ tar\_add}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{],}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}
\NormalTok{ tar\_add}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{],}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ update\_add}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowl}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowr}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ Val}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ nowl }\OperatorTok{\&\&}\NormalTok{ nowr }\OperatorTok{\textless{}=}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ tar\_add}\OperatorTok{(}\NormalTok{o}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{,}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{nowl }\OperatorTok{+}\NormalTok{ nowr}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ push}\OperatorTok{(}\NormalTok{o}\OperatorTok{,}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update\_add}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{R }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update\_add}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{);}
\NormalTok{ maintain}\OperatorTok{(}\NormalTok{o}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ update\_mul}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowl}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowr}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{,}\NormalTok{ LB Val}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ nowl }\OperatorTok{\&\&}\NormalTok{ nowr }\OperatorTok{\textless{}=}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ tar\_mul}\OperatorTok{(}\NormalTok{o}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{,}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{nowl }\OperatorTok{+}\NormalTok{ nowr}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ push}\OperatorTok{(}\NormalTok{o}\OperatorTok{,}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update\_mul}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{R }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update\_mul}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{);}
\NormalTok{ maintain}\OperatorTok{(}\NormalTok{o}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ update\_ret}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowl}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowr}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ nowl }\OperatorTok{\&\&}\NormalTok{ nowr }\OperatorTok{\textless{}=}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ tar\_ret}\OperatorTok{(}\NormalTok{o}\OperatorTok{,}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{nowl }\OperatorTok{+}\NormalTok{ nowr}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ push}\OperatorTok{(}\NormalTok{o}\OperatorTok{,}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update\_ret}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{R }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update\_ret}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ maintain}\OperatorTok{(}\NormalTok{o}\OperatorTok{);}
\OperatorTok{\}}
\NormalTok{ LB query}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowl}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowr}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ nowl }\OperatorTok{\&\&}\NormalTok{ nowr }\OperatorTok{\textless{}=}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{nowl }\OperatorTok{+}\NormalTok{ nowr}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ push}\OperatorTok{(}\NormalTok{o}\OperatorTok{,}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{);}
\NormalTok{ LB ans }\OperatorTok{=}\NormalTok{ LLONG\_MIN}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{ans}\OperatorTok{,}\NormalTok{ query}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{));}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{R }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{ans}\OperatorTok{,}\NormalTok{ query}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{));}
\ControlFlowTok{return}\NormalTok{ ans}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}\KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{build}\OperatorTok{;} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{query}\OperatorTok{;} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{update\_add}\OperatorTok{;}
\KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{update\_mul}\OperatorTok{;} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{update\_ret}\OperatorTok{;} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{Groot}\OperatorTok{;}
\DataTypeTok{void}\NormalTok{ work}\OperatorTok{()\{}
\NormalTok{ init\_query}\OperatorTok{();}
\DataTypeTok{int}\NormalTok{ root }\OperatorTok{=}\NormalTok{ Groot}\OperatorTok{();}\NormalTok{ build}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{);}\NormalTok{ LB one }\OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{q}\OperatorTok{{-}{-})} \OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ t}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ x}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{t}\OperatorTok{)(}\NormalTok{L}\OperatorTok{)(}\NormalTok{R}\OperatorTok{)(}\NormalTok{x}\OperatorTok{);}\NormalTok{ L }\OperatorTok{++,}\NormalTok{ R }\OperatorTok{++;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{t }\OperatorTok{==} \DecValTok{0}\OperatorTok{)}\NormalTok{ update\_add}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ x}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{t }\OperatorTok{==} \DecValTok{1}\OperatorTok{)}\NormalTok{ update\_mul}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ one }\OperatorTok{/}\NormalTok{ x}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{t }\OperatorTok{==} \DecValTok{2}\OperatorTok{)}\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld\textbackslash{}n}\StringTok{"}\OperatorTok{,} \OperatorTok{(}\DataTypeTok{long} \DataTypeTok{long}\OperatorTok{)(}\NormalTok{query}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{)} \OperatorTok{+} \FloatTok{1e{-}10}\OperatorTok{));}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{t }\OperatorTok{==} \DecValTok{3}\OperatorTok{)}\NormalTok{ update\_ret}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\OperatorTok{\}}
\OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{} \CommentTok{//freopen("in.txt", "r", stdin);}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{q}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Read}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\NormalTok{ Acceptable\_Solution}\OperatorTok{::}\NormalTok{work}\OperatorTok{();}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{D. four}\label{d.-four}
你有 \(1..2n\) 共 \(2n\) 个数,有 \(n\)
个人,你会给每个人分两个随机的数,这样就把 \(2n\)
个数分完了,每个人获得的总数就是这两个数相加。这个随机过程可以认为是,先把
\(2n\)
个数随机排列,将前2个数分给第一个人,将接下来前2个数分给第二个人……不难看出这个过程是没有歧义的
你想知道有多大概率,使得总和最大的人唯一(不存在两个相同的最大值),答案模
\(998244353\)
没听懂…。
\subsection{Round 3}\label{round-3}
\subsubsection{A. diyiti}\label{a.-diyiti}
有 \(n\) 个物品,每个物品价格 \(A_i\) ,收益为 \(B_i\)
,由于一些奥妙重重的原因,当你买了一些物品,总价格为选择的 \(A_i\)
的按位或而不是代数相加!
你身上只有 \(k\) 元钱,你希望选择总价格不超过 \(k\)
的一些物品,来获得最大的收益。
对于所有数据,\(1\leq n\leq 10^5,0\leq k < 2^{30},0 \leq A_i < 2^{30},0 \leq B_i \leq 10^9\)。
一种天然的想法就是考虑枚举,每一个 \(i \le k\)
然后累加所有可以被选的物品求最大值,显然能保证正确性。得到一个
\(\mathcal{O}(k n)\) 的优秀做法。 发现这样枚举的每一个 \(i\)
有很多没有必要的枚举。
其实可以枚举放弃 \(k\) 的哪一位 \texttt{1}。
例如: 若 \(k = (1001101001)_2\) 那么有意义的 \(i\) 就可能是: -
\((0111111111)_2\) - \((1000111111)_2\) - \((1001011111)_2\) -
\((1001100111)_2\) - \((1001101001)_2\)
也就是枚举某一位 \(1\) 把这个 \(1\) 变成
\(0\),然后把这后面的所有数字变成 \(1\)。
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ k}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ Lim}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ Pr}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\NormalTok{LL calc}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ x}\OperatorTok{)\{}
\NormalTok{ LL ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \ControlFlowTok{if}\OperatorTok{((}\NormalTok{x }\OperatorTok{|}\NormalTok{ Lim}\OperatorTok{[}\NormalTok{i}\OperatorTok{])} \OperatorTok{==}\NormalTok{ x}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{+=}\NormalTok{ Pr}\OperatorTok{[}\NormalTok{i}\OperatorTok{];}
\ControlFlowTok{return}\NormalTok{ ans}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{k}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Read}\OperatorTok{(}\NormalTok{Lim}\OperatorTok{[}\NormalTok{i}\OperatorTok{])(}\NormalTok{Pr}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\NormalTok{ LL ans }\OperatorTok{=}\NormalTok{ calc}\OperatorTok{(}\NormalTok{k}\OperatorTok{);}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=} \DecValTok{30}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textgreater{}=} \DecValTok{0}\OperatorTok{;}\NormalTok{ i}\OperatorTok{{-}{-})\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{k }\OperatorTok{\&} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ i}\OperatorTok{))} \OperatorTok{;} \ControlFlowTok{else} \ControlFlowTok{continue}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ Lit }\OperatorTok{=}\NormalTok{ k}\OperatorTok{;}
\NormalTok{ Lit }\OperatorTok{\^{}=} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ i}\OperatorTok{);}\NormalTok{ Lit }\OperatorTok{|=} \OperatorTok{((}\DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ i}\OperatorTok{)} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{);}
\NormalTok{ ans }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{calc}\OperatorTok{(}\NormalTok{Lit}\OperatorTok{),}\NormalTok{ ans}\OperatorTok{);}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{);}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{B. dierti}\label{b.-dierti}
给你一个长度为 \(n\) 的数组 \(a_n\),你需要求出一个最长的子序列
\(C\),使得其相邻两项按位与的结果均非零
\(( \forall\ i,\ C_i\ \And \ C_{i+1} > 0)\)。
这比第一题好想多了吧。 考虑 \(dp[n]\) 表示 \([1, n]\) 中强制 \(n\)
一定选 符合要求的最长子序列,可以考虑枚举 \([1..n - 1]\)
中上一个选择的是哪一个,即
\(dp[n] = 1 + \max_{i = 1}^{n - 1}\limits{dp[i][C_i \And C_n > 0]}\)
这样的复杂度是 \(\mathcal{O}(n^2)\) 的。
考虑如果满足 \(C_i \And C_j > 0\) 那么需要 \(C_i, C_j\)
至少一个二进制位置相同。那就维护一个数组,\(Bmax[i]\) 表示 \(C\) 的第
\(i\) 位为 \(1\) 的所有 \(C_j\) 最大的 \(dp[j]\),即可实现
\(\mathcal{O}(\log C_{max})\) 转移。同时需要
\(\mathcal{O}(\log C_{max})\) 维护数组 \(Bmax\)。
总复杂度 \(\mathcal{O}(n\log C_{max} )\)。
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ A}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ Bmax}\OperatorTok{[}\DecValTok{60}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ dp}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ n }\OperatorTok{=}\NormalTok{ read}\OperatorTok{();}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Read}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\NormalTok{ dp}\OperatorTok{[}\DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \DecValTok{30}\OperatorTok{)} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\DecValTok{1}\OperatorTok{]} \OperatorTok{\&} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ j}\OperatorTok{))}\NormalTok{ Bmax}\OperatorTok{[}\NormalTok{j}\OperatorTok{]} \OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{Bmax}\OperatorTok{[}\NormalTok{j}\OperatorTok{],}\NormalTok{ dp}\OperatorTok{[}\DecValTok{1}\OperatorTok{]);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{2}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \DecValTok{30}\OperatorTok{)} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{\&} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ j}\OperatorTok{))}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{ans}\OperatorTok{,}\NormalTok{ Bmax}\OperatorTok{[}\NormalTok{j}\OperatorTok{]);}
\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ ans }\OperatorTok{+} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \DecValTok{30}\OperatorTok{)} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{\&} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ j}\OperatorTok{))}\NormalTok{ Bmax}\OperatorTok{[}\NormalTok{j}\OperatorTok{]} \OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{Bmax}\OperatorTok{[}\NormalTok{j}\OperatorTok{],}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{ans}\OperatorTok{,}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{);}\NormalTok{ cerr }\OperatorTok{\textless{}\textless{}} \StringTok{"std\textquotesingle{}s ans = "} \OperatorTok{\textless{}\textless{}}\NormalTok{ ans }\OperatorTok{\textless{}\textless{}}\NormalTok{ endl}\OperatorTok{;}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{C. disanti}\label{c.-disanti}
\paragraph{statement}\label{statement}
你有 \(n\) 个 \(10\) 进制下的位数为 \(m\) 的数
有些数字被抹去了,因此取值任意。
你希望这 \(n\) 个数单调递增,请求出所有满足这个条件的方案下,这 \(n\)
个数之和的总和。
答案对 \(998244353\) 取模。
\(n,m\leq 30\) \#\#\#\# input
第一行两个整数 \(n,m(1\leq n,m\leq 50)\)
接下来 \(n\) 行,每行 \(m\) 个字符,字符为 \(0..9\)
的数字或者\texttt{?}。
\begin{verbatim}
INPUT0:
4 1
0
?
4
8
OUTPUT0:
42
\end{verbatim}
\begin{verbatim}
INPUT1:
5 5
?1234
23333
???66
??666
?233?
OUTPUT1:
819525655
\end{verbatim}
没听懂… 待补。
\subsubsection{D. disiti}\label{d.-disiti}
你有一堆\(n\)个石子的石子堆,你想要把石子堆裂成\(n\)个大小为\(1\)的石子堆。为了达成这个目的,你每次可以进行如下操作:假设现在有\(k\)堆石子,大小分别为\(a_1, a_2, ... ,a_k\),你可以指定一个非负整数序列\(b_1, b_2, ... ,b_k\),满足\(\sum b_i\leq m\),每堆石子就会分裂成两堆\(b_i, a_i-b_i\)(如果为\(0\)就认为不存在,显然还需要满足\(b_i \leq a_i\))。你想要知道最少几次操作可以达成目的。
对于所有数据,\(T\leq 1000,1\leq m\leq n\leq 10^9\)
没听懂… 待补。
\subsection{Round 4}\label{round-4}
\subsubsection{A. 一}\label{a.-ux4e00}
你是能看到第一题的friends呢。 ——hja
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
现在我们要执行若干代码,代码为对于变量的操作,包含以下三种: -
1、变量名=变量值,变量名由小写字母组成,变量值有可能是正整数或者字符串(小写字母或者数字),例如:a=3,b=“233”。
- 2、变量名,代表询问该变量的值,如果该变量未赋值,则输出no。 -
3、变量名+=值,如果该变量未定义,直接跳过该次操作。设该变量的值为x,加上的值为y,如果两者均为整数直接相加;如果x是整数y为字符串则跳过此次操作;如果x是字符串y是整数则将y转换为字符串进行字符串拼接;如果两者均为字符串直接进行字符串拼接。
-
全程 STL。
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{map}\OperatorTok{\textless{}}\NormalTok{string }\OperatorTok{,}\NormalTok{ string}\OperatorTok{\textgreater{}}\NormalTok{ M}\OperatorTok{;}
\NormalTok{map}\OperatorTok{\textless{}}\NormalTok{string }\OperatorTok{,} \DataTypeTok{bool} \OperatorTok{\textgreater{}}\NormalTok{ Type}\OperatorTok{;} \CommentTok{// true for string , false for int}
\NormalTok{string tmp}\OperatorTok{;}
\NormalTok{pair}\OperatorTok{\textless{}}\NormalTok{string }\OperatorTok{,}\NormalTok{ string}\OperatorTok{\textgreater{}}\NormalTok{ Res}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ split}\OperatorTok{(}\NormalTok{string S}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{S}\OperatorTok{.}\NormalTok{find}\OperatorTok{(}\CharTok{\textquotesingle{}=\textquotesingle{}}\OperatorTok{)} \OperatorTok{\textgreater{}=}\NormalTok{ S}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{||}\NormalTok{ S}\OperatorTok{.}\NormalTok{find}\OperatorTok{(}\CharTok{\textquotesingle{}=\textquotesingle{}}\OperatorTok{)} \OperatorTok{\textless{}} \DecValTok{0}\OperatorTok{)\{} \CommentTok{// }\AlertTok{TODO}\CommentTok{: check}
\ControlFlowTok{return} \DecValTok{2}\OperatorTok{;}
\OperatorTok{\}} \ControlFlowTok{else} \OperatorTok{\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{S}\OperatorTok{.}\NormalTok{find}\OperatorTok{(}\CharTok{\textquotesingle{}+\textquotesingle{}}\OperatorTok{)} \OperatorTok{\textless{}}\NormalTok{ S}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{\&\&}\NormalTok{ S}\OperatorTok{.}\NormalTok{find}\OperatorTok{(}\CharTok{\textquotesingle{}+\textquotesingle{}}\OperatorTok{)} \OperatorTok{\textgreater{}=} \DecValTok{0}\OperatorTok{)\{}
\NormalTok{ Res }\OperatorTok{=}\NormalTok{ make\_pair}\OperatorTok{(}\NormalTok{S}\OperatorTok{.}\NormalTok{substr}\OperatorTok{(}\DecValTok{0}\OperatorTok{,}\NormalTok{ S}\OperatorTok{.}\NormalTok{find}\OperatorTok{(}\CharTok{\textquotesingle{}+\textquotesingle{}}\OperatorTok{)),}\NormalTok{ S}\OperatorTok{.}\NormalTok{substr}\OperatorTok{(}\NormalTok{S}\OperatorTok{.}\NormalTok{find}\OperatorTok{(}\CharTok{\textquotesingle{}=\textquotesingle{}}\OperatorTok{)} \OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ S}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}}\NormalTok{ S}\OperatorTok{.}\NormalTok{find}\OperatorTok{(}\CharTok{\textquotesingle{}=\textquotesingle{}}\OperatorTok{)} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{));}
\ControlFlowTok{return} \DecValTok{3}\OperatorTok{;}
\OperatorTok{\}} \ControlFlowTok{else} \OperatorTok{\{}
\NormalTok{ Res }\OperatorTok{=}\NormalTok{ make\_pair}\OperatorTok{(}\NormalTok{S}\OperatorTok{.}\NormalTok{substr}\OperatorTok{(}\DecValTok{0}\OperatorTok{,}\NormalTok{ S}\OperatorTok{.}\NormalTok{find}\OperatorTok{(}\CharTok{\textquotesingle{}=\textquotesingle{}}\OperatorTok{)),}\NormalTok{ S}\OperatorTok{.}\NormalTok{substr}\OperatorTok{(}\NormalTok{S}\OperatorTok{.}\NormalTok{find}\OperatorTok{(}\CharTok{\textquotesingle{}=\textquotesingle{}}\OperatorTok{)} \OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ S}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}}\NormalTok{ S}\OperatorTok{.}\NormalTok{find}\OperatorTok{(}\CharTok{\textquotesingle{}=\textquotesingle{}}\OperatorTok{)} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{));}
\ControlFlowTok{return} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}
\OperatorTok{\}}
\NormalTok{string calc}\OperatorTok{(}\NormalTok{string A}\OperatorTok{,}\NormalTok{ string B}\OperatorTok{)\{}
\DataTypeTok{long} \DataTypeTok{long}\NormalTok{ ResA }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ A}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{)\{}
\NormalTok{ ResA }\OperatorTok{*=} \DecValTok{10}\OperatorTok{;}
\NormalTok{ ResA }\OperatorTok{+=}\NormalTok{ A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{{-}} \CharTok{\textquotesingle{}0\textquotesingle{}}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{long} \DataTypeTok{long}\NormalTok{ ResB }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ B}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{)\{}
\NormalTok{ ResB }\OperatorTok{*=} \DecValTok{10}\OperatorTok{;}
\NormalTok{ ResB }\OperatorTok{+=}\NormalTok{ B}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{{-}} \CharTok{\textquotesingle{}0\textquotesingle{}}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ ResA }\OperatorTok{+=}\NormalTok{ ResB}\OperatorTok{;}
\NormalTok{ string Res}\OperatorTok{,}\NormalTok{ ans }\OperatorTok{;}\NormalTok{ Res }\OperatorTok{=} \StringTok{""}\OperatorTok{;}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{ResA}\OperatorTok{)}\NormalTok{ Res}\OperatorTok{.}\NormalTok{push\_back}\OperatorTok{(}\NormalTok{ResA }\OperatorTok{\%} \DecValTok{10} \OperatorTok{+} \CharTok{\textquotesingle{}0\textquotesingle{}}\OperatorTok{),}\NormalTok{ ResA }\OperatorTok{/=} \DecValTok{10}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ Res}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textgreater{}=} \DecValTok{0}\OperatorTok{;}\NormalTok{ i}\OperatorTok{{-}{-})}\NormalTok{ ans}\OperatorTok{.}\NormalTok{push\_back}\OperatorTok{(}\NormalTok{Res}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\ControlFlowTok{return}\NormalTok{ ans}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{bool}\NormalTok{ pdType}\OperatorTok{(}\NormalTok{string }\OperatorTok{\&}\NormalTok{S}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return}\NormalTok{ S}\OperatorTok{[}\DecValTok{0}\OperatorTok{]} \OperatorTok{==} \CharTok{\textquotesingle{}"\textquotesingle{}}\OperatorTok{;} \OperatorTok{\}} \CommentTok{// true for string}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{} \CommentTok{//freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout);}
\NormalTok{ ios}\OperatorTok{::}\NormalTok{sync\_with\_stdio}\OperatorTok{(}\KeywordTok{false}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ q}\OperatorTok{;}\NormalTok{ cin }\OperatorTok{\textgreater{}\textgreater{}}\NormalTok{ q}\OperatorTok{;}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{q}\OperatorTok{{-}{-})\{}
\NormalTok{ cin }\OperatorTok{\textgreater{}\textgreater{}}\NormalTok{ tmp}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ r }\OperatorTok{=}\NormalTok{ split}\OperatorTok{(}\NormalTok{tmp}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{r }\OperatorTok{==} \DecValTok{1}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ re }\OperatorTok{=}\NormalTok{ pdType}\OperatorTok{(}\NormalTok{Res}\OperatorTok{.}\NormalTok{second}\OperatorTok{);} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{re}\OperatorTok{)}\NormalTok{ Res}\OperatorTok{.}\NormalTok{second }\OperatorTok{=} \OperatorTok{(}\NormalTok{Res}\OperatorTok{.}\NormalTok{second}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{==} \DecValTok{2} \OperatorTok{?}\NormalTok{ string}\OperatorTok{(}\StringTok{""}\OperatorTok{)} \OperatorTok{:}\NormalTok{ Res}\OperatorTok{.}\NormalTok{second}\OperatorTok{.}\NormalTok{substr}\OperatorTok{(}\DecValTok{1}\OperatorTok{,}\NormalTok{ Res}\OperatorTok{.}\NormalTok{second}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{2}\OperatorTok{));}
\NormalTok{ M}\OperatorTok{[}\NormalTok{Res}\OperatorTok{.}\NormalTok{first}\OperatorTok{]} \OperatorTok{=}\NormalTok{ Res}\OperatorTok{.}\NormalTok{second}\OperatorTok{;}
\NormalTok{ Type}\OperatorTok{[}\NormalTok{Res}\OperatorTok{.}\NormalTok{first}\OperatorTok{]} \OperatorTok{=}\NormalTok{ re}\OperatorTok{;}
\OperatorTok{\}} \ControlFlowTok{else} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{r }\OperatorTok{==} \DecValTok{2}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{M}\OperatorTok{.}\NormalTok{count}\OperatorTok{(}\NormalTok{tmp}\OperatorTok{))}\NormalTok{ cout }\OperatorTok{\textless{}\textless{}}\NormalTok{ M}\OperatorTok{[}\NormalTok{tmp}\OperatorTok{]} \OperatorTok{\textless{}\textless{}}\NormalTok{ endl}\OperatorTok{;}
\ControlFlowTok{else}\NormalTok{ cout }\OperatorTok{\textless{}\textless{}} \StringTok{"no"} \OperatorTok{\textless{}\textless{}}\NormalTok{ endl}\OperatorTok{;}
\OperatorTok{\}} \ControlFlowTok{else} \OperatorTok{\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{M}\OperatorTok{.}\NormalTok{count}\OperatorTok{(}\NormalTok{Res}\OperatorTok{.}\NormalTok{first}\OperatorTok{))} \OperatorTok{;} \ControlFlowTok{else} \ControlFlowTok{continue}\OperatorTok{;}
\DataTypeTok{int} \DataTypeTok{ex\_t} \OperatorTok{=}\NormalTok{ pdType}\OperatorTok{(}\NormalTok{Res}\OperatorTok{.}\NormalTok{second}\OperatorTok{);} \ControlFlowTok{if}\OperatorTok{(}\DataTypeTok{ex\_t}\OperatorTok{)}\NormalTok{ Res}\OperatorTok{.}\NormalTok{second }\OperatorTok{=}\NormalTok{ Res}\OperatorTok{.}\NormalTok{second}\OperatorTok{.}\NormalTok{substr}\OperatorTok{(}\DecValTok{1}\OperatorTok{,}\NormalTok{ Res}\OperatorTok{.}\NormalTok{second}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{2}\OperatorTok{);}
\DataTypeTok{int} \DataTypeTok{no\_t} \OperatorTok{=}\NormalTok{ Type}\OperatorTok{[}\NormalTok{Res}\OperatorTok{.}\NormalTok{first}\OperatorTok{];}
\ControlFlowTok{if}\OperatorTok{(} \DataTypeTok{ex\_t} \OperatorTok{\&\&} \DataTypeTok{no\_t}\OperatorTok{)}\NormalTok{ M}\OperatorTok{[}\NormalTok{Res}\OperatorTok{.}\NormalTok{first}\OperatorTok{]} \OperatorTok{=}\NormalTok{ M}\OperatorTok{[}\NormalTok{Res}\OperatorTok{.}\NormalTok{first}\OperatorTok{]} \OperatorTok{+}\NormalTok{ Res}\OperatorTok{.}\NormalTok{second}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(} \DataTypeTok{ex\_t} \OperatorTok{\&\&} \OperatorTok{!}\DataTypeTok{no\_t}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{continue}\OperatorTok{;} \OperatorTok{\}}
\ControlFlowTok{if}\OperatorTok{(!}\DataTypeTok{ex\_t} \OperatorTok{\&\&} \DataTypeTok{no\_t}\OperatorTok{)}\NormalTok{ M}\OperatorTok{[}\NormalTok{Res}\OperatorTok{.}\NormalTok{first}\OperatorTok{]} \OperatorTok{=}\NormalTok{ M}\OperatorTok{[}\NormalTok{Res}\OperatorTok{.}\NormalTok{first}\OperatorTok{]} \OperatorTok{+}\NormalTok{ Res}\OperatorTok{.}\NormalTok{second}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(!}\DataTypeTok{ex\_t} \OperatorTok{\&\&} \OperatorTok{!}\DataTypeTok{no\_t}\OperatorTok{)}\NormalTok{ M}\OperatorTok{[}\NormalTok{Res}\OperatorTok{.}\NormalTok{first}\OperatorTok{]} \OperatorTok{=}\NormalTok{ calc}\OperatorTok{(}\NormalTok{M}\OperatorTok{[}\NormalTok{Res}\OperatorTok{.}\NormalTok{first}\OperatorTok{],}\NormalTok{ Res}\OperatorTok{.}\NormalTok{second}\OperatorTok{);}
\OperatorTok{\}}
\OperatorTok{\}}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{B. 二}\label{b.-ux4e8c}
你是能看到第二题的friends呢。 ——aoao
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
\(N\) 个小写字母字符串, Alice 和 Bob 按照如下方法玩游戏: -
1、Alice选择一个字符串,并重新定义 \(26\)
个字母的字典序,然后再将这个字符串内部字符按照任意顺序重排。 -
2、Bob从剩下的字符串中选择一个,并将这个字符串内部字符按照任意顺序重排。
他们的目标是使得自己字符串的字典序比对面小,谁的字符串字典序更小谁就赢了。问
Alice 有多少个可以选择的字符串能够使得自己获胜? \(N \le 1000\)
因为可以重新排列字符串,所以对于每个字符串来说,有用的信息就是每个字符串中每个字符的出现次数。
可以考虑先枚举一个字符串,然后判断这个字符串是否能被 Alice
选。然后考虑确定字典序,可以以此考虑字典序最小的应该是哪个字符,确定了字典序最小的字符之后,可以排除掉一些字符串(字典序最小的字符在这些串中的出现次数
\(<\) 在枚举串中的出现次数),然后又转化成原来相同的问题。
关键在于如何确定当前情况下字典序最小的字符。显然,理想的字典序最小的字符
在当前枚举到的字符串中的出现次数一定不少于在其他串中的出现次数。但是这样的字符可能有多个,应该选哪个?
其实选哪个效果一样,本质上只是以此选择当前情况下字典序最小的字符,然后剔除一些字符串,但是剔除字符串的条件和剔除顺序无关。
最后判断是否所有字符串都被剔除掉即可。
\begin{Shaded}
\begin{Highlighting}[]
\PreprocessorTok{\#include }\ImportTok{\textless{}cstdio\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}cstring\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}iostream\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}cmath\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}cstring\textgreater{}}
\PreprocessorTok{\#include }\ImportTok{\textless{}algorithm\textgreater{}}
\PreprocessorTok{\#define rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{l}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{r}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{l}\OperatorTok{),}\PreprocessorTok{ }\NormalTok{\_\_}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{r}\OperatorTok{);}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{\textless{}=}\PreprocessorTok{ }\NormalTok{\_\_}\OperatorTok{;}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{++)}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \DecValTok{1010}\OperatorTok{;}
\KeywordTok{using} \KeywordTok{namespace}\NormalTok{ std}\OperatorTok{;}
\KeywordTok{inline} \DataTypeTok{int}\NormalTok{ idx}\OperatorTok{(}\DataTypeTok{char}\NormalTok{ c}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return}\NormalTok{ c }\OperatorTok{{-}} \CharTok{\textquotesingle{}a\textquotesingle{}} \OperatorTok{+} \DecValTok{1}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ ch}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\DecValTok{30}\OperatorTok{];} \DataTypeTok{int}\NormalTok{ n}\OperatorTok{;}
\DataTypeTok{char}\NormalTok{ S}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{bool}\NormalTok{ book}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{bool}\NormalTok{ bch}\OperatorTok{[}\DecValTok{200}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ scanf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,} \OperatorTok{\&}\NormalTok{n}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ scanf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%s}\StringTok{"}\OperatorTok{,}\NormalTok{ S }\OperatorTok{+} \DecValTok{1}\OperatorTok{);} \DataTypeTok{int}\NormalTok{ k }\OperatorTok{=}\NormalTok{ strlen}\OperatorTok{(}\NormalTok{S }\OperatorTok{+} \DecValTok{1}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ k}\OperatorTok{)}\NormalTok{ ch}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{idx}\OperatorTok{(}\NormalTok{S}\OperatorTok{[}\NormalTok{j}\OperatorTok{])]} \OperatorTok{++;} \OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{}
\NormalTok{ memset}\OperatorTok{(}\NormalTok{book}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{book}\OperatorTok{));}\NormalTok{ memset}\OperatorTok{(}\NormalTok{bch}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{bch}\OperatorTok{));}\NormalTok{ book}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,} \DecValTok{26}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{k}\OperatorTok{,} \CharTok{\textquotesingle{}a\textquotesingle{}}\OperatorTok{,} \CharTok{\textquotesingle{}z\textquotesingle{}}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{bch}\OperatorTok{[}\NormalTok{k}\OperatorTok{])} \ControlFlowTok{continue}\OperatorTok{;}
\DataTypeTok{bool}\NormalTok{ pass }\OperatorTok{=} \KeywordTok{true}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{l}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \OperatorTok{\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{book}\OperatorTok{[}\NormalTok{l}\OperatorTok{])} \ControlFlowTok{continue}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{ch}\OperatorTok{[}\NormalTok{l}\OperatorTok{][}\NormalTok{idx}\OperatorTok{(}\NormalTok{k}\OperatorTok{)]} \OperatorTok{\textgreater{}}\NormalTok{ ch}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{idx}\OperatorTok{(}\NormalTok{k}\OperatorTok{)])} \OperatorTok{\{}\NormalTok{ pass }\OperatorTok{=} \KeywordTok{false}\OperatorTok{;} \ControlFlowTok{break}\OperatorTok{;} \OperatorTok{\}}
\OperatorTok{\}}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{pass}\OperatorTok{)\{}
\NormalTok{ bch}\OperatorTok{[}\NormalTok{k}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{l}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{ch}\OperatorTok{[}\NormalTok{l}\OperatorTok{][}\NormalTok{idx}\OperatorTok{(}\NormalTok{k}\OperatorTok{)]} \OperatorTok{\textless{}}\NormalTok{ ch}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{idx}\OperatorTok{(}\NormalTok{k}\OperatorTok{)])}\NormalTok{ book}\OperatorTok{[}\NormalTok{l}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{break}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{bool}\NormalTok{ pass }\OperatorTok{=} \KeywordTok{true}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{book}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{!=} \DecValTok{1}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ pass }\OperatorTok{=} \KeywordTok{false}\OperatorTok{;} \ControlFlowTok{break}\OperatorTok{;} \OperatorTok{\}}
\NormalTok{ ans }\OperatorTok{+=}\NormalTok{ pass}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{);}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{C. 三}\label{c.-ux4e09}
你是能看到第三题的friends呢。 ——laekov
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
给定\(N\)个数,设总共有\(M\)个区间\(p_1=[l_1,r_1],p_2=[l_2,r_2 ],\cdots,p_M=[l_m,r_m]\)的逆序对数量不少于\(K\)个。定义函数\(f(p_i,p_j)\)为计算两个区间的交集大小的函数(即共同覆盖了多少个数)。求
\(\sum_{i=1}^M\sum_{j=i+1}^M f(p_i,p_j)\) \(N \le 10^6\)
考虑每一个元素的贡献,不难发现,元素的贡献为
\(\binom{被覆盖的区间数}{2}\) ,问题转化为怎么求每个元素被覆盖的次数。
考虑对于每一个左端点 \(L\),合法的右端点取值一定是一段连续的区间,且
如果存在上界一定是 \(n\)
,对于每个左端点,求出其对应的最小的右端点,这里可以使用
\texttt{two-point} 。值域树状数组统计逆序对数。
考虑每个左端点为 \(L\)
的区间对元素覆盖数的贡献,发现一定是一条平直线和一个下降直线,可以对差分数组的差分数组做修改,然后两次前缀和还原出原序列。
\begin{Shaded}
\begin{Highlighting}[]
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{2e6} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ inv2 }\OperatorTok{=} \DecValTok{500000004}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ k}\OperatorTok{,}\NormalTok{ A}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\KeywordTok{namespace}\NormalTok{ BIT}\OperatorTok{\{}
\PreprocessorTok{\#define lowbit}\OperatorTok{(}\NormalTok{x}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{x}\PreprocessorTok{ }\OperatorTok{\&}\PreprocessorTok{ }\OperatorTok{({-}}\NormalTok{x}\OperatorTok{))}
\DataTypeTok{int}\NormalTok{ C}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ add}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ p}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ x}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{p }\OperatorTok{==} \DecValTok{0}\OperatorTok{)} \ControlFlowTok{return} \OperatorTok{;} \ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ p}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textless{}=}\NormalTok{ n}\OperatorTok{;}\NormalTok{ i }\OperatorTok{+=}\NormalTok{ lowbit}\OperatorTok{(}\NormalTok{i}\OperatorTok{))}\NormalTok{ C}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{+=}\NormalTok{ x}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ query}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ p}\OperatorTok{)} \OperatorTok{\{} \DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;} \ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ p}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textgreater{}=} \DecValTok{1}\OperatorTok{;}\NormalTok{ i }\OperatorTok{{-}=}\NormalTok{ lowbit}\OperatorTok{(}\NormalTok{i}\OperatorTok{))}\NormalTok{ ans }\OperatorTok{+=}\NormalTok{ C}\OperatorTok{[}\NormalTok{i}\OperatorTok{];} \ControlFlowTok{return}\NormalTok{ ans}\OperatorTok{;} \OperatorTok{\}}
\OperatorTok{\}} \KeywordTok{using}\NormalTok{ BIT}\OperatorTok{::}\NormalTok{add}\OperatorTok{;} \KeywordTok{using}\NormalTok{ BIT}\OperatorTok{::}\NormalTok{query}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ L }\OperatorTok{=} \DecValTok{0}\OperatorTok{,}\NormalTok{ R }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ Rp}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ C}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{k}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Read}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\NormalTok{ LL ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{L}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{{-}} \DecValTok{1} \OperatorTok{\textgreater{}} \DecValTok{0}\OperatorTok{)}\NormalTok{ add}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{L }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{],} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{{-}} \DecValTok{1} \OperatorTok{\textgreater{}} \DecValTok{0}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{{-}=}\NormalTok{ query}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{L }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{);}
\ControlFlowTok{while}\OperatorTok{((}\NormalTok{R }\OperatorTok{\textless{}}\NormalTok{ L}\OperatorTok{)} \OperatorTok{||} \OperatorTok{(}\NormalTok{ans }\OperatorTok{\textless{}}\NormalTok{ k }\OperatorTok{\&\&}\NormalTok{ R }\OperatorTok{\textless{}=}\NormalTok{ n}\OperatorTok{))} \OperatorTok{\{} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{R }\OperatorTok{==}\NormalTok{ n}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ R}\OperatorTok{++;} \ControlFlowTok{break}\OperatorTok{;} \OperatorTok{\};}\NormalTok{ add}\OperatorTok{(}\NormalTok{A}\OperatorTok{[++}\NormalTok{R}\OperatorTok{],} \DecValTok{1}\OperatorTok{);}\NormalTok{ ans }\OperatorTok{+=}\NormalTok{ query}\OperatorTok{(}\NormalTok{n}\OperatorTok{)} \OperatorTok{{-}}\NormalTok{ query}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{R}\OperatorTok{]);} \OperatorTok{\}}
\NormalTok{ Rp}\OperatorTok{[}\NormalTok{L}\OperatorTok{]} \OperatorTok{=}\NormalTok{ R}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{L}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{Rp}\OperatorTok{[}\NormalTok{L}\OperatorTok{]} \OperatorTok{\textgreater{}}\NormalTok{ n}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;} \DataTypeTok{int}\NormalTok{ cnt }\OperatorTok{=} \OperatorTok{(}\NormalTok{n }\OperatorTok{{-}}\NormalTok{ Rp}\OperatorTok{[}\NormalTok{L}\OperatorTok{]} \OperatorTok{+} \DecValTok{1}\OperatorTok{);}
\NormalTok{ C}\OperatorTok{[}\NormalTok{L}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{C}\OperatorTok{[}\NormalTok{L}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ cnt}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}\NormalTok{ C}\OperatorTok{[}\NormalTok{L }\OperatorTok{+} \DecValTok{1}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{C}\OperatorTok{[}\NormalTok{L }\OperatorTok{+} \DecValTok{1}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+} \OperatorTok{(}\NormalTok{MOD }\OperatorTok{{-}}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{{-}}\NormalTok{ cnt}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\NormalTok{ C}\OperatorTok{[}\NormalTok{Rp}\OperatorTok{[}\NormalTok{L}\OperatorTok{]} \OperatorTok{+} \DecValTok{1}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{C}\OperatorTok{[}\NormalTok{Rp}\OperatorTok{[}\NormalTok{L}\OperatorTok{]} \OperatorTok{+} \DecValTok{1}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ MOD }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ C}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{C}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ C}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ C}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{C}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ C}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=} \OperatorTok{(}\NormalTok{ans }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+} \OperatorTok{(}\NormalTok{C}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*} \OperatorTok{(}\NormalTok{C}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ inv2 }\OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{))} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{);}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{D. 四}\label{d.-ux56db}
你是能看到第四题的 friends 呢。 ——laekov
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
今天也是皮克敏们打工的一天,你有 \(N\)
只皮克敏,每只皮克敏有一颗炸弹。现在有一颗 \(N\)
个点的树,同时皮克敏们可以从 \(p_1\) 或者 \(p_2\)
两个点中的任意一个进入树。每次你需要派一只皮克敏去到某个点,然后将炸弹连同皮克敏和这个点一起炸掉。一个点被炸掉了之后皮克敏就再也不能通过了。现在你需要决定皮克敏们炸点的顺序,问
\(n!\) 种炸点方案中有多少种能炸掉所有点。 \(N \le 1000\)
考虑 \texttt{DP} 。
首先考虑一个子树(子树内没有
\(p_1, p_2\))全部被清空应该是什么顺序,一定是每个儿子的子树先被清空然后清楚当前点。
这里可以使用树形 dp 处理。
先考虑 \(p_1 \leftrightarrow p_2\)
这一条链上的点应该是按照什么顺序被清空,任意时刻,被清空的点一定是链上的连续的一段,这里可以区间
\(dp\)
统计答案,转移考虑最后一次删除是删干净了链上最右边的点还是最左边的点。
然后和 \(p_1, p_2\) 的每个不在链上的儿子合并答案,最后决策先删除 \(p_1\)
还是 \(p_2\)。 代码还没写。
\subsection{Round 5}\label{round-5}
\subsubsection{A. 一}\label{a.-ux4e00-1}
现在有四种颜色的东西,各有\(n_1,n_2,n_3,n_4\)个。你需要把他们放到一排里面,并且保证相邻的东西颜色不同,问方案数。
对于\(80\%\)的数据,\(n_1+n_2+n_3+n_4\leq 10\)。
对于另外\(10\%\)的数据,\(n_1=0,n_2,n_3,n_4\leq 50\)。
对于\(100\%\)的数据,\(0\leq n_1,n_2\leq 200,0\leq n_3,n_4\leq50000\)。
\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{namespace}\NormalTok{ subtask1}\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ dp}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\NormalTok{\_}\OperatorTok{][}\NormalTok{\_}\OperatorTok{][}\NormalTok{\_}\OperatorTok{][}\DecValTok{5}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ work}\OperatorTok{()\{}
\NormalTok{ memset}\OperatorTok{(}\NormalTok{dp}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{dp}\OperatorTok{));}
\NormalTok{ dp}\OperatorTok{[}\DecValTok{1}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{1}\OperatorTok{]} \OperatorTok{=}\NormalTok{ dp}\OperatorTok{[}\DecValTok{0}\OperatorTok{][}\DecValTok{1}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{2}\OperatorTok{]} \OperatorTok{=}\NormalTok{ dp}\OperatorTok{[}\DecValTok{0}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{1}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{3}\OperatorTok{]} \OperatorTok{=}\NormalTok{ dp}\OperatorTok{[}\DecValTok{0}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{1}\OperatorTok{][}\DecValTok{4}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ A}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ B}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{k}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ C}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{l}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ D}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{i }\OperatorTok{+}\NormalTok{ j }\OperatorTok{+}\NormalTok{ k }\OperatorTok{+}\NormalTok{ l }\OperatorTok{==} \DecValTok{1}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{i }\OperatorTok{\textgreater{}} \DecValTok{0}\OperatorTok{)}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{1}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{dp}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{2}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{3}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{4}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{j }\OperatorTok{\textgreater{}} \DecValTok{0}\OperatorTok{)}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{2}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{1}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{3}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{4}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textgreater{}} \DecValTok{0}\OperatorTok{)}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{3}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{2}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{1}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{4}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{l }\OperatorTok{\textgreater{}} \DecValTok{0}\OperatorTok{)}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l}\OperatorTok{][}\DecValTok{4}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\DecValTok{2}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\DecValTok{3}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\NormalTok{l }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\DecValTok{1}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ ans1 }\OperatorTok{=} \DataTypeTok{int}\OperatorTok{((}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ dp}\OperatorTok{[}\NormalTok{A}\OperatorTok{][}\NormalTok{B}\OperatorTok{][}\NormalTok{C}\OperatorTok{][}\NormalTok{D}\OperatorTok{][}\DecValTok{1}\OperatorTok{]} \OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{A}\OperatorTok{][}\NormalTok{B}\OperatorTok{][}\NormalTok{C}\OperatorTok{][}\NormalTok{D}\OperatorTok{][}\DecValTok{2}\OperatorTok{]} \OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{A}\OperatorTok{][}\NormalTok{B}\OperatorTok{][}\NormalTok{C}\OperatorTok{][}\NormalTok{D}\OperatorTok{][}\DecValTok{3}\OperatorTok{]} \OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{A}\OperatorTok{][}\NormalTok{B}\OperatorTok{][}\NormalTok{C}\OperatorTok{][}\NormalTok{D}\OperatorTok{][}\DecValTok{4}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{));}
\OperatorTok{\}}
\OperatorTok{\}}
\KeywordTok{namespace}\NormalTok{ subtask2}\OperatorTok{\{}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \DecValTok{53}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ dp}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\NormalTok{\_}\OperatorTok{][}\NormalTok{\_}\OperatorTok{][}\DecValTok{4}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ work}\OperatorTok{()\{}
\NormalTok{ memset}\OperatorTok{(}\NormalTok{dp}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{dp}\OperatorTok{));}
\NormalTok{ dp}\OperatorTok{[}\DecValTok{1}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{1}\OperatorTok{]} \OperatorTok{=}\NormalTok{ dp}\OperatorTok{[}\DecValTok{0}\OperatorTok{][}\DecValTok{1}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{2}\OperatorTok{]} \OperatorTok{=}\NormalTok{ dp}\OperatorTok{[}\DecValTok{0}\OperatorTok{][}\DecValTok{0}\OperatorTok{][}\DecValTok{1}\OperatorTok{][}\DecValTok{3}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ B}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ C}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{k}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ D}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{i }\OperatorTok{+}\NormalTok{ j }\OperatorTok{+}\NormalTok{ k }\OperatorTok{==} \DecValTok{1}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{i }\OperatorTok{\textgreater{}} \DecValTok{0}\OperatorTok{)}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\DecValTok{1}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{dp}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\DecValTok{2}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\DecValTok{3}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{j }\OperatorTok{\textgreater{}} \DecValTok{0}\OperatorTok{)}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\DecValTok{2}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\DecValTok{1}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\DecValTok{3}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{k }\OperatorTok{\textgreater{}} \DecValTok{0}\OperatorTok{)}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k}\OperatorTok{][}\DecValTok{3}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\DecValTok{2}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{][}\NormalTok{k }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\DecValTok{1}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ ans2 }\OperatorTok{=} \DataTypeTok{int}\OperatorTok{((}\NormalTok{ dp}\OperatorTok{[}\NormalTok{B}\OperatorTok{][}\NormalTok{C}\OperatorTok{][}\NormalTok{D}\OperatorTok{][}\DecValTok{1}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{B}\OperatorTok{][}\NormalTok{C}\OperatorTok{][}\NormalTok{D}\OperatorTok{][}\DecValTok{2}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{B}\OperatorTok{][}\NormalTok{C}\OperatorTok{][}\NormalTok{D}\OperatorTok{][}\DecValTok{3}\OperatorTok{]} \OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{));}
\OperatorTok{\}}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{B. 二}\label{b.-ux4e8c-1}
\(N\)个二元组\((a_i,b_i)\),定义\(c_1=a_1+b_1,c_i=b_i+max(c_{i-1},\sum_{j=1}^ia_j)\)。现在你可以随意重排这\(N\)个二元组,求\(c_N\)的最小值
\(N \le 10^6; A, B \le N\)
考虑相邻两个二元组 \((a_1, b_1) (a_2, b_2)\) 应该怎么比较大小。 分别列出
\((a_1, b_1)\) 在 \((a_2, b_2)\) 之前的答案和交换之后的答案。
如果 \((a_1, b_1)\) 在 \((a_2, b_2)\)
之前:设这两个二元组之前所有二元组中 \(a\) 的和为
\(x\),设上一个二元组的 \(C\) 值为 \(y\)。 根据定义
\(C_1 = b_1 + \max(y, a_1 + x)\),\(C_2 = b_2 + max(C_1, x + a_1 + a_2)\)
化简后得到
\(C_2 = \max(y + b_1 + b_2, x + a_1 + b_1 + b_2, x + a_1 + a_2 + b_2)\)
易知 交换后
\(C_2' = \max(y + b_1 + b_2, x + a_2 + b_1 + b_2, x + a_1 + a_2 + b_1)\)
现在需要比较 \(C_2\) 和 \(C_2'\) 的大小。相当于对 \(6\)
个式子取最大值,看最大值出现在哪边。相同的项 \(y + b_1 + b_2\)
可以消去,如果其为最大值,那么两个式子谁在前谁在后无所谓,如果其不是最大值,那么也没有影响。
消去每一项中相同的 \(x\)。
\(C_2 = \max(a_1 + b_1 + b_2, a_1 + a_2 + b_2)\)
\(C_2' = \max(a_2 + b_1 + b_2, a_1 + a_2 + b_1)\)
提出共同的项: \(C_2 = a_1 + b_2 + \max(b_1,a_2)\)
\(C_2' = a_2 + b_1 + \max(b_2, a_1)\)
假设 \(C_2 < C_2'\)
则 \(a_1 + b_2 + \max(b_1,a_2) < a_2 + b_1 + \max(b_2, a_1)\)
移项得 \(a_1 + b_2 - \max(b_2,a_1) < a_2 + b_1 - \max(b_1, a_2)\)
得出 \(\min(a_1, b_2) < \min(a_2, b_1)\)
一种特殊情况是取等的时候:举几个栗子得出 结论是取等时比较
\(a_1 < a_2\)。
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{bool}\NormalTok{ CMP}\OperatorTok{(}\NormalTok{pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ x}\OperatorTok{,}\NormalTok{ pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int} \OperatorTok{\textgreater{}}\NormalTok{ y}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ r0 }\OperatorTok{=}\NormalTok{ min}\OperatorTok{(}\NormalTok{x}\OperatorTok{.}\NormalTok{first}\OperatorTok{,}\NormalTok{ y}\OperatorTok{.}\NormalTok{second}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ r1 }\OperatorTok{=}\NormalTok{ min}\OperatorTok{(}\NormalTok{y}\OperatorTok{.}\NormalTok{first}\OperatorTok{,}\NormalTok{ x}\OperatorTok{.}\NormalTok{second}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{r0 }\OperatorTok{!=}\NormalTok{ r1}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ r0 }\OperatorTok{\textless{}}\NormalTok{ r1}\OperatorTok{;}
\ControlFlowTok{return}\NormalTok{ x}\OperatorTok{.}\NormalTok{first }\OperatorTok{\textless{}}\NormalTok{ y}\OperatorTok{.}\NormalTok{first}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{C. 三}\label{c.-ux4e09-1}
给定 \(N\) 个数,\(M\) 次操作,操作有以下四种: - 1、区间加一个数。 -
2、区间乘一个数。 - 3、区间变成一个数。 -
4、求所有子区间的平均值的和(\(MOD = 10^9 + 7\))。 \(a_i, N,Q \le 10^5\)
\(Ans = \sum_{i=1}^{n}\limits{\sum_{j=i}^{n}\limits{\frac{\sum_{k=i}^{j}\limits{a_k}}{j-i+1}}}\)
考虑每个数字的贡献
\(Ans = \sum_{k=1}^{n}\limits{a_k \times \sum_{i=1}^{n}\limits{\sum_{j=i}^{n}\limits{\frac{1}{j-i+1}}}}\)
算出贡献,线段树维护即可。可以考虑 \(k\) 每增加 1
贡献会变化多少。也可以发现贡献类似于一个梯形,可以直接算。
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{void}\NormalTok{ work}\OperatorTok{()\{}\NormalTok{ cerr }\OperatorTok{\textless{}\textless{}} \StringTok{"FUCK"} \OperatorTok{\textless{}\textless{}}\NormalTok{ endl}\OperatorTok{;}
\NormalTok{ S}\OperatorTok{[}\DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{2}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ S}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{S}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ inv}\OperatorTok{(}\NormalTok{i}\OperatorTok{))} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{,}\NormalTok{ dp }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ last }\OperatorTok{=}\NormalTok{ i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{;}\NormalTok{ dp }\OperatorTok{=} \OperatorTok{(}\NormalTok{dp }\OperatorTok{{-}}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{{-}}\NormalTok{ S}\OperatorTok{[}\NormalTok{last}\OperatorTok{]} \OperatorTok{+}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\NormalTok{ dp }\OperatorTok{=} \OperatorTok{(}\NormalTok{dp }\OperatorTok{{-}}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{{-}} \OperatorTok{(}\NormalTok{S}\OperatorTok{[}\NormalTok{n}\OperatorTok{]} \OperatorTok{{-}}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{{-}}\NormalTok{ S}\OperatorTok{[}\NormalTok{n }\OperatorTok{{-}}\NormalTok{ last}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\NormalTok{ dp }\OperatorTok{=} \OperatorTok{(}\NormalTok{dp }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+} \OperatorTok{(}\NormalTok{S}\OperatorTok{[}\NormalTok{n}\OperatorTok{]} \OperatorTok{{-}}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{{-}}\NormalTok{ S}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\NormalTok{ dp }\OperatorTok{=} \OperatorTok{(}\NormalTok{ dp }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ S}\OperatorTok{[}\NormalTok{i}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;} \CommentTok{// 这里的 dp 就是位置为 i 的数字对答案贡献的系数。}
\NormalTok{ ans }\OperatorTok{=} \OperatorTok{(}\NormalTok{ans }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{);}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{D. 四}\label{d.-ux56db-1}
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
皮克敏们打完工了,是时候将所有皮克敏处理掉了。现在皮克敏们躲在一棵树上(点和边的任意位置都有可能),你可以选择若干叶子节点释放毒气,毒气会以每单位时间一单位的距离沿着边蔓延开来。为了能够灭绝皮克敏,你需要保证树上每个位置都充满了毒气。但是仅仅是求一个最小的灭绝皮克敏的时间实在太无趣了,你想要知道你有多少种不同的方法能够灭绝皮克敏,两个方法不同当且仅当两种方法灭绝所有皮克敏的时间不同。
\(N \le 200\) 第一行一个整数 \(N\) 代表树上点的个数。
接下来 \(N−1\) 行每行三个整数 \(s,e,d\) 代表一条边的两端和长度。
答案只能是某两个叶子之间的距离或者距离 \$ / 2\$ 。 枚举两个叶子,把 -
这个叶子之间的距离(只在一边放毒气)(如果能成为答案) -
两个叶子之间距离 \$ / 2\$(两个叶子上都放毒气)(如果能成为答案)
加入答案集合。 最后输出答案集合的大小。
枚举两个叶子,判断其距离是否能成为答案。考虑哪些其他叶子放毒气能让这个距离尽可能成为答案,就是那些放上毒气不会影响这两个枚举的叶子之间毒气传播时间的叶子都放上毒气,然后跑一遍最短路,算全树被毒气覆盖的时间是否等于当前枚举的叶子。
\begin{Shaded}
\begin{Highlighting}[]
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \DecValTok{510}\OperatorTok{;}
\NormalTok{pair}\OperatorTok{\textless{}}\NormalTok{pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{\textgreater{},} \DataTypeTok{int} \OperatorTok{\textgreater{}}\NormalTok{ E}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ m}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ M}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\NormalTok{\_}\OperatorTok{];}
\NormalTok{set}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ Ans}\OperatorTok{;}
\NormalTok{queue}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{Q}\OperatorTok{;} \DataTypeTok{bool}\NormalTok{ inQ}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ SPFA}\OperatorTok{()\{}
\AttributeTok{static} \DataTypeTok{int}\NormalTok{ dis}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}\NormalTok{ memset}\OperatorTok{(}\NormalTok{dis}\OperatorTok{,} \BaseNTok{0x3f}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{dis}\OperatorTok{));}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{inQ}\OperatorTok{[}\NormalTok{i}\OperatorTok{])}\NormalTok{ dis}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\ControlFlowTok{while}\OperatorTok{(!}\NormalTok{Q}\OperatorTok{.}\NormalTok{empty}\OperatorTok{())\{}
\DataTypeTok{int}\NormalTok{ now }\OperatorTok{=}\NormalTok{ Q}\OperatorTok{.}\NormalTok{front}\OperatorTok{();}\NormalTok{ Q}\OperatorTok{.}\NormalTok{pop}\OperatorTok{();}\NormalTok{ inQ}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ head}\OperatorTok{[}\NormalTok{now}\OperatorTok{];}\NormalTok{ i }\OperatorTok{;}\NormalTok{i }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{nxt}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ ex }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{node}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{dis}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{+}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{w }\OperatorTok{\textless{}}\NormalTok{ dis}\OperatorTok{[}\NormalTok{ex}\OperatorTok{])} \OperatorTok{\{}
\NormalTok{ dis}\OperatorTok{[}\NormalTok{ex}\OperatorTok{]} \OperatorTok{=}\NormalTok{ dis}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{+}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{w}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{inQ}\OperatorTok{[}\NormalTok{ex}\OperatorTok{])}\NormalTok{ Q}\OperatorTok{.}\NormalTok{push}\OperatorTok{(}\NormalTok{ex}\OperatorTok{),}\NormalTok{ inQ}\OperatorTok{[}\NormalTok{ex}\OperatorTok{]} \OperatorTok{=} \KeywordTok{true}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ MAX }\OperatorTok{=}\NormalTok{ INT\_MIN}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ pair}\OperatorTok{\textless{}}\NormalTok{pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{\textgreater{},} \DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ now }\OperatorTok{=}\NormalTok{ E}\OperatorTok{[}\NormalTok{i}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ T }\OperatorTok{=}\NormalTok{ min}\OperatorTok{(}\NormalTok{dis}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{first}\OperatorTok{.}\NormalTok{first}\OperatorTok{]} \OperatorTok{+}\NormalTok{ now}\OperatorTok{.}\NormalTok{second}\OperatorTok{,}\NormalTok{ dis}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{first}\OperatorTok{.}\NormalTok{second}\OperatorTok{]} \OperatorTok{+}\NormalTok{ now}\OperatorTok{.}\NormalTok{second}\OperatorTok{,} \OperatorTok{(}\NormalTok{dis}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{first}\OperatorTok{.}\NormalTok{first}\OperatorTok{]} \OperatorTok{+}\NormalTok{ dis}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{first}\OperatorTok{.}\NormalTok{second}\OperatorTok{]} \OperatorTok{+}\NormalTok{ now}\OperatorTok{.}\NormalTok{second}\OperatorTok{)} \OperatorTok{/} \DecValTok{2}\OperatorTok{);}
\NormalTok{ MAX }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{MAX}\OperatorTok{,}\NormalTok{ T}\OperatorTok{);}
\OperatorTok{\}}
\ControlFlowTok{return}\NormalTok{ MAX}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ ind}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{bool}\NormalTok{ work1}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ x}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ y}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ D}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ Q}\OperatorTok{.}\NormalTok{push}\OperatorTok{(}\NormalTok{x}\OperatorTok{);}\NormalTok{ inQ}\OperatorTok{[}\NormalTok{x}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{i }\OperatorTok{==}\NormalTok{ x }\OperatorTok{||}\NormalTok{ i }\OperatorTok{==}\NormalTok{ y}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{M}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{y}\OperatorTok{]} \OperatorTok{\textgreater{}=}\NormalTok{ D }\OperatorTok{\&\&}\NormalTok{ ind}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{==} \DecValTok{1}\OperatorTok{)}\NormalTok{ Q}\OperatorTok{.}\NormalTok{push}\OperatorTok{(}\NormalTok{i}\OperatorTok{),}\NormalTok{ inQ}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;} \OperatorTok{\}}
\ControlFlowTok{return}\NormalTok{ SPFA}\OperatorTok{()} \OperatorTok{==}\NormalTok{ D}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{bool}\NormalTok{ work2}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ x}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ y}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ D}\OperatorTok{)\{}
\NormalTok{ Q}\OperatorTok{.}\NormalTok{push}\OperatorTok{(}\NormalTok{x}\OperatorTok{);}\NormalTok{ Q}\OperatorTok{.}\NormalTok{push}\OperatorTok{(}\NormalTok{y}\OperatorTok{);}\NormalTok{ inQ}\OperatorTok{[}\NormalTok{x}\OperatorTok{]} \OperatorTok{=}\NormalTok{ inQ}\OperatorTok{[}\NormalTok{y}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{x }\OperatorTok{==}\NormalTok{ i }\OperatorTok{||}\NormalTok{ y }\OperatorTok{==}\NormalTok{ i}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{max}\OperatorTok{(}\NormalTok{M}\OperatorTok{[}\NormalTok{x}\OperatorTok{][}\NormalTok{i}\OperatorTok{],}\NormalTok{ M}\OperatorTok{[}\NormalTok{y}\OperatorTok{][}\NormalTok{i}\OperatorTok{])} \OperatorTok{/} \DecValTok{2} \OperatorTok{\textgreater{}=}\NormalTok{ D }\OperatorTok{\&\&}\NormalTok{ ind}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{==} \DecValTok{1}\OperatorTok{)}\NormalTok{ Q}\OperatorTok{.}\NormalTok{push}\OperatorTok{(}\NormalTok{i}\OperatorTok{),}\NormalTok{ inQ}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}
\ControlFlowTok{return}\NormalTok{ SPFA}\OperatorTok{()} \OperatorTok{==}\NormalTok{ D}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ memset}\OperatorTok{(}\NormalTok{M}\OperatorTok{,} \BaseNTok{0x3f}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{M}\OperatorTok{));}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ M}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \OperatorTok{\{} \DataTypeTok{int}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{,}\NormalTok{ w}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{u}\OperatorTok{)(}\NormalTok{v}\OperatorTok{)(}\NormalTok{w}\OperatorTok{);}\NormalTok{ ind}\OperatorTok{[}\NormalTok{u}\OperatorTok{]} \OperatorTok{++;}\NormalTok{ ind}\OperatorTok{[}\NormalTok{v}\OperatorTok{]++;}\NormalTok{ w }\OperatorTok{\textless{}\textless{}=} \DecValTok{1}\OperatorTok{;}\NormalTok{ add}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{,}\NormalTok{ w}\OperatorTok{);}\NormalTok{ add}\OperatorTok{(}\NormalTok{v}\OperatorTok{,}\NormalTok{ u}\OperatorTok{,}\NormalTok{ w}\OperatorTok{);}\NormalTok{ M}\OperatorTok{[}\NormalTok{u}\OperatorTok{][}\NormalTok{v}\OperatorTok{]} \OperatorTok{=}\NormalTok{ M}\OperatorTok{[}\NormalTok{v}\OperatorTok{][}\NormalTok{u}\OperatorTok{]} \OperatorTok{=}\NormalTok{ w}\OperatorTok{;}\NormalTok{ E}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ make\_pair}\OperatorTok{(}\NormalTok{make\_pair}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{),}\NormalTok{ w}\OperatorTok{);} \OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{k}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ M}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{=}\NormalTok{ M}\OperatorTok{[}\NormalTok{j}\OperatorTok{][}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ min}\OperatorTok{(}\NormalTok{M}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{],}\NormalTok{ M}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{k}\OperatorTok{]} \OperatorTok{+}\NormalTok{ M}\OperatorTok{[}\NormalTok{k}\OperatorTok{][}\NormalTok{j}\OperatorTok{]);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{i }\OperatorTok{==}\NormalTok{ j}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{ind}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{!=} \DecValTok{1} \OperatorTok{||}\NormalTok{ ind}\OperatorTok{[}\NormalTok{j}\OperatorTok{]} \OperatorTok{!=} \DecValTok{1}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{Ans}\OperatorTok{.}\NormalTok{count}\OperatorTok{(}\NormalTok{M}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{])} \OperatorTok{\&\&}\NormalTok{ work1}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\NormalTok{ j}\OperatorTok{,}\NormalTok{ M}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]))}\NormalTok{ Ans}\OperatorTok{.}\NormalTok{insert}\OperatorTok{(}\NormalTok{M}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]);}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{Ans}\OperatorTok{.}\NormalTok{count}\OperatorTok{(}\NormalTok{M}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{)} \OperatorTok{\&\&}\NormalTok{ work2}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\NormalTok{ j}\OperatorTok{,}\NormalTok{ M}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{))}\NormalTok{ Ans}\OperatorTok{.}\NormalTok{insert}\OperatorTok{(}\NormalTok{M}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{);}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{(}\NormalTok{Ans}\OperatorTok{.}\NormalTok{size}\OperatorTok{()));}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsection{Round 6}\label{round-6}
\subsubsection{A. 一}\label{a.-ux4e00-2}
现在我们有两队皮克敏,个数分别为\(n_1,n_2\),现在我们要杀掉这些皮克敏,按照如下规则操作:对于第\(i\)轮杀皮克敏的操作,我们首先选择皮克敏较多的那一队,如果一样就选择第一队,然后杀掉这队中的\(i\)个皮克敏,如果不够,游戏结束,记做游戏在第\(i\)轮结束。问最后两队各剩下多少个皮克敏?
\(n \le 10^{16}\)
分成两阶段,一阶段是只杀多的那队,直到比另一队少。二阶段是两队交替着杀,可以证明,如果经过了第一阶段,那么第二阶段一定是交替着杀。
杀就完了。 分别二分即可,当然第一步也可以直接解方程。
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{LL A}\OperatorTok{,}\NormalTok{ B}\OperatorTok{;}
\KeywordTok{inline}\NormalTok{ LL check}\OperatorTok{(}\NormalTok{LL x}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return}\NormalTok{ x }\OperatorTok{*} \OperatorTok{(}\NormalTok{x }\OperatorTok{+} \DecValTok{1}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;} \OperatorTok{\}}
\NormalTok{LL Get}\OperatorTok{(}\NormalTok{LL res}\OperatorTok{)\{}
\NormalTok{ LL L }\OperatorTok{=} \DecValTok{0}\OperatorTok{,}\NormalTok{ R }\OperatorTok{=} \FloatTok{1e9}\OperatorTok{,}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}}\NormalTok{ R}\OperatorTok{)\{}
\NormalTok{ LL mid }\OperatorTok{=}\NormalTok{ L }\OperatorTok{+} \OperatorTok{((}\NormalTok{R }\OperatorTok{{-}}\NormalTok{ L }\OperatorTok{+} \DecValTok{1}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{check}\OperatorTok{(}\NormalTok{mid}\OperatorTok{)} \OperatorTok{\textless{}=}\NormalTok{ res}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ L }\OperatorTok{=}\NormalTok{ mid}\OperatorTok{;}
\ControlFlowTok{else}\NormalTok{ R }\OperatorTok{=}\NormalTok{ mid }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}
\ControlFlowTok{return}\NormalTok{ ans}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{LL Start }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ LL tA}\OperatorTok{,}\NormalTok{ tB}\OperatorTok{;}
\DataTypeTok{bool}\NormalTok{ check0}\OperatorTok{(}\NormalTok{LL Round}\OperatorTok{,}\NormalTok{ LL A}\OperatorTok{,}\NormalTok{ LL B}\OperatorTok{)\{}
\NormalTok{ LL dA}\OperatorTok{,}\NormalTok{ dB}\OperatorTok{;} \DataTypeTok{bool}\NormalTok{ sf }\OperatorTok{=} \KeywordTok{false}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{A }\OperatorTok{\textless{}}\NormalTok{ B}\OperatorTok{)}\NormalTok{ sf }\OperatorTok{=} \KeywordTok{true}\OperatorTok{,}\NormalTok{ swap}\OperatorTok{(}\NormalTok{A}\OperatorTok{,}\NormalTok{ B}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{Round }\OperatorTok{\&} \DecValTok{1}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ dA }\OperatorTok{=} \OperatorTok{(}\NormalTok{Start }\OperatorTok{+} \OperatorTok{(}\NormalTok{Start }\OperatorTok{+}\NormalTok{ Round }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{))} \OperatorTok{*} \OperatorTok{(}\NormalTok{Round }\OperatorTok{/} \DecValTok{2} \OperatorTok{+} \DecValTok{1}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ dB }\OperatorTok{=} \OperatorTok{(}\NormalTok{Start }\OperatorTok{+} \DecValTok{1} \OperatorTok{+} \OperatorTok{(}\NormalTok{Start }\OperatorTok{+}\NormalTok{ Round }\OperatorTok{{-}} \DecValTok{2}\OperatorTok{))} \OperatorTok{*} \OperatorTok{(}\NormalTok{Round }\OperatorTok{/} \DecValTok{2}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}} \ControlFlowTok{else} \OperatorTok{\{}
\NormalTok{ dA }\OperatorTok{=} \OperatorTok{(}\NormalTok{Start }\OperatorTok{+} \OperatorTok{(}\NormalTok{Start }\OperatorTok{+}\NormalTok{ Round }\OperatorTok{{-}} \DecValTok{2}\OperatorTok{))} \OperatorTok{*} \OperatorTok{(}\NormalTok{Round }\OperatorTok{/} \DecValTok{2}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ dB }\OperatorTok{=} \OperatorTok{(}\NormalTok{Start }\OperatorTok{+} \DecValTok{1} \OperatorTok{+} \OperatorTok{(}\NormalTok{Start }\OperatorTok{+}\NormalTok{ Round }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{))} \OperatorTok{*} \OperatorTok{(}\NormalTok{Round }\OperatorTok{/} \DecValTok{2}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}\NormalTok{ A }\OperatorTok{{-}=}\NormalTok{ dA}\OperatorTok{;}\NormalTok{ B }\OperatorTok{{-}=}\NormalTok{ dB}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{sf}\OperatorTok{)}\NormalTok{ swap}\OperatorTok{(}\NormalTok{A}\OperatorTok{,}\NormalTok{ B}\OperatorTok{);}
\NormalTok{ tA }\OperatorTok{=}\NormalTok{ A}\OperatorTok{;}\NormalTok{ tB }\OperatorTok{=}\NormalTok{ B}\OperatorTok{;}
\ControlFlowTok{return}\NormalTok{ A }\OperatorTok{\textgreater{}=} \DecValTok{0} \OperatorTok{\&\&}\NormalTok{ B }\OperatorTok{\textgreater{}=} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ doit}\OperatorTok{()\{}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{A}\OperatorTok{)(}\NormalTok{B}\OperatorTok{);}
\NormalTok{ LL d }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{A}\OperatorTok{,}\NormalTok{ B}\OperatorTok{)} \OperatorTok{{-}}\NormalTok{ min}\OperatorTok{(}\NormalTok{A}\OperatorTok{,}\NormalTok{ B}\OperatorTok{);}
\NormalTok{ LL Round }\OperatorTok{=}\NormalTok{ Get}\OperatorTok{(}\NormalTok{d}\OperatorTok{);}\NormalTok{ LL del }\OperatorTok{=}\NormalTok{ check}\OperatorTok{(}\NormalTok{Round}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{A }\OperatorTok{\textless{}}\NormalTok{ B}\OperatorTok{)}\NormalTok{ B }\OperatorTok{{-}=}\NormalTok{ del}\OperatorTok{;} \ControlFlowTok{else}\NormalTok{ A }\OperatorTok{{-}=}\NormalTok{ del}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{A }\OperatorTok{==}\NormalTok{ B}\OperatorTok{)} \OperatorTok{\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{A }\OperatorTok{\textless{}}\NormalTok{ Round }\OperatorTok{+} \DecValTok{1}\OperatorTok{)} \ControlFlowTok{return} \OperatorTok{(}\DataTypeTok{void}\OperatorTok{)}\NormalTok{printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld}\StringTok{ }\SpecialCharTok{\%lld}\StringTok{ }\SpecialCharTok{\%lld\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ Round }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ A}\OperatorTok{,}\NormalTok{ B}\OperatorTok{);}
\ControlFlowTok{else}\NormalTok{ Round }\OperatorTok{++,}\NormalTok{ A }\OperatorTok{{-}=}\NormalTok{ Round}\OperatorTok{;}
\OperatorTok{\}} \ControlFlowTok{else} \OperatorTok{\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{max}\OperatorTok{(}\NormalTok{A}\OperatorTok{,}\NormalTok{ B}\OperatorTok{)} \OperatorTok{\textless{}}\NormalTok{ Round }\OperatorTok{+} \DecValTok{1}\OperatorTok{)} \ControlFlowTok{return} \OperatorTok{(}\DataTypeTok{void}\OperatorTok{)}\NormalTok{printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld}\StringTok{ }\SpecialCharTok{\%lld}\StringTok{ }\SpecialCharTok{\%lld\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ Round }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ A}\OperatorTok{,}\NormalTok{ B}\OperatorTok{);}
\ControlFlowTok{else}\NormalTok{ Round }\OperatorTok{++,} \OperatorTok{(}\NormalTok{A }\OperatorTok{\textgreater{}}\NormalTok{ B }\OperatorTok{?}\NormalTok{ A }\OperatorTok{{-}=}\NormalTok{ Round }\OperatorTok{:}\NormalTok{ B }\OperatorTok{{-}=}\NormalTok{ Round}\OperatorTok{);}
\OperatorTok{\}}
\NormalTok{ LL L }\OperatorTok{=} \DecValTok{0}\OperatorTok{,}\NormalTok{ R }\OperatorTok{=} \FloatTok{1e9}\OperatorTok{,}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ Start }\OperatorTok{=}\NormalTok{ Round }\OperatorTok{+} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ LL mid }\OperatorTok{=}\NormalTok{ L }\OperatorTok{+} \OperatorTok{((}\NormalTok{R }\OperatorTok{{-}}\NormalTok{ L }\OperatorTok{+} \DecValTok{1}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{check0}\OperatorTok{(}\NormalTok{mid}\OperatorTok{,}\NormalTok{ A}\OperatorTok{,}\NormalTok{ B}\OperatorTok{))}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ L }\OperatorTok{=}\NormalTok{ mid}\OperatorTok{;}
\ControlFlowTok{else}\NormalTok{ R }\OperatorTok{=}\NormalTok{ mid }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}\NormalTok{ check0}\OperatorTok{(}\NormalTok{ans}\OperatorTok{,}\NormalTok{ A}\OperatorTok{,}\NormalTok{ B}\OperatorTok{);}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld}\StringTok{ }\SpecialCharTok{\%lld}\StringTok{ }\SpecialCharTok{\%lld\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ ans }\OperatorTok{+}\NormalTok{ Round }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ tA}\OperatorTok{,}\NormalTok{ tB}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\DataTypeTok{int}\NormalTok{ T }\OperatorTok{=}\NormalTok{ read}\OperatorTok{();}\NormalTok{ cerr }\OperatorTok{\textless{}\textless{}} \StringTok{"std\textquotesingle{}s T = "} \OperatorTok{\textless{}\textless{}}\NormalTok{ T }\OperatorTok{\textless{}\textless{}}\NormalTok{ endl}\OperatorTok{;}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{T}\OperatorTok{{-}{-})}\NormalTok{ doit}\OperatorTok{();}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{B. 二}\label{b.-ux4e8c-2}
现在有三组N个数记做\(A,B,C\),定义函数\(f(A,B)=\sum_{i=1}^NA_i\times B_i\)。现在给定\(A,B\),并告诉你\(f(A,C)=x\),现在想求在满足\(∑_{i=1}^NC_i=1,0\leq C_i\leq1\)的情况下\(f(B,C)\)的最大值。
对于\(100\%\)的数据,\(1\leq N,M\leq 100,1\leq A_i,B_i\leq100\)
{[}skip{]} 结论是只有两个点有用,只枚举两个点即可。
\begin{Shaded}
\begin{Highlighting}[]
\end{Highlighting}
\end{Shaded}
\subsubsection{C. 三}\label{c.-ux4e09-2}
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
现在有一个 \(N\)
的排列,将其每个数看做一个集合。定义一种对两个集合的运算为:\(f(s_1,s_2 )=\sum_{x\in s_1}[\exists y\in s_2,y < x]\)
也可以用这样一段伪代码去理解:
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{Ans}\OperatorTok{=}\DecValTok{0}
\NormalTok{For x }\KeywordTok{in}\NormalTok{ s1:}
\NormalTok{ Able }\OperatorTok{=} \VariableTok{False}
\NormalTok{ For y }\KeywordTok{in}\NormalTok{ s2:}
\NormalTok{ If y}\OperatorTok{\textless{}}\NormalTok{x:}
\NormalTok{ Able}\OperatorTok{=}\VariableTok{True}
\NormalTok{ If Able:}
\NormalTok{ Ans}\OperatorTok{++}
\NormalTok{Return Ans}
\end{Highlighting}
\end{Shaded}
现在你每次可以合并两个相邻的集合将其变为两个集合的并集,其代价为\(f(s_1,s_2)+f(s_2,s_1)\)。求最小代价,将所有集合合并为一个集合。
\(N \le 10^2\)
函数 \(f(A, B)\) 其实就是 \(A\) 中有多少元素大于 \(\min{B_i}\)
。按照定义区间 dp 即可,由于是小于 \(\mathcal{O}(n^2)\)
级别的二维数点,可以使用二维前缀和。 查询最小值随手预处理一下
\texttt{ST} 表即可。
\begin{Shaded}
\begin{Highlighting}[]
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \DecValTok{600}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ dp}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ S}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ A}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ query}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ up}\OperatorTok{)\{} \CommentTok{// how many elements in range[L, R] which is \textgreater{} up }
\ControlFlowTok{return}\NormalTok{ S}\OperatorTok{[}\NormalTok{n}\OperatorTok{][}\NormalTok{R}\OperatorTok{]} \OperatorTok{{-}}\NormalTok{ S}\OperatorTok{[}\NormalTok{up}\OperatorTok{][}\NormalTok{R}\OperatorTok{]} \OperatorTok{{-}}\NormalTok{ S}\OperatorTok{[}\NormalTok{n}\OperatorTok{][}\NormalTok{L }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]} \OperatorTok{+}\NormalTok{ S}\OperatorTok{[}\NormalTok{up}\OperatorTok{][}\NormalTok{L }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{];}
\OperatorTok{\}}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_S }\OperatorTok{=} \DecValTok{4000}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ LOG }\OperatorTok{=} \DecValTok{10}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ ST}\OperatorTok{[}\NormalTok{\_S}\OperatorTok{][}\NormalTok{LOG }\OperatorTok{+} \DecValTok{2}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ Log}\OperatorTok{[}\NormalTok{\_S}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ initQuery}\OperatorTok{()\{}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ ST}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\DecValTok{0}\OperatorTok{]} \OperatorTok{=}\NormalTok{ A}\OperatorTok{[}\NormalTok{i}\OperatorTok{];}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ LOG}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ ST}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{=}\NormalTok{ min}\OperatorTok{(}\NormalTok{ST}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{],}\NormalTok{ ST}\OperatorTok{[}\NormalTok{i }\OperatorTok{+} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}} \OperatorTok{(}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{))][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]);}
\NormalTok{ Log}\OperatorTok{[}\DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{2}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Log}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ Log}\OperatorTok{[}\NormalTok{i }\OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{]} \OperatorTok{+} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ RMQ}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ Ln }\OperatorTok{=}\NormalTok{ Log}\OperatorTok{[}\NormalTok{R }\OperatorTok{{-}}\NormalTok{ L }\OperatorTok{+} \DecValTok{1}\OperatorTok{];}
\ControlFlowTok{return}\NormalTok{ min}\OperatorTok{(}\NormalTok{ST}\OperatorTok{[}\NormalTok{L}\OperatorTok{][}\NormalTok{Ln}\OperatorTok{],}\NormalTok{ ST}\OperatorTok{[}\NormalTok{R }\OperatorTok{{-}} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ Ln}\OperatorTok{)} \OperatorTok{+} \DecValTok{1}\OperatorTok{][}\NormalTok{Ln}\OperatorTok{]);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ calc}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ L0}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R0}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L1}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R1}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ min0 }\OperatorTok{=}\NormalTok{ RMQ}\OperatorTok{(}\NormalTok{L0}\OperatorTok{,}\NormalTok{ R0}\OperatorTok{),}\NormalTok{ min1 }\OperatorTok{=}\NormalTok{ RMQ}\OperatorTok{(}\NormalTok{L1}\OperatorTok{,}\NormalTok{ R1}\OperatorTok{);}
\ControlFlowTok{return}\NormalTok{ query}\OperatorTok{(}\NormalTok{L0}\OperatorTok{,}\NormalTok{ R0}\OperatorTok{,}\NormalTok{ min1}\OperatorTok{)} \OperatorTok{+}\NormalTok{ query}\OperatorTok{(}\NormalTok{L1}\OperatorTok{,}\NormalTok{ R1}\OperatorTok{,}\NormalTok{ min0}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Read}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}\NormalTok{ initQuery}\OperatorTok{();}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ S}\OperatorTok{[}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]][}\NormalTok{i}\OperatorTok{]++;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ S}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{+=}\NormalTok{ S}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{+}\NormalTok{ S}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]} \OperatorTok{{-}}\NormalTok{ S}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{];}
\NormalTok{ memset}\OperatorTok{(}\NormalTok{dp}\OperatorTok{,} \BaseNTok{0x3f}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{dp}\OperatorTok{));}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{Len}\OperatorTok{,} \DecValTok{2}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{L}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ R }\OperatorTok{=}\NormalTok{ L }\OperatorTok{+}\NormalTok{ Len }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{;} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{R }\OperatorTok{\textgreater{}}\NormalTok{ n}\OperatorTok{)} \ControlFlowTok{break}\OperatorTok{;}
\DataTypeTok{int} \OperatorTok{\&}\NormalTok{ans }\OperatorTok{=}\NormalTok{ dp}\OperatorTok{[}\NormalTok{L}\OperatorTok{][}\NormalTok{R}\OperatorTok{];}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{k}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ min}\OperatorTok{(}\NormalTok{ans}\OperatorTok{,}\NormalTok{ dp}\OperatorTok{[}\NormalTok{L}\OperatorTok{][}\NormalTok{k}\OperatorTok{]} \OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{k }\OperatorTok{+} \DecValTok{1}\OperatorTok{][}\NormalTok{R}\OperatorTok{]} \OperatorTok{+}\NormalTok{ calc}\OperatorTok{(}\NormalTok{L}\OperatorTok{,}\NormalTok{ k}\OperatorTok{,}\NormalTok{ k }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{));}
\OperatorTok{\}}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,}\NormalTok{ dp}\OperatorTok{[}\DecValTok{1}\OperatorTok{][}\NormalTok{n}\OperatorTok{]);}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{D. 四}\label{d.-ux56db-2}
给定 \(1-N\) 的排列但其中 \(M\) 个位置的值被删去了(用 \(0\)
表示),现在你需要将其复原,问有多少种方案能够使得复原的序列的逆序对个数在
\([L,R]\) 之间
折半搜索,中间 \(\mathcal{O}(n^2)\) 合并。
\begin{Shaded}
\begin{Highlighting}[]
\end{Highlighting}
\end{Shaded}
\subsection{Round 7}\label{round-7}
AK。 \#\#\# A. 一
有一个\(n\times n\)的矩阵,矩阵中的每个数都是整数。现在要从矩阵中取\(m\)个数,要求每一行最多取一个数,每一列也最多取一个数。这\(m\)个数的和最大能是多少?
\(n \le 15, m \le 3, A_{i,j} \le 10^5\)
\begin{Shaded}
\begin{Highlighting}[]
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \DecValTok{20}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ m}\OperatorTok{,}\NormalTok{ A}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{m}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Read}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{m }\OperatorTok{==} \DecValTok{1}\OperatorTok{)} \OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ MAX }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ MAX }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{MAX}\OperatorTok{,}\NormalTok{ A}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]);}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,}\NormalTok{ MAX}\OperatorTok{);}
\OperatorTok{\}} \ControlFlowTok{else} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{m }\OperatorTok{==} \DecValTok{2}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ MAX }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{a}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{b}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{c}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{d}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{a }\OperatorTok{==}\NormalTok{ c }\OperatorTok{||}\NormalTok{ b }\OperatorTok{==}\NormalTok{ d}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;}
\NormalTok{ MAX }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{MAX}\OperatorTok{,}\NormalTok{ A}\OperatorTok{[}\NormalTok{a}\OperatorTok{][}\NormalTok{b}\OperatorTok{]} \OperatorTok{+}\NormalTok{ A}\OperatorTok{[}\NormalTok{c}\OperatorTok{][}\NormalTok{d}\OperatorTok{]);}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,}\NormalTok{ MAX}\OperatorTok{);}
\OperatorTok{\}} \ControlFlowTok{else} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{m }\OperatorTok{==} \DecValTok{3}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ MAX }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{a}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{b}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{c}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{d}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{e}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{f}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{a }\OperatorTok{==}\NormalTok{ c }\OperatorTok{||}\NormalTok{ c }\OperatorTok{==}\NormalTok{ e }\OperatorTok{||}\NormalTok{ a }\OperatorTok{==}\NormalTok{ e }\OperatorTok{||}\NormalTok{ b }\OperatorTok{==}\NormalTok{ d }\OperatorTok{||}\NormalTok{ d }\OperatorTok{==}\NormalTok{ f }\OperatorTok{||}\NormalTok{ b }\OperatorTok{==}\NormalTok{ f}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;}
\NormalTok{ MAX }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{MAX}\OperatorTok{,}\NormalTok{ A}\OperatorTok{[}\NormalTok{a}\OperatorTok{][}\NormalTok{b}\OperatorTok{]} \OperatorTok{+}\NormalTok{ A}\OperatorTok{[}\NormalTok{c}\OperatorTok{][}\NormalTok{d}\OperatorTok{]} \OperatorTok{+}\NormalTok{ A}\OperatorTok{[}\NormalTok{e}\OperatorTok{][}\NormalTok{f}\OperatorTok{]);}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,}\NormalTok{ MAX}\OperatorTok{);}
\OperatorTok{\}}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{B. 二}\label{b.-ux4e8c-3}
有多少整数大于等于\(x\),小于等于\(y\),而且是7的倍数,又不是2,3,5的倍数呢?
\(x,y \le 10^{18}\)
容斥原理
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{LL calc}\OperatorTok{(}\NormalTok{LL R}\OperatorTok{)\{}
\NormalTok{ LL ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ ans }\OperatorTok{+=}\NormalTok{ R }\OperatorTok{/} \DecValTok{7}\OperatorTok{;}\NormalTok{ ans }\OperatorTok{{-}=}\NormalTok{ R }\OperatorTok{/} \DecValTok{14}\OperatorTok{;}\NormalTok{ ans }\OperatorTok{{-}=}\NormalTok{ R }\OperatorTok{/} \DecValTok{21}\OperatorTok{;}\NormalTok{ ans }\OperatorTok{{-}=}\NormalTok{ R }\OperatorTok{/} \DecValTok{35}\OperatorTok{;}\NormalTok{ ans }\OperatorTok{+=}\NormalTok{ R }\OperatorTok{/} \DecValTok{42}\OperatorTok{;}\NormalTok{ ans }\OperatorTok{+=}\NormalTok{ R }\OperatorTok{/} \DecValTok{70}\OperatorTok{;}\NormalTok{ ans }\OperatorTok{+=}\NormalTok{ R }\OperatorTok{/} \DecValTok{105}\OperatorTok{;}\NormalTok{ ans }\OperatorTok{{-}=}\NormalTok{ R }\OperatorTok{/} \DecValTok{210}\OperatorTok{;}
\ControlFlowTok{return}\NormalTok{ ans}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ LL L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{L}\OperatorTok{)(}\NormalTok{R}\OperatorTok{);}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld}\StringTok{"}\OperatorTok{,}\NormalTok{ calc}\OperatorTok{(}\NormalTok{R}\OperatorTok{)} \OperatorTok{{-}}\NormalTok{ calc}\OperatorTok{(}\NormalTok{L }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{));}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{C. 三}\label{c.-ux4e09-3}
给出一个\(n\)个点\(m\)条边的图。
现在想要选择两个整数\(a\)和\(b\),满足\(1 \leq a < b < n\),然后把编号在区间\([1,a]\)中的点染成蓝色,把编号在区间\([a+1,b]\)中的点染成红色,编号在区间\([b+1,n]\)中的点染成蓝色。
如果一条边的两个端点颜色不同,我们称这条边为双色边,否则称之为单色边。
如何选择\(a,b\),能够最小化双色边的数量? \(n, m \le 10^5\)
经典套路,按顺序枚举 \(a\),线段树维护 \(b\)
的每一个取值时的双色边数量,枚举 \(a\) 的过程中维护 \(b\)
的取值,更新答案即可。
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ m}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{3e5} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\NormalTok{vector}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ ToL}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\NormalTok{vector}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ ToR}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\KeywordTok{namespace}\NormalTok{ SegmentTree}\OperatorTok{\{} \CommentTok{// maintain the number of double{-}color edge;}
\CommentTok{// the min number ;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{2e6} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ ch}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\DecValTok{2}\OperatorTok{],}\NormalTok{ v}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ tot }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\PreprocessorTok{\#define ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{ch}\OperatorTok{[}\NormalTok{o}\OperatorTok{][}\DecValTok{0}\OperatorTok{])}
\PreprocessorTok{\#define rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{ch}\OperatorTok{[}\NormalTok{o}\OperatorTok{][}\DecValTok{1}\OperatorTok{])}
\PreprocessorTok{\#define maintain}\OperatorTok{(}\NormalTok{o}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{min}\OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)],}\PreprocessorTok{ }\NormalTok{v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)]))}
\PreprocessorTok{\#define make }\OperatorTok{(}\NormalTok{tot}\OperatorTok{++,}\PreprocessorTok{ }\NormalTok{ch}\OperatorTok{[}\NormalTok{tot}\OperatorTok{][}\DecValTok{0}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{ch}\OperatorTok{[}\NormalTok{tot}\OperatorTok{][}\DecValTok{1}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{v}\OperatorTok{[}\NormalTok{tot}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{tag\_add}\OperatorTok{[}\NormalTok{tot}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\DecValTok{0}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{tot}\OperatorTok{)}
\DataTypeTok{int}\NormalTok{ Groot}\OperatorTok{()\{} \ControlFlowTok{return}\NormalTok{ make}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ build}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{==}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return} \OperatorTok{(}\DataTypeTok{void}\OperatorTok{)(}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{);} \DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{L }\OperatorTok{+}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)} \OperatorTok{=}\NormalTok{ make}\OperatorTok{;}\NormalTok{ rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)} \OperatorTok{=}\NormalTok{ make}\OperatorTok{;}
\NormalTok{ build}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}\NormalTok{ build}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ maintain}\OperatorTok{(}\NormalTok{o}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ tar}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ \_v}\OperatorTok{)\{}\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{+=}\NormalTok{ \_v}\OperatorTok{;}\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{+=}\NormalTok{ \_v}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ push}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{if}\OperatorTok{(!}\NormalTok{tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{])} \ControlFlowTok{return} \OperatorTok{;}\NormalTok{ tar}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{]);}\NormalTok{ tar}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{]);}\NormalTok{ tag\_add}\OperatorTok{[}\NormalTok{o}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ update}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowl}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowr}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ Val}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ nowl }\OperatorTok{\&\&}\NormalTok{ nowr }\OperatorTok{\textless{}=}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ tar}\OperatorTok{(}\NormalTok{o}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{nowl }\OperatorTok{+}\NormalTok{ nowr}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}\NormalTok{ push}\OperatorTok{(}\NormalTok{o}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{R }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{);}
\NormalTok{ maintain}\OperatorTok{(}\NormalTok{o}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ query}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowl}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowr}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ nowl }\OperatorTok{\&\&}\NormalTok{ nowr }\OperatorTok{\textless{}=}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{nowl }\OperatorTok{+}\NormalTok{ nowr}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}\NormalTok{ push}\OperatorTok{(}\NormalTok{o}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ INT\_MAX}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ min}\OperatorTok{(}\NormalTok{ans}\OperatorTok{,}\NormalTok{ query}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{));}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{R }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ min}\OperatorTok{(}\NormalTok{ans}\OperatorTok{,}\NormalTok{ query}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{));}
\ControlFlowTok{return}\NormalTok{ ans}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{update}\OperatorTok{;} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{build}\OperatorTok{;}
\KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{query}\OperatorTok{;} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{Groot}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{m}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ root }\OperatorTok{=}\NormalTok{ Groot}\OperatorTok{();}\NormalTok{ build}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{);} \DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ INT\_MAX}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ m}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{u}\OperatorTok{)(}\NormalTok{v}\OperatorTok{);} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{u }\OperatorTok{\textgreater{}}\NormalTok{ v}\OperatorTok{)}\NormalTok{ swap}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{);}
\NormalTok{ ToL}\OperatorTok{[}\NormalTok{v}\OperatorTok{].}\NormalTok{push\_back}\OperatorTok{(}\NormalTok{u}\OperatorTok{);}\NormalTok{ ToR}\OperatorTok{[}\NormalTok{u}\OperatorTok{].}\NormalTok{push\_back}\OperatorTok{(}\NormalTok{v}\OperatorTok{);}\NormalTok{ update}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{,} \DecValTok{1}\OperatorTok{);}
\OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{2}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ update}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ i }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{,} \OperatorTok{{-}}\DataTypeTok{int}\OperatorTok{(}\NormalTok{ToL}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{size}\OperatorTok{()));}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ ToR}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{)}\NormalTok{ update}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ i}\OperatorTok{,}\NormalTok{ ToR}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{,} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{),}\NormalTok{ update}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ ToR}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{],}\NormalTok{ n}\OperatorTok{,} \DecValTok{1}\OperatorTok{);}
\NormalTok{ ans }\OperatorTok{=}\NormalTok{ min}\OperatorTok{(}\NormalTok{ans}\OperatorTok{,}\NormalTok{ query}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ i }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{));}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{);}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{D. 四}\label{d.-ux56db-3}
\(n\)个小伙伴(编号从0到\(n−1\))围坐一圈玩游戏。按照顺时针方向给\(n\)个位置编号,从0到\(n−1\)。最初,第0号小伙伴在第0号位置,第1号小伙伴在第1号位置,\(\dots\),依此类推。游戏规则如下:
-
有一个序列\(A=\{a_1,\dots,a_m\}\),其中每个数互不相同,且都是\([1,n-1]\)中的正整数。
-
每一轮从\(A\)中选择一个数\(a\),第0号位置上的小伙伴顺时针走到第\(a\)号位置,第1号位置小伙伴走到第\(a+1\)号位置。依此类推,第\(n-a\)号位置上的小伙伴走到第0号位置,第\(n-a+1\)号位置上的小伙伴走到第1号位置,\(\dots\),第\(n-1\)号位置上的小伙伴顺时针走到第\(a-1\)号位置。也就是说,第\(i\)号位置上的小伙伴走到第\((i+a)\mod\ n\)号位置
游戏进行\(t\)轮。由于每一轮都需要从\(A\)中的\(m\)个数中选一个数,所以游戏共有\(m^t\)种玩法。其中有多少种玩法能够使得游戏结束时,第0号小伙伴所在的位置编号是\(d\)的倍数?(0也是\(d\)的倍数)、
对 \(10^9 + 7\)取模。
\(1\le m \le n \le 1000, 1 \le t \le 10^9, 1 \le d \le n\)。
设 \(dp[i]\) 为进行若干轮之后在位置 \(i\) 的方案数。 转移显然是卷积。
包装了循环卷积的定义。
\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{namespace}\NormalTok{ subtask\_acceptable\_solution}\OperatorTok{\{}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \DecValTok{1500}\OperatorTok{;}
\KeywordTok{struct}\NormalTok{ Matrix}\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ dp}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\NormalTok{ Matrix }\OperatorTok{()\{}\NormalTok{ memset}\OperatorTok{(}\NormalTok{dp}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{dp}\OperatorTok{));} \OperatorTok{\}}
\NormalTok{ Matrix }\KeywordTok{operator} \OperatorTok{*} \OperatorTok{(}\AttributeTok{const}\NormalTok{ Matrix }\OperatorTok{\&}\NormalTok{ rhs}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ Matrix Res}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)}\NormalTok{ Res}\OperatorTok{.}\NormalTok{dp}\OperatorTok{[(}\NormalTok{i }\OperatorTok{+}\NormalTok{ j}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ n}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{Res}\OperatorTok{.}\NormalTok{dp}\OperatorTok{[(}\NormalTok{i }\OperatorTok{+}\NormalTok{ j}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ n}\OperatorTok{]} \OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ rhs}\OperatorTok{.}\NormalTok{dp}\OperatorTok{[}\NormalTok{j}\OperatorTok{]} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\ControlFlowTok{return}\NormalTok{ Res}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\};}
\NormalTok{ Matrix pow}\OperatorTok{(}\NormalTok{Matrix a}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ b}\OperatorTok{)\{}
\NormalTok{ Matrix ans }\OperatorTok{=}\NormalTok{ a}\OperatorTok{;}\NormalTok{ b}\OperatorTok{{-}{-};}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{b}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{b }\OperatorTok{\&} \DecValTok{1}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ ans }\OperatorTok{*}\NormalTok{ a}\OperatorTok{;}
\NormalTok{ a }\OperatorTok{=}\NormalTok{ a }\OperatorTok{*}\NormalTok{ a}\OperatorTok{;}
\NormalTok{ b }\OperatorTok{\textgreater{}\textgreater{}=} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}
\ControlFlowTok{return}\NormalTok{ ans}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ work}\OperatorTok{()\{}
\NormalTok{ Matrix a}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ m}\OperatorTok{)}\NormalTok{ a}\OperatorTok{.}\NormalTok{dp}\OperatorTok{[}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]]} \OperatorTok{++;}
\NormalTok{ Matrix Ans }\OperatorTok{=}\NormalTok{ pow}\OperatorTok{(}\NormalTok{a}\OperatorTok{,}\NormalTok{ t}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textless{}}\NormalTok{ n}\OperatorTok{;}\NormalTok{ i }\OperatorTok{+=}\NormalTok{ d}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=} \OperatorTok{(}\NormalTok{ans }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ Ans}\OperatorTok{.}\NormalTok{dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{);}
\OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{} \CommentTok{//freopen("in.txt", "r", stdin);}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{m}\OperatorTok{)(}\NormalTok{t}\OperatorTok{)(}\NormalTok{d}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ m}\OperatorTok{)}\NormalTok{ A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ read}\OperatorTok{()} \OperatorTok{\%}\NormalTok{ n}\OperatorTok{;}
\NormalTok{ subtask\_acceptable\_solution}\OperatorTok{::}\NormalTok{work}\OperatorTok{();}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsection{Round 8}\label{round-8}
\subsubsection{A. 双挂}\label{a.-ux53ccux6302}
今年期中考试考了《程序设计》、《算法设计》和《数据结构》共三门课。由于考试太难了,好多同学都挂科了。班里一共\(n\)个人,其中\(a\)个人挂了《程序设计》,\(b\)个人挂了《算法设计》,\(c\)个人挂了《数据结构》。
如果一个同学挂了恰好两门课,那么我们就说他“双挂”了。
给出\(n,a,b,c\),问最少有多少同学“双挂”了。
\(0 \le a, b, c \le n, n \le 10^9\)
设三门课挂科的人对应集合分别为 \(\mathbb{A}, \mathbb{B}, \mathbb{C}\)
显然并不是所有人都会挂科目。
\(|\mathbb{A} \cup \mathbb{B} \cup \mathbb{C}| = |\mathbb{A}| + |\mathbb{B}| + |\mathbb{C}| - |\mathbb{A} \cap \mathbb{B}| - |\mathbb{A} \cap \mathbb{C}| - |\mathbb{B} \cap \mathbb{C}| + |\mathbb{A} \cap \mathbb{B} \cap \mathbb{C}| \le n\)
移项得
为了方便:设 \(S = \mathbb{A} \cap \mathbb{B} \cap \mathbb{C}\)
\(\left(|\mathbb{A} \cap \mathbb{B}| - |S|\right) + \left(|\mathbb{A} \cap \mathbb{C}| - |S|\right) + \left(|\mathbb{B} \cap \mathbb{C}| - |S|\right) \ge |\mathbb{A}| + |\mathbb{B}| + |\mathbb{C}| + |S| - n - 3|S|\)
答案取值为
\(|\mathbb{A}| + |\mathbb{B}| + |\mathbb{C}| -2|S| - n\),其中 \(|S|\)
越大 答案越小,其最大取值就是
\(\max{ \{ \mathbb{A}, \mathbb{B}, \mathbb{C} \} }\)
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{LL n}\OperatorTok{,}\NormalTok{ a}\OperatorTok{,}\NormalTok{ b}\OperatorTok{,}\NormalTok{ c}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{a}\OperatorTok{)(}\NormalTok{b}\OperatorTok{)(}\NormalTok{c}\OperatorTok{);}
\NormalTok{printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld}\StringTok{"}\OperatorTok{,}\NormalTok{ max}\OperatorTok{(}\DecValTok{0}\BuiltInTok{LL}\OperatorTok{,}\NormalTok{ a }\OperatorTok{+}\NormalTok{ b }\OperatorTok{+}\NormalTok{ c }\OperatorTok{{-}} \DecValTok{2} \OperatorTok{*}\NormalTok{ min}\OperatorTok{(}\NormalTok{a}\OperatorTok{,}\NormalTok{ min}\OperatorTok{(}\NormalTok{b}\OperatorTok{,}\NormalTok{ c}\OperatorTok{))} \OperatorTok{{-}}\NormalTok{ n}\OperatorTok{));}
\end{Highlighting}
\end{Shaded}
\subsubsection{B. DDL选手}\label{b.-ddlux9009ux624b}
DDL选手总是在最后做作业。
有\(n\)个作业,第\(i\)个作业的DDL时间是\(d_i\),做这个作业需要\(t_i\)的时间。
做作业要一心一意,所以不能同时做两个作业。如果现在开始做第\(i\)个作业,那么接下来\(t_i\)的时间都要做这个作业,不能做别的。
DDL选手总是先做DDL时间早的作业。如果两个作业的DDL时间一样,那么DDL选手会先做其中编号小的
为DDL选手设计每个作业开始做的时间,使得DDL选手先做DDL早的作业(如果两个作业的DDL时间一样,那么先做其中编号小的),而且每个作业都能在DDL时间之前做完(时间是连续的,“之前”的意思是,最晚恰好这个时间完成。)。在保证完成的前提下,尽可能把开始做作业的时间往后推。(也就是如果有多个方案可以做完作业,选择开始时间最晚的方案。可以证明,最优方案中,每一个作业的开始时间都不早于其他方案的开始时间。输出这个最优方案。)
\(n \le 10^5, t_i \le 10^4\)
依照题意反向模拟。
\begin{Shaded}
\begin{Highlighting}[]
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{2e5} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\PreprocessorTok{\#define int }\DataTypeTok{long}\PreprocessorTok{ }\DataTypeTok{long}\PreprocessorTok{ }
\KeywordTok{struct} \DataTypeTok{HomeWork\_t}\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ d}\OperatorTok{,}\NormalTok{ t}\OperatorTok{,}\NormalTok{ id}\OperatorTok{;}
\OperatorTok{\}}\NormalTok{H}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];} \DataTypeTok{int}\NormalTok{ n }\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ Ans}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{bool}\NormalTok{ CMP}\OperatorTok{(}\AttributeTok{const} \DataTypeTok{HomeWork\_t} \OperatorTok{\&}\NormalTok{ A}\OperatorTok{,} \AttributeTok{const} \DataTypeTok{HomeWork\_t} \OperatorTok{\&}\NormalTok{ B}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return} \OperatorTok{(}\NormalTok{A}\OperatorTok{.}\NormalTok{d }\OperatorTok{\textless{}}\NormalTok{ B}\OperatorTok{.}\NormalTok{d}\OperatorTok{)} \OperatorTok{||} \OperatorTok{(}\NormalTok{A}\OperatorTok{.}\NormalTok{d }\OperatorTok{==}\NormalTok{ B}\OperatorTok{.}\NormalTok{d }\OperatorTok{\&\&}\NormalTok{ A}\OperatorTok{.}\NormalTok{id }\OperatorTok{\textless{}}\NormalTok{ B}\OperatorTok{.}\NormalTok{id}\OperatorTok{);} \OperatorTok{\}}
\PreprocessorTok{\#undef int }
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Read}\OperatorTok{(}\NormalTok{H}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{d}\OperatorTok{)(}\NormalTok{H}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{t}\OperatorTok{),}\NormalTok{ H}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{id }\OperatorTok{=}\NormalTok{ i}\OperatorTok{;}
\NormalTok{ sort}\OperatorTok{(}\NormalTok{H }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ H }\OperatorTok{+} \DecValTok{1} \OperatorTok{+}\NormalTok{ n}\OperatorTok{,}\NormalTok{ CMP}\OperatorTok{);}
\PreprocessorTok{\#define int }\DataTypeTok{long}\PreprocessorTok{ }\DataTypeTok{long}\PreprocessorTok{ }
\DataTypeTok{int}\NormalTok{ Last }\OperatorTok{=}\NormalTok{ LLONG\_MAX}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ n}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textgreater{}=} \DecValTok{1}\OperatorTok{;}\NormalTok{ i}\OperatorTok{{-}{-})\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{Last }\OperatorTok{\textgreater{}=}\NormalTok{ H}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{d}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ Last }\OperatorTok{=}\NormalTok{ H}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{d }\OperatorTok{{-}}\NormalTok{ H}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{t}\OperatorTok{;}
\NormalTok{ Ans}\OperatorTok{[}\NormalTok{H}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{id}\OperatorTok{]} \OperatorTok{=}\NormalTok{ Last}\OperatorTok{;}
\OperatorTok{\}} \ControlFlowTok{else} \OperatorTok{\{}
\NormalTok{ Last }\OperatorTok{=} \OperatorTok{(}\NormalTok{Last}\OperatorTok{)} \OperatorTok{{-}}\NormalTok{ H}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{t}\OperatorTok{;}
\NormalTok{ Ans}\OperatorTok{[}\NormalTok{H}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{id}\OperatorTok{]} \OperatorTok{=}\NormalTok{ Last}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%lld\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ Ans}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\PreprocessorTok{\#undef int}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{C. 约数链}\label{c.-ux7ea6ux6570ux94fe}
如果\(n\)个数\(a_1,\dots,a_n\)满足:对于\(1\leq i < n\),\(a_i\)是\(a_{i+1}\)的约数,那么\(a_1,\dots,a_n\)被称为一个约数链。一个约数链的权值是它所包含的\(n\)个数的乘积。
给出\(n,m\),只允许使用不超过\(m\)的正整数组成长为\(n\)的约数链,会有非常多的方式。求所有这些方式得到的约数链的权值之和。
\(n \le 10, m \le 10^7\)
可以 \textbf{dp} 一下,设 \(dp[n][k]\) 为长度为 \(n\) 的约数链,结尾是
\(k\) 的权值和。 转移为刷表。复杂度做到
\(\mathcal{O}(nm\log m)\)。根本过不去。
设 \(f_n(k) = dp[n][k]\) 其中 函数 \(f_k(x)\) 为积性函数。
对于 \(a \perp b\) 设 \(c = a \times b\) 对于 \(f_n(c)\)
所统计的方案中的每一个数字都可以质因数分解成两组,一组是只属于 \(a\)
的质因子,另一组是只属于 \(b\)
的质因子。手举几个栗子就能发现符合积性函数的性质。
\begin{Shaded}
\begin{Highlighting}[]
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{1e7} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ MOD }\OperatorTok{=} \FloatTok{1e9} \OperatorTok{+} \DecValTok{7}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ np}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ prime}\OperatorTok{[}\DataTypeTok{int}\OperatorTok{(}\FloatTok{1e6}\OperatorTok{)],}\NormalTok{ tot }\OperatorTok{=} \DecValTok{0}\OperatorTok{,}\NormalTok{ Mid}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ Init}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ n}\OperatorTok{)\{}
\NormalTok{ Mid}\OperatorTok{[}\DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ np}\OperatorTok{[}\DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=} \DecValTok{2}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textless{}=}\NormalTok{ n}\OperatorTok{;}\NormalTok{ i}\OperatorTok{++)\{}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{np}\OperatorTok{[}\NormalTok{i}\OperatorTok{])}\NormalTok{ prime}\OperatorTok{[++}\NormalTok{tot}\OperatorTok{]} \OperatorTok{=}\NormalTok{ i}\OperatorTok{,}\NormalTok{ Mid}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ i}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ j }\OperatorTok{=} \DecValTok{1}\OperatorTok{;}\NormalTok{ j }\OperatorTok{\textless{}=}\NormalTok{ tot }\OperatorTok{\&\&}\NormalTok{ prime}\OperatorTok{[}\NormalTok{j}\OperatorTok{]} \OperatorTok{*}\NormalTok{ i }\OperatorTok{\textless{}=}\NormalTok{ n}\OperatorTok{;}\NormalTok{ j}\OperatorTok{++)\{}
\DataTypeTok{int}\NormalTok{ x }\OperatorTok{=}\NormalTok{ prime}\OperatorTok{[}\NormalTok{j}\OperatorTok{]} \OperatorTok{*}\NormalTok{ i}\OperatorTok{;}
\NormalTok{ np}\OperatorTok{[}\NormalTok{x}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}\NormalTok{ Mid}\OperatorTok{[}\NormalTok{x}\OperatorTok{]} \OperatorTok{=}\NormalTok{ prime}\OperatorTok{[}\NormalTok{j}\OperatorTok{];}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{i }\OperatorTok{\%}\NormalTok{ prime}\OperatorTok{[}\NormalTok{j}\OperatorTok{]} \OperatorTok{==} \DecValTok{0}\OperatorTok{)} \ControlFlowTok{break}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ m}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ dp}\OperatorTok{[}\DataTypeTok{int}\OperatorTok{(}\DecValTok{20}\OperatorTok{)][}\DataTypeTok{int}\OperatorTok{(}\DecValTok{30}\OperatorTok{)];} \DataTypeTok{int}\NormalTok{ Ans}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{long} \DataTypeTok{long}\NormalTok{ t }\OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{} \CommentTok{//freopen("in.txt", "r", stdin);}
\NormalTok{ Init}\OperatorTok{(}\FloatTok{1e7} \OperatorTok{+} \DecValTok{2}\OperatorTok{);}\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{m}\OperatorTok{);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{S}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ tot}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ now }\OperatorTok{=}\NormalTok{ prime}\OperatorTok{[}\NormalTok{S}\OperatorTok{];}
\NormalTok{ memset}\OperatorTok{(}\NormalTok{dp}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{dp}\OperatorTok{));}
\NormalTok{ t }\OperatorTok{=} \DecValTok{1}\OperatorTok{;} \ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ j }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ t }\OperatorTok{\textless{}=}\NormalTok{ m}\OperatorTok{;}\NormalTok{ j}\OperatorTok{++,}\NormalTok{ t }\OperatorTok{*=}\NormalTok{ now}\OperatorTok{)}\NormalTok{ dp}\OperatorTok{[}\DecValTok{1}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{=}\NormalTok{ t}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{2}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)\{}
\NormalTok{ t }\OperatorTok{=} \DecValTok{1}\OperatorTok{;} \ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ j }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ t }\OperatorTok{\textless{}=}\NormalTok{ m}\OperatorTok{;}\NormalTok{ j}\OperatorTok{++,}\NormalTok{ t }\OperatorTok{*=}\NormalTok{ now}\OperatorTok{)} \OperatorTok{\{}
\DataTypeTok{int} \OperatorTok{\&}\NormalTok{ans }\OperatorTok{=}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{k}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ j}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=} \OperatorTok{(}\NormalTok{ans }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{][}\NormalTok{k}\OperatorTok{]} \OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ t }\OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}
\NormalTok{ t }\OperatorTok{=} \DecValTok{1}\OperatorTok{;} \ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ j }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}\NormalTok{ t }\OperatorTok{\textless{}=}\NormalTok{ m}\OperatorTok{;}\NormalTok{ j}\OperatorTok{++,}\NormalTok{ t }\OperatorTok{*=}\NormalTok{ now}\OperatorTok{)}\NormalTok{ Ans}\OperatorTok{[}\NormalTok{t}\OperatorTok{]} \OperatorTok{=}\NormalTok{ dp}\OperatorTok{[}\NormalTok{n}\OperatorTok{][}\NormalTok{j}\OperatorTok{];}
\OperatorTok{\}}
\NormalTok{ Ans}\OperatorTok{[}\DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{2}\OperatorTok{,}\NormalTok{ m}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{Ans}\OperatorTok{[}\NormalTok{i}\OperatorTok{])} \ControlFlowTok{continue}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ A }\OperatorTok{=}\NormalTok{ i}\OperatorTok{,}\NormalTok{ B }\OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{A }\OperatorTok{\%}\NormalTok{ Mid}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{==} \DecValTok{0}\OperatorTok{)}\NormalTok{ A }\OperatorTok{/=}\NormalTok{ Mid}\OperatorTok{[}\NormalTok{i}\OperatorTok{],}\NormalTok{ B }\OperatorTok{*=}\NormalTok{ Mid}\OperatorTok{[}\NormalTok{i}\OperatorTok{];}
\NormalTok{ Ans}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\NormalTok{Ans}\OperatorTok{[}\NormalTok{A}\OperatorTok{]} \OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ Ans}\OperatorTok{[}\NormalTok{B}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ m}\OperatorTok{)}\NormalTok{ ans }\OperatorTok{=} \OperatorTok{(}\NormalTok{ans }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ Ans}\OperatorTok{[}\NormalTok{i}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{);}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{D. 连通}\label{d.-ux8fdeux901a}
给出一张无向图,求有多少种方案使得删除三条边,使原图不连通。
\(n,m \le 2000\)
考虑枚举删除的第一条边是那条,然后问题转化成了
求在一张图中删除两条边使图不连通的方案数。
先删去一条边,考虑剩下的图的形态, -
图已经不连通了,那答案的贡献就是每条边两两配对的方案数 -
图是联通的,考虑对图建一个生成树,考虑删边的方式 - 删除两条非树边
一定不合法,之前的树仍然存在,保证了图的连通性。 -
删除一条树边,一条非树边
被计入答案,当且仅当,这条树边被这条非树边唯一覆盖。这里的正确性显然。 -
删除两条非树边 被计入答案,当且仅当,这两条边被相同的一组非树边覆盖。 -
证明可以考虑,对于原树来说,如果删除两条树边,断成三份,如果两条边被相同的一组非树边覆盖,没有边可以联通断开的中间部分。
-
考虑如何实现,对每一条非树边赋一个随机权值,然后树边的权值定义为覆盖其的每一条非树边的权值异或和。统计删除两条边后图不联通的方案数,就转化为,统计有多少种方案选出两条边,使其权值相同。
树上差分即可,异或有自反性,其标记在 LCA 处自动消失。
\begin{Shaded}
\begin{Highlighting}[]
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \DecValTok{4100}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ head}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\KeywordTok{struct}\NormalTok{ edges}\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ node}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ nxt}\OperatorTok{;}
\OperatorTok{\}}\NormalTok{edge}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];} \DataTypeTok{int}\NormalTok{ tot }\OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ MOD }\OperatorTok{=} \FloatTok{1e9} \OperatorTok{+} \DecValTok{7}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ m}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ ToEid}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ ToNid}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ book}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\NormalTok{u64 tag}\OperatorTok{[}\DataTypeTok{int}\OperatorTok{(}\DecValTok{2100}\OperatorTok{)];}
\DataTypeTok{bool}\NormalTok{ vis}\OperatorTok{[}\DataTypeTok{int}\OperatorTok{(}\DecValTok{2100}\OperatorTok{)];}
\NormalTok{u64 EVal}\OperatorTok{[}\DataTypeTok{int}\OperatorTok{(}\DecValTok{2100}\OperatorTok{)];}
\DataTypeTok{void}\NormalTok{ add}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ v}\OperatorTok{)\{}
\NormalTok{ tot}\OperatorTok{++;}
\NormalTok{ edge}\OperatorTok{[}\NormalTok{tot}\OperatorTok{].}\NormalTok{node }\OperatorTok{=}\NormalTok{ v}\OperatorTok{;}
\NormalTok{ edge}\OperatorTok{[}\NormalTok{tot}\OperatorTok{].}\NormalTok{nxt }\OperatorTok{=}\NormalTok{ head}\OperatorTok{[}\NormalTok{u}\OperatorTok{];}
\NormalTok{ head}\OperatorTok{[}\NormalTok{u}\OperatorTok{]} \OperatorTok{=}\NormalTok{ tot}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{u64 gen}\OperatorTok{()\{}
\NormalTok{ u64 A }\OperatorTok{=}\NormalTok{ rand}\OperatorTok{()} \OperatorTok{*}\DecValTok{1}\BuiltInTok{ull}\OperatorTok{*}\NormalTok{ rand}\OperatorTok{()} \OperatorTok{*}\NormalTok{ rand}\OperatorTok{()} \OperatorTok{*}\DecValTok{1}\BuiltInTok{ull}\OperatorTok{*}\NormalTok{ rand}\OperatorTok{();}
\NormalTok{ u64 B }\OperatorTok{=}\NormalTok{ rand}\OperatorTok{()} \OperatorTok{*}\DecValTok{1}\BuiltInTok{ull}\OperatorTok{*}\NormalTok{ rand}\OperatorTok{()} \OperatorTok{*}\NormalTok{ rand}\OperatorTok{()} \OperatorTok{*}\DecValTok{1}\BuiltInTok{ull}\OperatorTok{*}\NormalTok{ rand}\OperatorTok{();}
\ControlFlowTok{return}\NormalTok{ A }\OperatorTok{+}\NormalTok{ B }\OperatorTok{+}\NormalTok{ rand}\OperatorTok{();}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ dfs0}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ now}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ f}\OperatorTok{)\{}
\NormalTok{ vis}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ head}\OperatorTok{[}\NormalTok{now}\OperatorTok{];}\NormalTok{ i }\OperatorTok{;}\NormalTok{ i }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{nxt}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ ex }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{node}\OperatorTok{;} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{ex }\OperatorTok{==}\NormalTok{ f}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{book}\OperatorTok{[}\NormalTok{i}\OperatorTok{])} \ControlFlowTok{continue}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{vis}\OperatorTok{[}\NormalTok{ex}\OperatorTok{])}\NormalTok{ dfs0}\OperatorTok{(}\NormalTok{ex}\OperatorTok{,}\NormalTok{ now}\OperatorTok{);}
\ControlFlowTok{else} \OperatorTok{\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{ EVal}\OperatorTok{[}\NormalTok{ToNid}\OperatorTok{[}\NormalTok{i}\OperatorTok{]])} \ControlFlowTok{continue}\OperatorTok{;}
\NormalTok{ u64 g }\OperatorTok{=}\NormalTok{ EVal}\OperatorTok{[}\NormalTok{ToNid}\OperatorTok{[}\NormalTok{i}\OperatorTok{]]} \OperatorTok{=}\NormalTok{ gen}\OperatorTok{();}
\NormalTok{ tag}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{\^{}=}\NormalTok{ g}\OperatorTok{;}\NormalTok{ tag}\OperatorTok{[}\NormalTok{ex}\OperatorTok{]} \OperatorTok{\^{}=}\NormalTok{ g}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ dfs1}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ now}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ f}\OperatorTok{)\{}
\NormalTok{ u64 }\OperatorTok{\&}\NormalTok{ntag }\OperatorTok{=}\NormalTok{ tag}\OperatorTok{[}\NormalTok{now}\OperatorTok{];}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ head}\OperatorTok{[}\NormalTok{now}\OperatorTok{];}\NormalTok{ i }\OperatorTok{;}\NormalTok{ i }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{nxt}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ ex }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{node}\OperatorTok{;} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{ex }\OperatorTok{==}\NormalTok{ f}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{book}\OperatorTok{[}\NormalTok{i}\OperatorTok{])} \ControlFlowTok{continue}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{EVal}\OperatorTok{[}\NormalTok{ToNid}\OperatorTok{[}\NormalTok{i}\OperatorTok{]])}\NormalTok{ dfs1}\OperatorTok{(}\NormalTok{ex}\OperatorTok{,}\NormalTok{ now}\OperatorTok{),}\NormalTok{ EVal}\OperatorTok{[}\NormalTok{ToNid}\OperatorTok{[}\NormalTok{i}\OperatorTok{]]} \OperatorTok{=}\NormalTok{ tag}\OperatorTok{[}\NormalTok{ex}\OperatorTok{],}\NormalTok{ ntag }\OperatorTok{\^{}=}\NormalTok{ tag}\OperatorTok{[}\NormalTok{ex}\OperatorTok{];}
\OperatorTok{\}}
\OperatorTok{\}}
\NormalTok{map}\OperatorTok{\textless{}}\NormalTok{u64}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ M}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ inv6 }\OperatorTok{=} \DecValTok{166666668}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}\CommentTok{// freopen("in.txt", "r", stdin);}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{m}\OperatorTok{);} \DataTypeTok{int} \OperatorTok{*}\NormalTok{seed }\OperatorTok{=} \KeywordTok{new} \DataTypeTok{int}\OperatorTok{;}\NormalTok{ srand}\OperatorTok{(*}\NormalTok{seed }\OperatorTok{+}\NormalTok{ n }\OperatorTok{+}\NormalTok{ m}\OperatorTok{);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ m}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{u}\OperatorTok{)(}\NormalTok{v}\OperatorTok{);}
\NormalTok{ ToEid}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ tot }\OperatorTok{+} \DecValTok{1}\OperatorTok{;}\NormalTok{ ToNid}\OperatorTok{[}\NormalTok{tot }\OperatorTok{+} \DecValTok{1}\OperatorTok{]} \OperatorTok{=}\NormalTok{ ToNid}\OperatorTok{[}\NormalTok{tot }\OperatorTok{+} \DecValTok{2}\OperatorTok{]} \OperatorTok{=}\NormalTok{ i}\OperatorTok{;}
\NormalTok{ add}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{);}\NormalTok{ add}\OperatorTok{(}\NormalTok{v}\OperatorTok{,}\NormalTok{ u}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ Pans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ m}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ rs }\OperatorTok{=}\NormalTok{ ToEid}\OperatorTok{[}\NormalTok{i}\OperatorTok{];}
\NormalTok{ book}\OperatorTok{[}\NormalTok{rs}\OperatorTok{]} \OperatorTok{=}\NormalTok{ book}\OperatorTok{[}\NormalTok{rs }\OperatorTok{\^{}} \DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ memset}\OperatorTok{(}\NormalTok{tag}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{tag}\OperatorTok{));}\NormalTok{ memset}\OperatorTok{(}\NormalTok{vis}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{vis}\OperatorTok{));}\NormalTok{ memset}\OperatorTok{(}\NormalTok{EVal}\OperatorTok{,} \DecValTok{0}\OperatorTok{,} \KeywordTok{sizeof}\OperatorTok{(}\NormalTok{EVal}\OperatorTok{));}\NormalTok{ M}\OperatorTok{.}\NormalTok{clear}\OperatorTok{();}
\NormalTok{ dfs0}\OperatorTok{(}\DecValTok{1}\OperatorTok{,} \DecValTok{1}\OperatorTok{);}
\DataTypeTok{bool}\NormalTok{ pass }\OperatorTok{=} \KeywordTok{true}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \ControlFlowTok{if}\OperatorTok{(!}\NormalTok{vis}\OperatorTok{[}\NormalTok{j}\OperatorTok{])} \OperatorTok{\{}\NormalTok{ pass }\OperatorTok{=} \KeywordTok{false}\OperatorTok{;} \ControlFlowTok{break}\OperatorTok{;} \OperatorTok{\}}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{pass}\OperatorTok{)} \OperatorTok{\{} \DataTypeTok{int}\NormalTok{ t }\OperatorTok{=}\NormalTok{ m }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{;}\NormalTok{ Pans }\OperatorTok{=} \OperatorTok{(}\NormalTok{Pans }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+} \OperatorTok{(}\NormalTok{t }\OperatorTok{*} \OperatorTok{(}\NormalTok{t }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)))} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}\NormalTok{ book}\OperatorTok{[}\NormalTok{rs}\OperatorTok{]} \OperatorTok{=}\NormalTok{ book}\OperatorTok{[}\NormalTok{rs }\OperatorTok{\^{}} \DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;} \ControlFlowTok{continue}\OperatorTok{;} \OperatorTok{\}}
\NormalTok{ dfs1}\OperatorTok{(}\DecValTok{1}\OperatorTok{,} \DecValTok{1}\OperatorTok{);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ m}\OperatorTok{)} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{i }\OperatorTok{!=}\NormalTok{ j}\OperatorTok{)}\NormalTok{ M}\OperatorTok{[}\NormalTok{EVal}\OperatorTok{[}\NormalTok{j}\OperatorTok{]]} \OperatorTok{++;}
\DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\NormalTok{map}\OperatorTok{\textless{}}\NormalTok{u64}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{\textgreater{}} \OperatorTok{::}\NormalTok{ iterator i }\OperatorTok{=}\NormalTok{ M}\OperatorTok{.}\NormalTok{begin}\OperatorTok{();}\NormalTok{ i }\OperatorTok{!=}\NormalTok{ M}\OperatorTok{.}\NormalTok{end}\OperatorTok{();}\NormalTok{ i}\OperatorTok{++)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{i}\OperatorTok{{-}\textgreater{}}\NormalTok{first }\OperatorTok{==} \DecValTok{0}\BuiltInTok{ull}\OperatorTok{)}
\NormalTok{ ans }\OperatorTok{=} \OperatorTok{(}\NormalTok{ans }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+} \OperatorTok{(}\NormalTok{i}\OperatorTok{{-}\textgreater{}}\NormalTok{second }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*} \OperatorTok{(}\NormalTok{i}\OperatorTok{{-}\textgreater{}}\NormalTok{second }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{))} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{,}
\NormalTok{ ans }\OperatorTok{=} \OperatorTok{(}\NormalTok{ans }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+} \OperatorTok{(((}\NormalTok{m }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \OperatorTok{{-}} \OperatorTok{(}\NormalTok{i}\OperatorTok{{-}\textgreater{}}\NormalTok{second}\OperatorTok{))} \OperatorTok{*}\DecValTok{2}\BuiltInTok{ll}\OperatorTok{*} \OperatorTok{(}\NormalTok{i}\OperatorTok{{-}\textgreater{}}\NormalTok{second}\OperatorTok{))} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\ControlFlowTok{else}
\NormalTok{ ans }\OperatorTok{=} \OperatorTok{(}\NormalTok{ans }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+} \OperatorTok{(}\NormalTok{i}\OperatorTok{{-}\textgreater{}}\NormalTok{second }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*} \OperatorTok{(}\NormalTok{i}\OperatorTok{{-}\textgreater{}}\NormalTok{second }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{))} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ Pans }\OperatorTok{=} \OperatorTok{(}\NormalTok{ans }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ Pans}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\NormalTok{ book}\OperatorTok{[}\NormalTok{rs}\OperatorTok{]} \OperatorTok{=}\NormalTok{ book}\OperatorTok{[}\NormalTok{rs }\OperatorTok{\^{}} \DecValTok{1}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{(}\NormalTok{Pans }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ inv6 }\OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{));}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsection{Round 9}\label{round-9}
降智场。 \#\#\# A. 最大公约数
给出一个长度为 \(n\) 的序列。 设
\(k = \max_{i < j}{\operatorname{gcd}(A_i, A_j)}\), 求出: - \(k\) -
\(\sum_{i < j}\limits{[\operatorname{gcd}(A_i, A_j)=k]}\) -
\(\sum_{i < j}\limits{[\operatorname{gcd}(A_i, A_j)=k]A_i \times A_j}\)
枚举一下 \(gcd\) 可能以这个数字为 \(gcd\) 的两个数字一定是 \(gcd\)
的倍数。 从大到小枚举 \(gcd\) 查询有多少倍数,如果大于 \(2\) ,这个
\(gcd\) 就可以。 剩余的两项在得到 \(k\) 的基础上判断即可。
\begin{Shaded}
\begin{Highlighting}[]
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ MOD }\OperatorTok{=} \DecValTok{998244353}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{2e6} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ inv2 }\OperatorTok{=} \DecValTok{499122177}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ book}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ A}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ n}\OperatorTok{,}\NormalTok{ MAX }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ K }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ Read}\OperatorTok{(}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]),}\NormalTok{ book}\OperatorTok{[}\NormalTok{A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]]++,}\NormalTok{ MAX }\OperatorTok{=}\NormalTok{ max}\OperatorTok{(}\NormalTok{MAX}\OperatorTok{,}\NormalTok{ A}\OperatorTok{[}\NormalTok{i}\OperatorTok{]);}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ MAX}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textgreater{}=} \DecValTok{1}\OperatorTok{;}\NormalTok{ i}\OperatorTok{{-}{-})\{}
\DataTypeTok{int}\NormalTok{ cnt }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ j }\OperatorTok{=}\NormalTok{ i}\OperatorTok{;}\NormalTok{ j }\OperatorTok{\textless{}=}\NormalTok{ MAX}\OperatorTok{;}\NormalTok{ j }\OperatorTok{+=}\NormalTok{ i}\OperatorTok{)}\NormalTok{ cnt }\OperatorTok{+=}\NormalTok{ book}\OperatorTok{[}\NormalTok{j}\OperatorTok{];}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{cnt }\OperatorTok{\textgreater{}=} \DecValTok{2}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ K }\OperatorTok{=}\NormalTok{ i}\OperatorTok{;} \ControlFlowTok{break}\OperatorTok{;} \OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ SUM }\OperatorTok{=} \DecValTok{0}\OperatorTok{,}\NormalTok{ ans1 }\OperatorTok{=} \DecValTok{0}\OperatorTok{,}\NormalTok{ ans2 }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ K}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textless{}=}\NormalTok{ MAX}\OperatorTok{;}\NormalTok{ i }\OperatorTok{+=}\NormalTok{ K}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{book}\OperatorTok{[}\NormalTok{i}\OperatorTok{])} \ControlFlowTok{continue}\OperatorTok{;}
\NormalTok{ ans1 }\OperatorTok{+=}\NormalTok{ book}\OperatorTok{[}\NormalTok{i}\OperatorTok{];}\NormalTok{ SUM }\OperatorTok{=} \OperatorTok{(}\NormalTok{SUM }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ book}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ i }\OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ ans1 }\OperatorTok{=} \OperatorTok{((}\NormalTok{ans1 }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*} \OperatorTok{(}\NormalTok{ans1 }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{))} \OperatorTok{\%}\NormalTok{ MOD }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ inv2}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ K}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textless{}=}\NormalTok{ MAX}\OperatorTok{;}\NormalTok{ i }\OperatorTok{+=}\NormalTok{ K}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{book}\OperatorTok{[}\NormalTok{i}\OperatorTok{])} \ControlFlowTok{continue}\OperatorTok{;}
\NormalTok{ ans2 }\OperatorTok{=} \OperatorTok{(}\NormalTok{ans2 }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+} \OperatorTok{(} \OperatorTok{(}\NormalTok{SUM }\OperatorTok{{-}}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{{-}}\NormalTok{ i }\OperatorTok{+}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ i }\OperatorTok{\%}\NormalTok{ MOD }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ book}\OperatorTok{[}\NormalTok{i}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ MOD }\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{ }\SpecialCharTok{\%d}\StringTok{ }\SpecialCharTok{\%d\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ K}\OperatorTok{,}\NormalTok{ ans1}\OperatorTok{,}\NormalTok{ ans2 }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ inv2 }\OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{);}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{B. 紧急出口}\label{b.-ux7d27ux6025ux51faux53e3}
在一个走廊里共有 \(N\) 个楼梯,其中 \(N\) 个楼梯之间有 \(N-1\) 个间隔,
个间隔会贴有一个紧急出口的指示牌指向左侧或者右侧。
问在所有的 \(2N−1\) 种指示牌的贴法当中,有多少种贴法满足恰好有 \(M\)
个楼梯(包括最左最右)的左右侧的紧急出口标识都不指向自己。
输出的答案对 \(998244353\) 取模。 \(N \le 10^3, M \le 10^9\)
\paragraph{倍增DP}\label{ux500dux589edp}
待填
\paragraph{隔板法}\label{ux9694ux677fux6cd5}
称 “左右侧的紧急出口标识都不指向自己的点” 为关键点。
考虑如果选定了一个点是关键点,那么他们两边就形如
\texttt{\textless{}\ o\ \textgreater{}} ,可以发现相邻的两个关键点
\(O_1, O_2\) 之间贴牌的方案一定形如
\(...< O_1 > o > ... > o < ... < o < O_2 >...\)
显然,其实是把原序列分成连续的 \(2m\)
段,每段内方向相同,相邻两段方向相反。 隔板即可。
考虑组合数的通项公式,项数只有 \(m\) 项。
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ m}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{m}\OperatorTok{);}\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,}\NormalTok{ C}\OperatorTok{(}\NormalTok{n}\OperatorTok{,} \DecValTok{2} \OperatorTok{*}\NormalTok{ m }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{));}
\end{Highlighting}
\end{Shaded}
\subsubsection{C. 合影}\label{c.-ux5408ux5f71}
众所周知, ACM ICPC 是三人组队参赛的比赛。现在在 ICPC WF2020 现场,有
\(k\) 支参赛队伍要站成一排拍照!
摄影师小Z想促进队伍间的交流,于是小Z要求每个队伍的3个队员不能都挨在一起
现在小Z想问一问你,这 \(k\)
支队伍有多少种拍照方式呢?由于数字很大,所以对 \(998244353\)
取模就好\textasciitilde{} \(k \le 10^6\)
要求是每一队的三个队员不能全部挨在一起。 无法直接全部满足,考虑容斥。
假如所有人按任意顺序排列有 \((3k)!\) 种排列方式。
显然会算入了不合法的情况,考虑去除这些
钦定哪一队全部挨在一起了,如果强制某一队挨在一起可以吧那一队捆成一个人
这样的方案数为 \((3k - 2)!\),算入答案就是
\(\dbinom{k}{1}(3k - 2)!(3!)^1\) 最后一个是因为同一队中的队员也有顺序。
显然会去除多了,如果有多队同时不合法,这些方案会被去除多次,钦定哪两队全部挨在一起了,算入答案就是
\(\dbinom{k}{2}(3k - 4)!(3!)^2\)。
显然加多了……
然后就是容斥原理了。
答案应该是
\(\sum_{i=0}^{k}\limits{(-1)^i\dbinom{k}{i}(3k - 2i)!(3!)^i}\)
\begin{Shaded}
\begin{Highlighting}[]
\DataTypeTok{int}\NormalTok{ C}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ m}\OperatorTok{)\{} \ControlFlowTok{return}\NormalTok{ frac}\OperatorTok{[}\NormalTok{n}\OperatorTok{]} \OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ ifrac}\OperatorTok{[}\NormalTok{n }\OperatorTok{{-}}\NormalTok{ m}\OperatorTok{]} \OperatorTok{\%}\NormalTok{ MOD }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ ifrac}\OperatorTok{[}\NormalTok{m}\OperatorTok{]} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{}
\DataTypeTok{int}\NormalTok{ k}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{k}\OperatorTok{);}\NormalTok{ Init}\OperatorTok{((}\NormalTok{k }\OperatorTok{+} \DecValTok{1}\OperatorTok{)} \OperatorTok{*} \DecValTok{3}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ ans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ k}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ tans }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\NormalTok{ tans }\OperatorTok{=}\NormalTok{ C}\OperatorTok{(}\NormalTok{k}\OperatorTok{,}\NormalTok{ i}\OperatorTok{)} \OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ frac}\OperatorTok{[}\DecValTok{3} \OperatorTok{*}\NormalTok{ k }\OperatorTok{{-}} \DecValTok{2} \OperatorTok{*}\NormalTok{ i}\OperatorTok{]} \OperatorTok{\%}\NormalTok{ MOD }\OperatorTok{*}\DecValTok{1}\BuiltInTok{ll}\OperatorTok{*}\NormalTok{ pow}\OperatorTok{(}\DecValTok{6}\OperatorTok{,}\NormalTok{ i}\OperatorTok{,}\NormalTok{ MOD}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\NormalTok{ tans }\OperatorTok{=} \OperatorTok{(}\NormalTok{i }\OperatorTok{\&} \DecValTok{1}\OperatorTok{)} \OperatorTok{?}\NormalTok{ MOD }\OperatorTok{{-}}\NormalTok{ tans }\OperatorTok{:}\NormalTok{ tans}\OperatorTok{;}
\NormalTok{ ans }\OperatorTok{=} \OperatorTok{(}\NormalTok{ans }\OperatorTok{+}\DecValTok{0}\BuiltInTok{ll}\OperatorTok{+}\NormalTok{ tans}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ MOD}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d}\StringTok{"}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{);}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\subsubsection{D. 路径}\label{d.-ux8defux5f84}
给定一个\(n\)个顶点的无根树,顶点编号 \(1 ~ n\)。
同时给定树上的 \(k\) 条带权路径,要求支持以下操作:
\begin{itemize}
\tightlist
\item
\texttt{1\ k} ,删除第 \(k\) 条带权路径。
\item
\texttt{2\ k\ v} ,将第 \(k\) 条带权路径的权值修改为 \(v\) 。
\item
\texttt{3\ p} ,给定一个树上节点 \(p\)
,询问所有没有被删去的带权路径中,不与该节点相交的所有路径中的最小权值。
\(n, k, q \le 10^5\)
\end{itemize}
\paragraph{\texorpdfstring{做法一:树剖 + \texttt{std::set} 维护标记
标记永久化线段树}{做法一:树剖 + std::set 维护标记 标记永久化线段树}}\label{ux505aux6cd5ux4e00ux6811ux5256-stdset-ux7ef4ux62a4ux6807ux8bb0-ux6807ux8bb0ux6c38ux4e45ux5316ux7ebfux6bb5ux6811}
\(\mathcal{O}((k + q)\log_2^3{n})\) 先树剖,路径补集仍然是线段树上
\(\log_2(n)\)
段,可以在这些段里面加入可选的边,为了防止删除重复,\texttt{std::set}
内层数据类型为 \texttt{pair\textless{}int,\ int\textgreater{}}
分别存储路径的权值和编号。然后就直接做就好了。 后记:被出题人卡成了
\(30\) ……。
\begin{Shaded}
\begin{Highlighting}[]
\PreprocessorTok{\#define rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{l}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{r}\OperatorTok{)}\PreprocessorTok{ }\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{l}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{\_\_}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{r}\OperatorTok{;}\PreprocessorTok{ }\NormalTok{i}\PreprocessorTok{ }\OperatorTok{\textless{}=}\PreprocessorTok{ }\NormalTok{\_\_}\OperatorTok{;}\PreprocessorTok{ }\NormalTok{i}\OperatorTok{++)}
\KeywordTok{using} \KeywordTok{namespace}\NormalTok{ std}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ k}\OperatorTok{,}\NormalTok{ p}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{2e6} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ head}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\KeywordTok{struct}\NormalTok{ edges}\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ node}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ nxt}\OperatorTok{;}
\OperatorTok{\}}\NormalTok{edge}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];} \DataTypeTok{int}\NormalTok{ tot }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\DataTypeTok{void}\NormalTok{ add}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ v}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ tot}\OperatorTok{++;}
\NormalTok{ edge}\OperatorTok{[}\NormalTok{tot}\OperatorTok{].}\NormalTok{node }\OperatorTok{=}\NormalTok{ v}\OperatorTok{;}
\NormalTok{ edge}\OperatorTok{[}\NormalTok{tot}\OperatorTok{].}\NormalTok{nxt }\OperatorTok{=}\NormalTok{ head}\OperatorTok{[}\NormalTok{u}\OperatorTok{];}
\NormalTok{ head}\OperatorTok{[}\NormalTok{u}\OperatorTok{]} \OperatorTok{=}\NormalTok{ tot}\OperatorTok{;}
\OperatorTok{\}}
\KeywordTok{struct}\NormalTok{ Path}\OperatorTok{\{} \DataTypeTok{int}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{;}\NormalTok{ Path}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ a}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ b}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ c}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ u }\OperatorTok{=}\NormalTok{ a}\OperatorTok{;}\NormalTok{ v }\OperatorTok{=}\NormalTok{ b}\OperatorTok{;}\NormalTok{ Val }\OperatorTok{=}\NormalTok{ c}\OperatorTok{;} \OperatorTok{\}}\NormalTok{ Path}\OperatorTok{()\{\}} \OperatorTok{\}}\NormalTok{ P}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ dfn}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ rnk}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ dfc}\OperatorTok{,}\NormalTok{ dep}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ top}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ fa}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ si}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ son}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ dfs0}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ now}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ f}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ dp}\OperatorTok{)\{}
\NormalTok{ fa}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{=}\NormalTok{ f}\OperatorTok{;}\NormalTok{ dep}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{=}\NormalTok{ dp}\OperatorTok{;} \DataTypeTok{int} \OperatorTok{\&}\NormalTok{Mid }\OperatorTok{=}\NormalTok{ son}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{=} \DecValTok{0}\OperatorTok{;} \DataTypeTok{int} \OperatorTok{\&}\NormalTok{Si }\OperatorTok{=}\NormalTok{ si}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ head}\OperatorTok{[}\NormalTok{now}\OperatorTok{];}\NormalTok{ i }\OperatorTok{;}\NormalTok{ i }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{nxt}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ ex }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{node}\OperatorTok{;} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{ex }\OperatorTok{==}\NormalTok{ f}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;}
\NormalTok{ dfs0}\OperatorTok{(}\NormalTok{ex}\OperatorTok{,}\NormalTok{ now}\OperatorTok{,}\NormalTok{ dp }\OperatorTok{+} \DecValTok{1}\OperatorTok{);}\NormalTok{ Si }\OperatorTok{+=}\NormalTok{ si}\OperatorTok{[}\NormalTok{ex}\OperatorTok{];} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{si}\OperatorTok{[}\NormalTok{ex}\OperatorTok{]} \OperatorTok{\textgreater{}}\NormalTok{ si}\OperatorTok{[}\NormalTok{Mid}\OperatorTok{])}\NormalTok{ Mid }\OperatorTok{=}\NormalTok{ ex}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ dfs1}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ now}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ f}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ tp}\OperatorTok{)\{}
\NormalTok{ dfn}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{=} \OperatorTok{++}\NormalTok{dfc}\OperatorTok{;}\NormalTok{ top}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{=}\NormalTok{ tp}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{son}\OperatorTok{[}\NormalTok{now}\OperatorTok{])}\NormalTok{ dfs1}\OperatorTok{(}\NormalTok{son}\OperatorTok{[}\NormalTok{now}\OperatorTok{],}\NormalTok{ now}\OperatorTok{,}\NormalTok{ tp}\OperatorTok{);}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ head}\OperatorTok{[}\NormalTok{now}\OperatorTok{];}\NormalTok{ i }\OperatorTok{;}\NormalTok{ i }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{nxt}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ ex }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{node}\OperatorTok{;} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{ex }\OperatorTok{==}\NormalTok{ f }\OperatorTok{||}\NormalTok{ ex }\OperatorTok{==}\NormalTok{ son}\OperatorTok{[}\NormalTok{now}\OperatorTok{])} \ControlFlowTok{continue}\OperatorTok{;}
\NormalTok{ dfs1}\OperatorTok{(}\NormalTok{ex}\OperatorTok{,}\NormalTok{ now}\OperatorTok{,}\NormalTok{ ex}\OperatorTok{);}
\OperatorTok{\}}
\OperatorTok{\}}
\KeywordTok{namespace}\NormalTok{ SegmentTree}\OperatorTok{\{}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{3e6} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ ch}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\DecValTok{2}\OperatorTok{];}\NormalTok{ set}\OperatorTok{\textless{}}\NormalTok{pair}\OperatorTok{\textless{}}\DataTypeTok{int} \OperatorTok{,}\DataTypeTok{int}\OperatorTok{\textgreater{},}\NormalTok{ less }\OperatorTok{\textless{}}\NormalTok{pair}\OperatorTok{\textless{}}\DataTypeTok{int} \OperatorTok{,}\DataTypeTok{int}\OperatorTok{\textgreater{}} \OperatorTok{\textgreater{}} \OperatorTok{\textgreater{}}\NormalTok{ v}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ tot }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\PreprocessorTok{\#define ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{ch}\OperatorTok{[}\NormalTok{o}\OperatorTok{][}\DecValTok{0}\OperatorTok{])}
\PreprocessorTok{\#define rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{ch}\OperatorTok{[}\NormalTok{o}\OperatorTok{][}\DecValTok{1}\OperatorTok{])}
\PreprocessorTok{\#define make }\OperatorTok{(}\NormalTok{tot}\OperatorTok{++,}\PreprocessorTok{ }\NormalTok{ch}\OperatorTok{[}\NormalTok{tot}\OperatorTok{][}\DecValTok{0}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{ch}\OperatorTok{[}\NormalTok{tot}\OperatorTok{][}\DecValTok{1}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\DecValTok{0}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{v}\OperatorTok{[}\NormalTok{tot}\OperatorTok{].}\NormalTok{clear}\OperatorTok{(),}\PreprocessorTok{ }\NormalTok{tot}\OperatorTok{)}
\DataTypeTok{int}\NormalTok{ Groot}\OperatorTok{()\{} \ControlFlowTok{return}\NormalTok{ make}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ build}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{==}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return} \OperatorTok{(}\DataTypeTok{void}\OperatorTok{)}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{insert}\OperatorTok{(}\NormalTok{make\_pair}\OperatorTok{(}\NormalTok{INT\_MAX}\OperatorTok{,} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{));}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{L }\OperatorTok{+}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)} \OperatorTok{=}\NormalTok{ make}\OperatorTok{;}\NormalTok{ rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)} \OperatorTok{=}\NormalTok{ make}\OperatorTok{;}\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{insert}\OperatorTok{(}\NormalTok{make\_pair}\OperatorTok{(}\NormalTok{INT\_MAX}\OperatorTok{,} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{));}
\NormalTok{ build}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}\NormalTok{ build}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ update\_add}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowl}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowr}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ V}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ id}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textgreater{}}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return} \OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ nowl }\OperatorTok{\&\&}\NormalTok{ nowr }\OperatorTok{\textless{}=}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return} \OperatorTok{(}\DataTypeTok{void}\OperatorTok{)}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{insert}\OperatorTok{(}\NormalTok{make\_pair}\OperatorTok{(}\NormalTok{V}\OperatorTok{,}\NormalTok{ id}\OperatorTok{));}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{nowl }\OperatorTok{+}\NormalTok{ nowr}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update\_add}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ V}\OperatorTok{,}\NormalTok{ id}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{R }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update\_add}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ V}\OperatorTok{,}\NormalTok{ id}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ update\_del}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowl}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowr}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ V}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ id}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textgreater{}}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return} \OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ nowl }\OperatorTok{\&\&}\NormalTok{ nowr }\OperatorTok{\textless{}=}\NormalTok{ R}\OperatorTok{)} \ControlFlowTok{return} \OperatorTok{(}\DataTypeTok{void}\OperatorTok{)}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{erase}\OperatorTok{(}\NormalTok{make\_pair}\OperatorTok{(}\NormalTok{V}\OperatorTok{,}\NormalTok{ id}\OperatorTok{));}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{nowl }\OperatorTok{+}\NormalTok{ nowr}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update\_del}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ V}\OperatorTok{,}\NormalTok{ id}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{R }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update\_del}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{,}\NormalTok{ L}\OperatorTok{,}\NormalTok{ R}\OperatorTok{,}\NormalTok{ V}\OperatorTok{,}\NormalTok{ id}\OperatorTok{);}
\OperatorTok{\}}
\NormalTok{ pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int} \OperatorTok{\textgreater{}}\NormalTok{ query}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowl}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowr}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ p}\OperatorTok{,}\NormalTok{ pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int} \OperatorTok{\textgreater{}}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ make\_pair}\OperatorTok{(}\NormalTok{INT\_MAX}\OperatorTok{,} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{))\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{nowl }\OperatorTok{==}\NormalTok{ nowr}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ min}\OperatorTok{(}\NormalTok{ans}\OperatorTok{,} \OperatorTok{*(}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{begin}\OperatorTok{()));}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{nowl }\OperatorTok{+}\NormalTok{ nowr}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}\NormalTok{ ans }\OperatorTok{=}\NormalTok{ min}\OperatorTok{(}\NormalTok{ans}\OperatorTok{,} \OperatorTok{*(}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{begin}\OperatorTok{()));}
\ControlFlowTok{return}\NormalTok{ p }\OperatorTok{\textless{}=}\NormalTok{ mid }\OperatorTok{?}\NormalTok{ query}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ p}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{)} \OperatorTok{:}\NormalTok{ query}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{,}\NormalTok{ p}\OperatorTok{,}\NormalTok{ ans}\OperatorTok{);}
\OperatorTok{\}}
\OperatorTok{\}} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{query}\OperatorTok{;} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{update\_add}\OperatorTok{;} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{Groot}\OperatorTok{;}
\KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{build}\OperatorTok{;} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{update\_del}\OperatorTok{;}
\PreprocessorTok{\#define fi }\NormalTok{first}
\PreprocessorTok{\#define se }\NormalTok{second}
\NormalTok{vector}\OperatorTok{\textless{}}\NormalTok{pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int} \OperatorTok{\textgreater{}} \OperatorTok{\textgreater{}}\NormalTok{ TMP}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ root }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\DataTypeTok{void}\NormalTok{ AddWithoutPath}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ v}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ Val}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ id}\OperatorTok{)\{}
\NormalTok{ TMP}\OperatorTok{.}\NormalTok{clear}\OperatorTok{();}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{top}\OperatorTok{[}\NormalTok{u}\OperatorTok{]} \OperatorTok{!=}\NormalTok{ top}\OperatorTok{[}\NormalTok{v}\OperatorTok{])\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{dep}\OperatorTok{[}\NormalTok{top}\OperatorTok{[}\NormalTok{u}\OperatorTok{]]} \OperatorTok{\textless{}}\NormalTok{ dep}\OperatorTok{[}\NormalTok{top}\OperatorTok{[}\NormalTok{v}\OperatorTok{]])}\NormalTok{ swap}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{);}
\NormalTok{ TMP}\OperatorTok{.}\NormalTok{push\_back}\OperatorTok{(}\NormalTok{make\_pair}\OperatorTok{(}\NormalTok{dfn}\OperatorTok{[}\NormalTok{top}\OperatorTok{[}\NormalTok{u}\OperatorTok{]],}\NormalTok{ dfn}\OperatorTok{[}\NormalTok{u}\OperatorTok{]));}\NormalTok{ u }\OperatorTok{=}\NormalTok{ fa}\OperatorTok{[}\NormalTok{top}\OperatorTok{[}\NormalTok{u}\OperatorTok{]];}
\OperatorTok{\}}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{dep}\OperatorTok{[}\NormalTok{u}\OperatorTok{]} \OperatorTok{\textless{}}\NormalTok{ dep}\OperatorTok{[}\NormalTok{v}\OperatorTok{])}\NormalTok{ swap}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{);}
\NormalTok{ TMP}\OperatorTok{.}\NormalTok{push\_back}\OperatorTok{(}\NormalTok{make\_pair}\OperatorTok{(}\NormalTok{dfn}\OperatorTok{[}\NormalTok{v}\OperatorTok{],}\NormalTok{ dfn}\OperatorTok{[}\NormalTok{u}\OperatorTok{]));}
\NormalTok{ sort}\OperatorTok{(}\NormalTok{TMP}\OperatorTok{.}\NormalTok{begin}\OperatorTok{(),}\NormalTok{ TMP}\OperatorTok{.}\NormalTok{end}\OperatorTok{());}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ TMP}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{2}\OperatorTok{)}\NormalTok{ update\_add}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ TMP}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{se }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ TMP}\OperatorTok{[}\NormalTok{i }\OperatorTok{+} \DecValTok{1}\OperatorTok{].}\NormalTok{fi }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{,}\NormalTok{ id}\OperatorTok{);}
\NormalTok{ update\_add}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ TMP}\OperatorTok{[}\DecValTok{0}\OperatorTok{].}\NormalTok{fi }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{,}\NormalTok{ id}\OperatorTok{);}
\NormalTok{ update\_add}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ TMP}\OperatorTok{[}\NormalTok{TMP}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{].}\NormalTok{se }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{,}\NormalTok{ id}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ DelWithoutPath}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ v}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ Val}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ id}\OperatorTok{)\{}
\NormalTok{ TMP}\OperatorTok{.}\NormalTok{clear}\OperatorTok{();}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{top}\OperatorTok{[}\NormalTok{u}\OperatorTok{]} \OperatorTok{!=}\NormalTok{ top}\OperatorTok{[}\NormalTok{v}\OperatorTok{])\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{dep}\OperatorTok{[}\NormalTok{top}\OperatorTok{[}\NormalTok{u}\OperatorTok{]]} \OperatorTok{\textless{}}\NormalTok{ dep}\OperatorTok{[}\NormalTok{top}\OperatorTok{[}\NormalTok{v}\OperatorTok{]])}\NormalTok{ swap}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{);}
\NormalTok{ TMP}\OperatorTok{.}\NormalTok{push\_back}\OperatorTok{(}\NormalTok{make\_pair}\OperatorTok{(}\NormalTok{dfn}\OperatorTok{[}\NormalTok{top}\OperatorTok{[}\NormalTok{u}\OperatorTok{]],}\NormalTok{ dfn}\OperatorTok{[}\NormalTok{u}\OperatorTok{]));}\NormalTok{ u }\OperatorTok{=}\NormalTok{ fa}\OperatorTok{[}\NormalTok{top}\OperatorTok{[}\NormalTok{u}\OperatorTok{]];}
\OperatorTok{\}}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{dep}\OperatorTok{[}\NormalTok{u}\OperatorTok{]} \OperatorTok{\textless{}}\NormalTok{ dep}\OperatorTok{[}\NormalTok{v}\OperatorTok{])}\NormalTok{ swap}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{);}
\NormalTok{ TMP}\OperatorTok{.}\NormalTok{push\_back}\OperatorTok{(}\NormalTok{make\_pair}\OperatorTok{(}\NormalTok{dfn}\OperatorTok{[}\NormalTok{v}\OperatorTok{],}\NormalTok{ dfn}\OperatorTok{[}\NormalTok{u}\OperatorTok{]));}
\NormalTok{ sort}\OperatorTok{(}\NormalTok{TMP}\OperatorTok{.}\NormalTok{begin}\OperatorTok{(),}\NormalTok{ TMP}\OperatorTok{.}\NormalTok{end}\OperatorTok{());}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ TMP}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{2}\OperatorTok{)}\NormalTok{ update\_del}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ TMP}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{se }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ TMP}\OperatorTok{[}\NormalTok{i }\OperatorTok{+} \DecValTok{1}\OperatorTok{].}\NormalTok{fi }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{,}\NormalTok{ id}\OperatorTok{);}
\NormalTok{ update\_del}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ TMP}\OperatorTok{[}\DecValTok{0}\OperatorTok{].}\NormalTok{fi }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{,}\NormalTok{ id}\OperatorTok{);}
\NormalTok{ update\_del}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ TMP}\OperatorTok{[}\NormalTok{TMP}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{].}\NormalTok{se }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ Val}\OperatorTok{,}\NormalTok{ id}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()\{} \CommentTok{// freopen("in.txt", "r", stdin);}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{k}\OperatorTok{)(}\NormalTok{p}\OperatorTok{);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{u}\OperatorTok{)(}\NormalTok{v}\OperatorTok{);}
\NormalTok{ add}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{);}\NormalTok{ add}\OperatorTok{(}\NormalTok{v}\OperatorTok{,}\NormalTok{ u}\OperatorTok{);}
\OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ k}\OperatorTok{)} \OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ p}\OperatorTok{,}\NormalTok{ q}\OperatorTok{,}\NormalTok{ v}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{p}\OperatorTok{)(}\NormalTok{q}\OperatorTok{)(}\NormalTok{v}\OperatorTok{);}
\NormalTok{ P}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=}\NormalTok{ Path}\OperatorTok{(}\NormalTok{p}\OperatorTok{,}\NormalTok{ q}\OperatorTok{,}\NormalTok{ v}\OperatorTok{);}
\OperatorTok{\}}
\NormalTok{ dfs0}\OperatorTok{(}\DecValTok{1}\OperatorTok{,} \DecValTok{1}\OperatorTok{,} \DecValTok{1}\OperatorTok{);}\NormalTok{ dfs1}\OperatorTok{(}\DecValTok{1}\OperatorTok{,} \DecValTok{1}\OperatorTok{,} \DecValTok{1}\OperatorTok{);}
\NormalTok{ root }\OperatorTok{=}\NormalTok{ Groot}\OperatorTok{();}\NormalTok{ build}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ k}\OperatorTok{)}\NormalTok{ AddWithoutPath}\OperatorTok{(}\NormalTok{P}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{u}\OperatorTok{,}\NormalTok{ P}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{v}\OperatorTok{,}\NormalTok{ P}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{Val}\OperatorTok{,}\NormalTok{ i}\OperatorTok{);}
\ControlFlowTok{while}\OperatorTok{(}\NormalTok{p}\OperatorTok{{-}{-})\{}
\DataTypeTok{int}\NormalTok{ opt}\OperatorTok{,}\NormalTok{ k}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{opt}\OperatorTok{)(}\NormalTok{k}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{opt }\OperatorTok{==} \DecValTok{1}\OperatorTok{)\{}
\NormalTok{ DelWithoutPath}\OperatorTok{(}\NormalTok{P}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{u}\OperatorTok{,}\NormalTok{ P}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{v}\OperatorTok{,}\NormalTok{ P}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{Val}\OperatorTok{,}\NormalTok{ k}\OperatorTok{);}
\OperatorTok{\}} \ControlFlowTok{else} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{opt }\OperatorTok{==} \DecValTok{2}\OperatorTok{)\{}
\NormalTok{ DelWithoutPath}\OperatorTok{(}\NormalTok{P}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{u}\OperatorTok{,}\NormalTok{ P}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{v}\OperatorTok{,}\NormalTok{ P}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{Val}\OperatorTok{,}\NormalTok{ k}\OperatorTok{);}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{P}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{Val}\OperatorTok{);}
\NormalTok{ AddWithoutPath}\OperatorTok{(}\NormalTok{P}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{u}\OperatorTok{,}\NormalTok{ P}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{v}\OperatorTok{,}\NormalTok{ P}\OperatorTok{[}\NormalTok{k}\OperatorTok{].}\NormalTok{Val}\OperatorTok{,}\NormalTok{ k}\OperatorTok{);}
\OperatorTok{\}} \ControlFlowTok{else} \OperatorTok{\{}
\NormalTok{ pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int} \OperatorTok{\textgreater{}}\NormalTok{ r }\OperatorTok{=}\NormalTok{ query}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{,}\NormalTok{ dfn}\OperatorTok{[}\NormalTok{k}\OperatorTok{]);}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ r}\OperatorTok{.}\NormalTok{first }\OperatorTok{\textless{}}\NormalTok{ INT\_MAX }\OperatorTok{?}\NormalTok{ r}\OperatorTok{.}\NormalTok{first }\OperatorTok{:} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{);}
\OperatorTok{\}}
\OperatorTok{\}}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\paragraph{做法二:线段树维护路径交集 +
二分最小值}\label{ux505aux6cd5ux4e8cux7ebfux6bb5ux6811ux7ef4ux62a4ux8defux5f84ux4ea4ux96c6-ux4e8cux5206ux6700ux5c0fux503c}
\begin{quote}
巧妙绝伦的做法。
\end{quote}
要求回答的是:不与节点 \(p\) 相交的所有路径中的最小权值。
考虑二分一个最小权值 \(x\),然后判断是所有权值小于 \(x\)
的路径是不是全都和点 \(p\) 有交。
如果把所有路径按照权值排序,那么成为答案的那条路径之前的路径一定都和点
\(p\) 有交,这就可以直接二分答案了。
但是路径需要支持删除和修改。 显然需要数据结构。
一个显然的事实是:两条路径的交
也是一条路径(定义一个点或者空都属于路径)。
线段树就可以快速求出一段路径区间内所有路径的交集路径。
所有路径按照权值排好序后的一个前缀全部和点 \(p\)
有交,等价于,这个前缀所有的路径的交集和点 \(p\) 有交。
对于删除操作,可以考虑在线段树对应操作上打删除标记。对于修改操作,因为没有强制在线,可以考虑一开始把这条路径的所有权值排好序后加入线段树,然后对于当前无用的版本,打上删除标记即可。对于一次修改,转化成一次删除和一次恢复操作。
当然平衡树可以轻易完成这样的工作,在平衡树上维护树上路径交集,写不出来啊…
这样就可以直接用线段树求出某个前缀的所有路径的交集路径了。线段树合并信息时,需要询问
\texttt{LCA},算上二分,这样的单次询问复杂度可以做到
\(\mathcal{O}(\log k \log w \log n)\)(倍增 \texttt{LCA}),或者
\(\mathcal{O}(\log k \log w)\)(\(\mathcal{O}(n) - \mathcal{O}(1)\)
\texttt{LCA})。
注意到线段树本身就是一个分治的结构,可以直接在线段树上二分,这样就可以做到
\(\mathcal{O}(\log k \log n)\)(倍增 \texttt{LCA}),或者
\(\mathcal{O}(\log k)\)(\(\mathcal{O}(n) - \mathcal{O}(1)\)
\texttt{LCA})。
我的实现是 倍增 \texttt{LCA} + 线段树二分,算上预处理,总时间复杂度为
\(\mathcal{O}(n\log(n) + q\log(q+k)\log n)\)
\begin{Shaded}
\begin{Highlighting}[]
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{2e5} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ head}\OperatorTok{[}\NormalTok{\_}\OperatorTok{],}\NormalTok{ tot }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\KeywordTok{struct}\NormalTok{ edges}\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ node}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ nxt}\OperatorTok{;}
\OperatorTok{\}}\NormalTok{edge}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ add}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ v}\OperatorTok{)\{}
\NormalTok{ tot}\OperatorTok{++;}
\NormalTok{ edge}\OperatorTok{[}\NormalTok{tot}\OperatorTok{].}\NormalTok{node }\OperatorTok{=}\NormalTok{ v}\OperatorTok{;}
\NormalTok{ edge}\OperatorTok{[}\NormalTok{tot}\OperatorTok{].}\NormalTok{nxt }\OperatorTok{=}\NormalTok{ head}\OperatorTok{[}\NormalTok{u}\OperatorTok{];}
\NormalTok{ head}\OperatorTok{[}\NormalTok{u}\OperatorTok{]} \OperatorTok{=}\NormalTok{ tot}\OperatorTok{;}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,}\NormalTok{ k}\OperatorTok{,}\NormalTok{ q}\OperatorTok{;}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ LOG }\OperatorTok{=} \DecValTok{18}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ fa}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\NormalTok{LOG }\OperatorTok{+} \DecValTok{2}\OperatorTok{],}\NormalTok{ dep}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{void}\NormalTok{ dfs0}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ now}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ f}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ dp}\OperatorTok{)\{}
\NormalTok{ fa}\OperatorTok{[}\NormalTok{now}\OperatorTok{][}\DecValTok{0}\OperatorTok{]} \OperatorTok{=}\NormalTok{ f}\OperatorTok{;}\NormalTok{ dep}\OperatorTok{[}\NormalTok{now}\OperatorTok{]} \OperatorTok{=}\NormalTok{ dp}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ head}\OperatorTok{[}\NormalTok{now}\OperatorTok{];}\NormalTok{ i }\OperatorTok{;}\NormalTok{ i }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{nxt}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ ex }\OperatorTok{=}\NormalTok{ edge}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{node}\OperatorTok{;} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{ex }\OperatorTok{==}\NormalTok{ f}\OperatorTok{)} \ControlFlowTok{continue}\OperatorTok{;}
\NormalTok{ dfs0}\OperatorTok{(}\NormalTok{ex}\OperatorTok{,}\NormalTok{ now}\OperatorTok{,}\NormalTok{ dp }\OperatorTok{+} \DecValTok{1}\OperatorTok{);}
\OperatorTok{\}}
\OperatorTok{\}}
\NormalTok{map }\OperatorTok{\textless{}}\NormalTok{ pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{\textgreater{}} \OperatorTok{,} \DataTypeTok{int} \OperatorTok{\textgreater{}}\NormalTok{ Mem}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ LCA}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ v}\OperatorTok{)\{}
\NormalTok{ pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ P }\OperatorTok{=}\NormalTok{ make\_pair}\OperatorTok{(}\NormalTok{min}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{),}\NormalTok{ max}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{));}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{Mem}\OperatorTok{.}\NormalTok{count}\OperatorTok{(}\NormalTok{P}\OperatorTok{))} \ControlFlowTok{return}\NormalTok{ Mem}\OperatorTok{[}\NormalTok{P}\OperatorTok{];}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{dep}\OperatorTok{[}\NormalTok{u}\OperatorTok{]} \OperatorTok{\textless{}}\NormalTok{ dep}\OperatorTok{[}\NormalTok{v}\OperatorTok{])}\NormalTok{ swap}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ d }\OperatorTok{=}\NormalTok{ dep}\OperatorTok{[}\NormalTok{u}\OperatorTok{]} \OperatorTok{{-}}\NormalTok{ dep}\OperatorTok{[}\NormalTok{v}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ x }\OperatorTok{=}\NormalTok{ u}\OperatorTok{,}\NormalTok{ y }\OperatorTok{=}\NormalTok{ v}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ LOG}\OperatorTok{)} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{d }\OperatorTok{\&} \OperatorTok{(}\DecValTok{1} \OperatorTok{\textless{}\textless{}}\NormalTok{ i}\OperatorTok{))}\NormalTok{ x }\OperatorTok{=}\NormalTok{ fa}\OperatorTok{[}\NormalTok{x}\OperatorTok{][}\NormalTok{i}\OperatorTok{];}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{x }\OperatorTok{==}\NormalTok{ y}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ x}\OperatorTok{;}
\ControlFlowTok{for}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=}\NormalTok{ LOG}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textgreater{}=} \DecValTok{0}\OperatorTok{;}\NormalTok{ i}\OperatorTok{{-}{-})\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{fa}\OperatorTok{[}\NormalTok{x}\OperatorTok{][}\NormalTok{i}\OperatorTok{]} \OperatorTok{==}\NormalTok{ fa}\OperatorTok{[}\NormalTok{y}\OperatorTok{][}\NormalTok{i}\OperatorTok{])} \ControlFlowTok{continue}\OperatorTok{;}
\NormalTok{ x }\OperatorTok{=}\NormalTok{ fa}\OperatorTok{[}\NormalTok{x}\OperatorTok{][}\NormalTok{i}\OperatorTok{];}\NormalTok{ y }\OperatorTok{=}\NormalTok{ fa}\OperatorTok{[}\NormalTok{y}\OperatorTok{][}\NormalTok{i}\OperatorTok{];}
\OperatorTok{\}}
\ControlFlowTok{return}\NormalTok{ Mem}\OperatorTok{[}\NormalTok{P}\OperatorTok{]} \OperatorTok{=}\NormalTok{ fa}\OperatorTok{[}\NormalTok{x}\OperatorTok{][}\DecValTok{0}\OperatorTok{];}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ InitQuery}\OperatorTok{()\{}
\NormalTok{ dfs0}\OperatorTok{(}\DecValTok{1}\OperatorTok{,} \DecValTok{1}\OperatorTok{,} \DecValTok{1}\OperatorTok{);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{j}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ LOG}\OperatorTok{)}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)}\NormalTok{ fa}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j}\OperatorTok{]} \OperatorTok{=}\NormalTok{ fa}\OperatorTok{[}\NormalTok{fa}\OperatorTok{[}\NormalTok{i}\OperatorTok{][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]][}\NormalTok{j }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{];}
\OperatorTok{\}}
\KeywordTok{struct} \DataTypeTok{Path\_t}\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ id}\OperatorTok{,}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{,}\NormalTok{ w}\OperatorTok{,}\NormalTok{ ver}\OperatorTok{;}
\DataTypeTok{Path\_t}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ a}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ b}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ c}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ d}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ e}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ id }\OperatorTok{=}\NormalTok{ a}\OperatorTok{;}\NormalTok{ u }\OperatorTok{=}\NormalTok{ b}\OperatorTok{;}\NormalTok{ v }\OperatorTok{=}\NormalTok{ c}\OperatorTok{;}\NormalTok{ w }\OperatorTok{=}\NormalTok{ d}\OperatorTok{;}\NormalTok{ ver }\OperatorTok{=}\NormalTok{ e}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{Path\_t}\OperatorTok{()} \OperatorTok{\{} \OperatorTok{\}}
\OperatorTok{\};}
\DataTypeTok{bool}\NormalTok{ CMP}\OperatorTok{(}\AttributeTok{const} \DataTypeTok{Path\_t} \OperatorTok{\&}\NormalTok{ A}\OperatorTok{,} \AttributeTok{const} \DataTypeTok{Path\_t} \OperatorTok{\&}\NormalTok{ B}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return}\NormalTok{ A}\OperatorTok{.}\NormalTok{w }\OperatorTok{\textless{}}\NormalTok{ B}\OperatorTok{.}\NormalTok{w}\OperatorTok{;} \OperatorTok{\}}
\KeywordTok{struct} \DataTypeTok{Q\_t}\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ type}\OperatorTok{,}\NormalTok{ a}\OperatorTok{,}\NormalTok{ b}\OperatorTok{;}
\DataTypeTok{Q\_t}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ x}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ y}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ z}\OperatorTok{)} \OperatorTok{\{}\NormalTok{ type }\OperatorTok{=}\NormalTok{ x}\OperatorTok{;}\NormalTok{ a }\OperatorTok{=}\NormalTok{ y}\OperatorTok{;}\NormalTok{ b }\OperatorTok{=}\NormalTok{ z}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{Q\_t}\OperatorTok{()} \OperatorTok{\{\}}
\OperatorTok{\}}\NormalTok{Q}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ nowv}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\NormalTok{vector}\OperatorTok{\textless{}}\DataTypeTok{Path\_t}\OperatorTok{\textgreater{}}\NormalTok{ P}\OperatorTok{;}
\NormalTok{vector}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ Pv}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\DataTypeTok{int}\NormalTok{ dis}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ v}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{return}\NormalTok{ dep}\OperatorTok{[}\NormalTok{u}\OperatorTok{]} \OperatorTok{+}\NormalTok{ dep}\OperatorTok{[}\NormalTok{v}\OperatorTok{]} \OperatorTok{{-}} \OperatorTok{(}\NormalTok{dep}\OperatorTok{[}\NormalTok{LCA}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{)]} \OperatorTok{\textless{}\textless{}} \DecValTok{1}\OperatorTok{);} \OperatorTok{\}}
\NormalTok{pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ cross}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ u0}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ v0}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ u1}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ v1}\OperatorTok{)} \OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ t0 }\OperatorTok{=}\NormalTok{ LCA}\OperatorTok{(}\NormalTok{u0}\OperatorTok{,}\NormalTok{ v0}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ t1 }\OperatorTok{=}\NormalTok{ LCA}\OperatorTok{(}\NormalTok{u0}\OperatorTok{,}\NormalTok{ u1}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ t2 }\OperatorTok{=}\NormalTok{ LCA}\OperatorTok{(}\NormalTok{u0}\OperatorTok{,}\NormalTok{ v1}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ t3 }\OperatorTok{=}\NormalTok{ LCA}\OperatorTok{(}\NormalTok{v0}\OperatorTok{,}\NormalTok{ u1}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ t4 }\OperatorTok{=}\NormalTok{ LCA}\OperatorTok{(}\NormalTok{v0}\OperatorTok{,}\NormalTok{ v1}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ target0 }\OperatorTok{=}\NormalTok{ t0}\OperatorTok{;} \CommentTok{// t0 t1 t3 }
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{dep}\OperatorTok{[}\NormalTok{target0}\OperatorTok{]} \OperatorTok{\textless{}}\NormalTok{ dep}\OperatorTok{[}\NormalTok{t1}\OperatorTok{])}\NormalTok{ target0 }\OperatorTok{=}\NormalTok{ t1}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{dep}\OperatorTok{[}\NormalTok{target0}\OperatorTok{]} \OperatorTok{\textless{}}\NormalTok{ dep}\OperatorTok{[}\NormalTok{t3}\OperatorTok{])}\NormalTok{ target0 }\OperatorTok{=}\NormalTok{ t3}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ target1 }\OperatorTok{=}\NormalTok{ t0}\OperatorTok{;} \CommentTok{// t0 t2 t4}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{dep}\OperatorTok{[}\NormalTok{target1}\OperatorTok{]} \OperatorTok{\textless{}}\NormalTok{ dep}\OperatorTok{[}\NormalTok{t2}\OperatorTok{])}\NormalTok{ target1 }\OperatorTok{=}\NormalTok{ t2}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{dep}\OperatorTok{[}\NormalTok{target1}\OperatorTok{]} \OperatorTok{\textless{}}\NormalTok{ dep}\OperatorTok{[}\NormalTok{t4}\OperatorTok{])}\NormalTok{ target1 }\OperatorTok{=}\NormalTok{ t4}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{target1 }\OperatorTok{==}\NormalTok{ target0 }\OperatorTok{\&\&}\NormalTok{ dis}\OperatorTok{(}\NormalTok{target1}\OperatorTok{,}\NormalTok{ u1}\OperatorTok{)} \OperatorTok{+}\NormalTok{ dis}\OperatorTok{(}\NormalTok{target1}\OperatorTok{,}\NormalTok{ v1}\OperatorTok{)} \OperatorTok{!=}\NormalTok{ dis}\OperatorTok{(}\NormalTok{u1}\OperatorTok{,}\NormalTok{ v1}\OperatorTok{))} \ControlFlowTok{return}\NormalTok{ make\_pair}\OperatorTok{({-}}\DecValTok{1}\OperatorTok{,} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{);}
\ControlFlowTok{else} \ControlFlowTok{return}\NormalTok{ make\_pair}\OperatorTok{(}\NormalTok{target0}\OperatorTok{,}\NormalTok{ target1}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{bool}\NormalTok{ crossx}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ v}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ x}\OperatorTok{)} \OperatorTok{\{} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{u }\OperatorTok{==} \OperatorTok{{-}}\DecValTok{1} \OperatorTok{||}\NormalTok{ v }\OperatorTok{==} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{)} \ControlFlowTok{return} \KeywordTok{false}\OperatorTok{;} \ControlFlowTok{return}\NormalTok{ dis}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{)} \OperatorTok{==}\NormalTok{ dis}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ x}\OperatorTok{)} \OperatorTok{+}\NormalTok{ dis}\OperatorTok{(}\NormalTok{v}\OperatorTok{,}\NormalTok{ x}\OperatorTok{);} \OperatorTok{\}}
\KeywordTok{namespace}\NormalTok{ SegmentTree}\OperatorTok{\{} \CommentTok{// To maintain the merge path}
\KeywordTok{struct} \DataTypeTok{Node\_t}\OperatorTok{\{}
\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{;}
\DataTypeTok{bool}\NormalTok{ isDel}\OperatorTok{,}\NormalTok{ isNul}\OperatorTok{;}
\DataTypeTok{void}\NormalTok{ clear}\OperatorTok{()\{}
\NormalTok{ isDel }\OperatorTok{=} \KeywordTok{false}\OperatorTok{;}\NormalTok{ isNul }\OperatorTok{=} \KeywordTok{true}\OperatorTok{;}\NormalTok{ u }\OperatorTok{=}\NormalTok{ v }\OperatorTok{=} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\};}
\AttributeTok{const} \DataTypeTok{int}\NormalTok{ \_ }\OperatorTok{=} \FloatTok{1e6} \OperatorTok{+} \DecValTok{100}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ ch}\OperatorTok{[}\NormalTok{\_}\OperatorTok{][}\DecValTok{2}\OperatorTok{],}\NormalTok{ tot }\OperatorTok{=} \DecValTok{0}\OperatorTok{;} \DataTypeTok{Node\_t}\NormalTok{ v}\OperatorTok{[}\NormalTok{\_}\OperatorTok{];}
\PreprocessorTok{\#define ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{ch}\OperatorTok{[}\NormalTok{o}\OperatorTok{][}\DecValTok{0}\OperatorTok{])}
\PreprocessorTok{\#define rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)}\PreprocessorTok{ }\OperatorTok{(}\NormalTok{ch}\OperatorTok{[}\NormalTok{o}\OperatorTok{][}\DecValTok{1}\OperatorTok{])}
\PreprocessorTok{\#define make }\OperatorTok{(}\NormalTok{tot}\OperatorTok{++,}\PreprocessorTok{ }\NormalTok{ch}\OperatorTok{[}\NormalTok{tot}\OperatorTok{][}\DecValTok{0}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\NormalTok{ch}\OperatorTok{[}\NormalTok{tot}\OperatorTok{][}\DecValTok{1}\OperatorTok{]}\PreprocessorTok{ }\OperatorTok{=}\PreprocessorTok{ }\DecValTok{0}\OperatorTok{,}\PreprocessorTok{ }\NormalTok{v}\OperatorTok{[}\NormalTok{tot}\OperatorTok{].}\NormalTok{clear}\OperatorTok{(),}\PreprocessorTok{ }\NormalTok{tot}\OperatorTok{)}
\DataTypeTok{int}\NormalTok{ Groot}\OperatorTok{()} \OperatorTok{\{} \ControlFlowTok{return}\NormalTok{ make}\OperatorTok{;} \OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ maintain}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{isDel }\OperatorTok{=} \OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isDel }\OperatorTok{\&\&}\NormalTok{ v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isDel}\OperatorTok{);}
\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{isNul }\OperatorTok{=} \OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isNul }\OperatorTok{||}\NormalTok{ v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isNul}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{isDel }\OperatorTok{\&\&} \OperatorTok{!}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{isNul}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isDel }\OperatorTok{\&\&} \OperatorTok{!}\NormalTok{v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isDel}\OperatorTok{)}\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{u }\OperatorTok{=}\NormalTok{ v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{v }\OperatorTok{=}\NormalTok{ v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{v}\OperatorTok{;}
\ControlFlowTok{else} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isDel }\OperatorTok{\&\&} \OperatorTok{!}\NormalTok{v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isDel}\OperatorTok{)}\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{u }\OperatorTok{=}\NormalTok{ v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{v }\OperatorTok{=}\NormalTok{ v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{v}\OperatorTok{;}
\ControlFlowTok{else} \OperatorTok{\{}
\NormalTok{ pair}\OperatorTok{\textless{}}\DataTypeTok{int}\OperatorTok{,} \DataTypeTok{int}\OperatorTok{\textgreater{}}\NormalTok{ R }\OperatorTok{=}\NormalTok{ cross}\OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{v}\OperatorTok{,}\NormalTok{ v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{v}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{R}\OperatorTok{.}\NormalTok{first }\OperatorTok{==} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{isNul }\OperatorTok{=} \KeywordTok{true}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{u }\OperatorTok{=}\NormalTok{ R}\OperatorTok{.}\NormalTok{first}\OperatorTok{;}\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{v }\OperatorTok{=}\NormalTok{ R}\OperatorTok{.}\NormalTok{second}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ build}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ L}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ R}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{L }\OperatorTok{==}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\{}
\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{isNul }\OperatorTok{=} \KeywordTok{false}\OperatorTok{;}
\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{isDel }\OperatorTok{=} \OperatorTok{(}\NormalTok{P}\OperatorTok{[}\NormalTok{L }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{].}\NormalTok{ver }\OperatorTok{!=} \DecValTok{1}\OperatorTok{);}
\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{u }\OperatorTok{=}\NormalTok{ P}\OperatorTok{[}\NormalTok{L }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{].}\NormalTok{u}\OperatorTok{;}
\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{v }\OperatorTok{=}\NormalTok{ P}\OperatorTok{[}\NormalTok{L }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{].}\NormalTok{v}\OperatorTok{;}
\ControlFlowTok{return} \OperatorTok{;}
\OperatorTok{\}}\NormalTok{ ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)} \OperatorTok{=}\NormalTok{ make}\OperatorTok{;}\NormalTok{ rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)} \OperatorTok{=}\NormalTok{ make}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{L }\OperatorTok{+}\NormalTok{ R}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\NormalTok{ build}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ L}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{);}\NormalTok{ build}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ R}\OperatorTok{);}
\NormalTok{ maintain}\OperatorTok{(}\NormalTok{o}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{void}\NormalTok{ update}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowl}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowr}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ p}\OperatorTok{,} \DataTypeTok{bool}\NormalTok{ V}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{nowl }\OperatorTok{==}\NormalTok{ nowr}\OperatorTok{)} \ControlFlowTok{return} \OperatorTok{(}\DataTypeTok{void}\OperatorTok{)(}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{isDel }\OperatorTok{=}\NormalTok{ V}\OperatorTok{);}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{nowl }\OperatorTok{+}\NormalTok{ nowr}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{p }\OperatorTok{\textless{}=}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ p}\OperatorTok{,}\NormalTok{ V}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{p }\OperatorTok{\textgreater{}}\NormalTok{ mid}\OperatorTok{)}\NormalTok{ update}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{,}\NormalTok{ p}\OperatorTok{,}\NormalTok{ V}\OperatorTok{);}
\NormalTok{ maintain}\OperatorTok{(}\NormalTok{o}\OperatorTok{);}
\OperatorTok{\}}
\DataTypeTok{int}\NormalTok{ query}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ o}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowl}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ nowr}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ x}\OperatorTok{)\{}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{isNul }\OperatorTok{\&\&} \OperatorTok{!}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{isDel }\OperatorTok{\&\&}\NormalTok{ crossx}\OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{[}\NormalTok{o}\OperatorTok{].}\NormalTok{v}\OperatorTok{,}\NormalTok{ x}\OperatorTok{))} \ControlFlowTok{return} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{nowl }\OperatorTok{==}\NormalTok{ nowr}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ P}\OperatorTok{[}\NormalTok{nowl }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{].}\NormalTok{w}\OperatorTok{;}
\DataTypeTok{bool}\NormalTok{ r0 }\OperatorTok{=} \OperatorTok{!(}\NormalTok{v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isNul }\OperatorTok{||} \OperatorTok{!}\NormalTok{crossx}\OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{v}\OperatorTok{,}\NormalTok{ x}\OperatorTok{))} \OperatorTok{||}\NormalTok{ v}\OperatorTok{[}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isDel}\OperatorTok{;}
\DataTypeTok{bool}\NormalTok{ r1 }\OperatorTok{=} \OperatorTok{!(}\NormalTok{v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isNul }\OperatorTok{||} \OperatorTok{!}\NormalTok{crossx}\OperatorTok{(}\NormalTok{v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{v}\OperatorTok{,}\NormalTok{ x}\OperatorTok{))} \OperatorTok{||}\NormalTok{ v}\OperatorTok{[}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{)].}\NormalTok{isDel}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ mid }\OperatorTok{=} \OperatorTok{(}\NormalTok{nowl }\OperatorTok{+}\NormalTok{ nowr}\OperatorTok{)} \OperatorTok{\textgreater{}\textgreater{}} \DecValTok{1}\OperatorTok{;}
\ControlFlowTok{if}\OperatorTok{(!}\NormalTok{r0}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ query}\OperatorTok{(}\NormalTok{ls}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ nowl}\OperatorTok{,}\NormalTok{ mid}\OperatorTok{,}\NormalTok{ x}\OperatorTok{);} \ControlFlowTok{else} \ControlFlowTok{if}\OperatorTok{(!}\NormalTok{r1}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ query}\OperatorTok{(}\NormalTok{rs}\OperatorTok{(}\NormalTok{o}\OperatorTok{),}\NormalTok{ mid }\OperatorTok{+} \DecValTok{1}\OperatorTok{,}\NormalTok{ nowr}\OperatorTok{,}\NormalTok{ x}\OperatorTok{);} \ControlFlowTok{else} \ControlFlowTok{return} \OperatorTok{{-}}\DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}
\OperatorTok{\}} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{build}\OperatorTok{;} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{Groot}\OperatorTok{;}
\KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{query}\OperatorTok{;} \KeywordTok{using}\NormalTok{ SegmentTree}\OperatorTok{::}\NormalTok{update}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ main}\OperatorTok{()} \OperatorTok{\{}\NormalTok{ freopen}\OperatorTok{(}\StringTok{"in.txt"}\OperatorTok{,} \StringTok{"r"}\OperatorTok{,}\NormalTok{ stdin}\OperatorTok{);}
\NormalTok{ Read}\OperatorTok{(}\NormalTok{n}\OperatorTok{)(}\NormalTok{k}\OperatorTok{)(}\NormalTok{q}\OperatorTok{);}\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ n }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \OperatorTok{\{} \DataTypeTok{int}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{u}\OperatorTok{)(}\NormalTok{v}\OperatorTok{);}\NormalTok{ add}\OperatorTok{(}\NormalTok{u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{);}\NormalTok{ add}\OperatorTok{(}\NormalTok{v}\OperatorTok{,}\NormalTok{ u}\OperatorTok{);} \OperatorTok{\}}\NormalTok{ InitQuery}\OperatorTok{();}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ k}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{,}\NormalTok{ w}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{u}\OperatorTok{)(}\NormalTok{v}\OperatorTok{)(}\NormalTok{w}\OperatorTok{);}
\NormalTok{ P}\OperatorTok{.}\NormalTok{push\_back}\OperatorTok{(}\DataTypeTok{Path\_t}\OperatorTok{(}\NormalTok{i}\OperatorTok{,}\NormalTok{ u}\OperatorTok{,}\NormalTok{ v}\OperatorTok{,}\NormalTok{ w}\OperatorTok{,} \DecValTok{1}\OperatorTok{));}\NormalTok{ nowv}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ q}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ type}\OperatorTok{,}\NormalTok{ a}\OperatorTok{,}\NormalTok{ b}\OperatorTok{;}\NormalTok{ Read}\OperatorTok{(}\NormalTok{type}\OperatorTok{)(}\NormalTok{a}\OperatorTok{);}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{type }\OperatorTok{==} \DecValTok{2}\OperatorTok{)}\NormalTok{ Read}\OperatorTok{(}\NormalTok{b}\OperatorTok{),}\NormalTok{ Q}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \DataTypeTok{Q\_t}\OperatorTok{(}\NormalTok{type}\OperatorTok{,}\NormalTok{ a}\OperatorTok{,}\NormalTok{ b}\OperatorTok{);}
\ControlFlowTok{else}\NormalTok{ Q}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \DataTypeTok{Q\_t}\OperatorTok{(}\NormalTok{type}\OperatorTok{,}\NormalTok{ a}\OperatorTok{,} \DecValTok{0}\OperatorTok{);}
\OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ q}\OperatorTok{)\{}
\DataTypeTok{Q\_t} \OperatorTok{\&}\NormalTok{now }\OperatorTok{=}\NormalTok{ Q}\OperatorTok{[}\NormalTok{i}\OperatorTok{];}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{now}\OperatorTok{.}\NormalTok{type }\OperatorTok{==} \DecValTok{2}\OperatorTok{)}\NormalTok{ P}\OperatorTok{.}\NormalTok{push\_back}\OperatorTok{(}\DataTypeTok{Path\_t}\OperatorTok{(}\NormalTok{now}\OperatorTok{.}\NormalTok{a}\OperatorTok{,}\NormalTok{ P}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{a }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{].}\NormalTok{u}\OperatorTok{,}\NormalTok{ P}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{a }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{].}\NormalTok{v}\OperatorTok{,}\NormalTok{ now}\OperatorTok{.}\NormalTok{b}\OperatorTok{,} \OperatorTok{++}\NormalTok{nowv}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{a}\OperatorTok{]));}
\OperatorTok{\}}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ k}\OperatorTok{)}\NormalTok{ Pv}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{resize}\OperatorTok{(}\NormalTok{nowv}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{+} \DecValTok{2}\OperatorTok{);}
\NormalTok{ sort}\OperatorTok{(}\NormalTok{P}\OperatorTok{.}\NormalTok{begin}\OperatorTok{(),}\NormalTok{ P}\OperatorTok{.}\NormalTok{end}\OperatorTok{(),}\NormalTok{ CMP}\OperatorTok{);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{0}\OperatorTok{,}\NormalTok{ P}\OperatorTok{.}\NormalTok{size}\OperatorTok{()} \OperatorTok{{-}} \DecValTok{1}\OperatorTok{)}\NormalTok{ Pv}\OperatorTok{[}\NormalTok{P}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{id}\OperatorTok{][}\NormalTok{P}\OperatorTok{[}\NormalTok{i}\OperatorTok{].}\NormalTok{ver}\OperatorTok{]} \OperatorTok{=}\NormalTok{ i }\OperatorTok{+} \DecValTok{1}\OperatorTok{;}
\DataTypeTok{int}\NormalTok{ root }\OperatorTok{=}\NormalTok{ Groot}\OperatorTok{(),}\NormalTok{ U}\OperatorTok{;}\NormalTok{ U }\OperatorTok{=}\NormalTok{ P}\OperatorTok{.}\NormalTok{size}\OperatorTok{();}\NormalTok{ build}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ U}\OperatorTok{);}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ k}\OperatorTok{)}\NormalTok{ nowv}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\OperatorTok{;}
\NormalTok{ rep}\OperatorTok{(}\NormalTok{i}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ q}\OperatorTok{)\{}
\DataTypeTok{Q\_t} \OperatorTok{\&}\NormalTok{now }\OperatorTok{=}\NormalTok{ Q}\OperatorTok{[}\NormalTok{i}\OperatorTok{];}
\ControlFlowTok{if}\OperatorTok{(}\NormalTok{now}\OperatorTok{.}\NormalTok{type }\OperatorTok{==} \DecValTok{1}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ Pl }\OperatorTok{=}\NormalTok{ Pv}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{a}\OperatorTok{][}\NormalTok{nowv}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{a}\OperatorTok{]];}
\NormalTok{ update}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ U}\OperatorTok{,}\NormalTok{ Pl}\OperatorTok{,} \DecValTok{1}\OperatorTok{);}
\OperatorTok{\}} \ControlFlowTok{else} \ControlFlowTok{if}\OperatorTok{(}\NormalTok{now}\OperatorTok{.}\NormalTok{type }\OperatorTok{==} \DecValTok{2}\OperatorTok{)\{}
\DataTypeTok{int}\NormalTok{ Pl0 }\OperatorTok{=}\NormalTok{ Pv}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{a}\OperatorTok{][}\NormalTok{ nowv}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{a}\OperatorTok{]];}
\DataTypeTok{int}\NormalTok{ Pl1 }\OperatorTok{=}\NormalTok{ Pv}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{a}\OperatorTok{][++}\NormalTok{nowv}\OperatorTok{[}\NormalTok{now}\OperatorTok{.}\NormalTok{a}\OperatorTok{]];}
\NormalTok{ update}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ U}\OperatorTok{,}\NormalTok{ Pl0}\OperatorTok{,} \DecValTok{1}\OperatorTok{);}
\NormalTok{ update}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ U}\OperatorTok{,}\NormalTok{ Pl1}\OperatorTok{,} \DecValTok{0}\OperatorTok{);}
\OperatorTok{\}} \ControlFlowTok{else} \OperatorTok{\{}
\NormalTok{ printf}\OperatorTok{(}\StringTok{"}\SpecialCharTok{\%d\textbackslash{}n}\StringTok{"}\OperatorTok{,}\NormalTok{ query}\OperatorTok{(}\NormalTok{root}\OperatorTok{,} \DecValTok{1}\OperatorTok{,}\NormalTok{ U}\OperatorTok{,}\NormalTok{ now}\OperatorTok{.}\NormalTok{a}\OperatorTok{));}
\OperatorTok{\}}
\OperatorTok{\}}
\ControlFlowTok{return} \DecValTok{0}\OperatorTok{;}
\OperatorTok{\}}
\end{Highlighting}
\end{Shaded}
\paragraph{做法三:CDQ 分治}\label{ux505aux6cd5ux4e09cdq-ux5206ux6cbb}
学了再说。
QAQ /kel
\end{document}
[INFO] [makePDF] LaTeX run number 1
[INFO] [makePDF] LaTeX output
This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023/Debian) (preloaded format=xelatex)
restricted \write18 enabled.
entering extended mode
(.../input.tex
LaTeX2e <2023-11-01> patch level 1
L3 programming layer <2024-01-22>
(.../article.cls
Document Class: article 2023/05/17 v1.4n Standard LaTeX document class
(.../[system]
(.../xcolor.sty
(.../color.cfg)
(.../xetex.def)
(.../[system]
(.../geometry.sty
(.../keyval.sty)
(.../ifvtex.sty
(.../iftex.sty)))
(.../amsmath.sty
For additional information on amsmath, use the `?' option.
(.../amstext.sty
(.../amsgen.sty))
(.../amsbsy.sty)
(.../amsopn.sty))
(.../amssymb.sty
(.../amsfonts.sty))
(.../unicode-math.sty
(.../expl3.sty
(.../l3backend-xetex.def))
(.../unicode-math-xetex.sty
(.../xparse.sty)
(.../l3keys2e.sty)
(.../fontspec.sty
(.../fontspec-xetex.sty
(.../fontenc.sty)
(.../fontspec.cfg)))
(.../fix-cm.sty
(.../ts1enc.def))
(.../unicode-math-table.tex)))
(.../lmodern.sty)
(.../xeCJK.sty
(.../ctexhook.sty)
(.../xtemplate.sty)
(.../xeCJK.cfg))
(.../upquote.sty
(.../textcomp.sty))
(.../microtype.sty
(.../etoolbox.sty)
(.../microtype-xetex.def)
(.../microtype.cfg))
(.../setspace.sty)
(.../parskip.sty
(.../kvoptions.sty
(.../ltxcmds.sty)
(.../kvsetkeys.sty)))
(.../fancyvrb.sty)
(.../bookmark.sty
(.../hyperref.sty
(.../kvdefinekeys.sty)
(.../pdfescape.sty
(.../pdftexcmds.sty
(.../infwarerr.sty)))
(.../hycolor.sty)
(.../auxhook.sty)
(.../nameref.sty
(.../refcount.sty)
(.../gettitlestring.sty))
(.../pd1enc.def)
(.../intcalc.sty)
(.../puenc.def)
(.../url.sty)
(.../bitset.sty
(.../bigintcalc.sty))
(.../atbegshi-ltx.sty))
(.../hxetex.def
(.../stringenc.sty)
(.../rerunfilecheck.sty
(.../atveryend-ltx.sty)
(.../uniquecounter.sty)))
(.../bkm-dvipdfm.def))
(.../xurl.sty)
No file input.aux.
*geometry* driver: auto-detecting
*geometry* detected driver: xetex
(.../mt-LatinModernRoman.cfg)
Package hyperref Warning: Rerun to get /PageLabels entry.
(.../omllmm.fd)
(.../umsa.fd)
(.../mt-msa.cfg)
(.../umsb.fd)
(.../mt-msb.cfg)
Package xeCJK Warning: Unknown CJK family `\CJKttdefault' is being ignored.
(xeCJK)
(xeCJK) Try to use `\setCJKmonofont[<...>]{<...>}' to define
(xeCJK) it.
[1]
LaTeX Font Warning: Font shape `TU/ARPLUKaiCN(0)/b/n' undefined
(Font) using `TU/ARPLUKaiCN(0)/m/n' instead on input line 185.
[2] [3] [4] [5] [6] [7] [8] [9] [10]
LaTeX Font Warning: Font shape `TU/ARPLUKaiCN(0)/m/it' undefined
(Font) using `TU/ARPLUKaiCN(0)/m/n' instead on input line 726.
[11] [12] [13] [14] [15] [16] [17] [18]
Missing character: There is no 被 (U+88AB) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 覆 (U+8986) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 盖 (U+76D6) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 的 (U+7684) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 区 (U+533A) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 间 (U+95F4) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 数 (U+6570) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
[19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33]
[34]
Overfull \hbox (9.4617pt too wide) in paragraph at lines 2056--2060
[]\TU/ARPLUKaiCN(0)/m/n/10 给 出 一 个 长 度 为 $[]$ 的 序 列。| 设 $[] [] [][] []$,| 求 出
:| \TU/LatinModernRoman(0)/m/n/10 - $[]$ - $[] []$ - $[] []$
[35] [36] [37] [38] [39] [40] [41] [42] [43] [44]
(.../input.aux)
LaTeX Font Warning: Some font shapes were not available, defaults substituted.
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
)
(see the transcript file for additional information)
Output written on .../input.pdf (44 pages).
Transcript written on .../input.log.
[INFO] [makePDF] Rerun needed
Package hyperref Warning: Rerun to get /PageLabels entry.
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
[INFO] [makePDF] LaTeX run number 2
[INFO] [makePDF] LaTeX output
This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023/Debian) (preloaded format=xelatex)
restricted \write18 enabled.
entering extended mode
(.../input.tex
LaTeX2e <2023-11-01> patch level 1
L3 programming layer <2024-01-22>
(.../article.cls
Document Class: article 2023/05/17 v1.4n Standard LaTeX document class
(.../[system]
(.../xcolor.sty
(.../color.cfg)
(.../xetex.def)
(.../[system]
(.../geometry.sty
(.../keyval.sty)
(.../ifvtex.sty
(.../iftex.sty)))
(.../amsmath.sty
For additional information on amsmath, use the `?' option.
(.../amstext.sty
(.../amsgen.sty))
(.../amsbsy.sty)
(.../amsopn.sty))
(.../amssymb.sty
(.../amsfonts.sty))
(.../unicode-math.sty
(.../expl3.sty
(.../l3backend-xetex.def))
(.../unicode-math-xetex.sty
(.../xparse.sty)
(.../l3keys2e.sty)
(.../fontspec.sty
(.../fontspec-xetex.sty
(.../fontenc.sty)
(.../fontspec.cfg)))
(.../fix-cm.sty
(.../ts1enc.def))
(.../unicode-math-table.tex)))
(.../lmodern.sty)
(.../xeCJK.sty
(.../ctexhook.sty)
(.../xtemplate.sty)
(.../xeCJK.cfg))
(.../upquote.sty
(.../textcomp.sty))
(.../microtype.sty
(.../etoolbox.sty)
(.../microtype-xetex.def)
(.../microtype.cfg))
(.../setspace.sty)
(.../parskip.sty
(.../kvoptions.sty
(.../ltxcmds.sty)
(.../kvsetkeys.sty)))
(.../fancyvrb.sty)
(.../bookmark.sty
(.../hyperref.sty
(.../kvdefinekeys.sty)
(.../pdfescape.sty
(.../pdftexcmds.sty
(.../infwarerr.sty)))
(.../hycolor.sty)
(.../auxhook.sty)
(.../nameref.sty
(.../refcount.sty)
(.../gettitlestring.sty))
(.../pd1enc.def)
(.../intcalc.sty)
(.../puenc.def)
(.../url.sty)
(.../bitset.sty
(.../bigintcalc.sty))
(.../atbegshi-ltx.sty))
(.../hxetex.def
(.../stringenc.sty)
(.../rerunfilecheck.sty
(.../atveryend-ltx.sty)
(.../uniquecounter.sty)))
(.../bkm-dvipdfm.def))
(.../xurl.sty)
(.../input.aux)
*geometry* driver: auto-detecting
*geometry* detected driver: xetex
(.../mt-LatinModernRoman.cfg)
(.../omllmm.fd)
(.../umsa.fd)
(.../mt-msa.cfg)
(.../umsb.fd)
(.../mt-msb.cfg)
Package xeCJK Warning: Unknown CJK family `\CJKttdefault' is being ignored.
(xeCJK)
(xeCJK) Try to use `\setCJKmonofont[<...>]{<...>}' to define
(xeCJK) it.
[1]
LaTeX Font Warning: Font shape `TU/ARPLUKaiCN(0)/b/n' undefined
(Font) using `TU/ARPLUKaiCN(0)/m/n' instead on input line 185.
[2] [3] [4] [5] [6] [7] [8] [9] [10]
LaTeX Font Warning: Font shape `TU/ARPLUKaiCN(0)/m/it' undefined
(Font) using `TU/ARPLUKaiCN(0)/m/n' instead on input line 726.
[11] [12] [13] [14] [15] [16] [17] [18]
Missing character: There is no 被 (U+88AB) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 覆 (U+8986) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 盖 (U+76D6) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 的 (U+7684) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 区 (U+533A) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 间 (U+95F4) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
Missing character: There is no 数 (U+6570) in font LatinModernMath-Regular/OT:sc
ript=math;language=dflt;+ssty=0;!
[19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33]
[34]
Overfull \hbox (9.4617pt too wide) in paragraph at lines 2056--2060
[]\TU/ARPLUKaiCN(0)/m/n/10 给 出 一 个 长 度 为 $[]$ 的 序 列。| 设 $[] [] [][] []$,| 求 出
:| \TU/LatinModernRoman(0)/m/n/10 - $[]$ - $[] []$ - $[] []$
[35] [36] [37] [38] [39] [40] [41] [42] [43] [44]
(.../input.aux)
LaTeX Font Warning: Some font shapes were not available, defaults substituted.
)
(see the transcript file for additional information)
Output written on .../input.pdf (44 pages).
Transcript written on .../input.log.
[WARNING] Missing character: There is no 被 (U+88AB) (U+88AB) in font LatinModernMath-Regular/OT:sc
[WARNING] Missing character: There is no 覆 (U+8986) (U+8986) in font LatinModernMath-Regular/OT:sc
[WARNING] Missing character: There is no 盖 (U+76D6) (U+76D6) in font LatinModernMath-Regular/OT:sc
[WARNING] Missing character: There is no 的 (U+7684) (U+7684) in font LatinModernMath-Regular/OT:sc
[WARNING] Missing character: There is no 区 (U+533A) (U+533A) in font LatinModernMath-Regular/OT:sc
[WARNING] Missing character: There is no 间 (U+95F4) (U+95F4) in font LatinModernMath-Regular/OT:sc
[WARNING] Missing character: There is no 数 (U+6570) (U+6570) in font LatinModernMath-Regular/OT:sc