找回密码
 立即注册
首页 业界区 安全 虚树
鞠古香 2025-6-1 00:00:14
0.前言

若干年前会过一次,然后就不会了。
现在又会了。
1.虚树

存在这样一类问题,多次询问,每次给你 \(k\) 个特殊/关键点,要求有关这 \(k\) 个点的某种信息,并且题目保证了或隐含了 \(\sum k \le lim\),那么可以考虑使用虚树解决。
虚树,即将这 \(k\) 个点提出,并按照原树上的节点关系,建立一棵大小约为 \(2k\) 的树,可以在这棵树上求答案。
这里仅介绍二次排序 + LCA 的建树方法。

  • 将关键点按照 dfs 序排序;
  • 将排序后相邻两点的 LCA 加入,再按 dfs 序排序并去重;
  • 连 \((LCA(ve_{i - 1},ve_i),ve_i)\) 的边。
对于 2:一般会将点 \(1\) 也加入,便于求答案。
因为按照 dfs 序排序了,所以相邻两点之间一定不会出现 dfs 序介于他们俩到 LCA 的路径上的点,正确性得证。
建树时间复杂度:\(\mathcal{O(\sum k \log n)}\)。
2.题目

2.1.P2495 [SDOI2011] 消耗战

板子题。
我们将虚树建出,接下来考虑树形 DP。
\(f_u\) 表示点 \(u\) 与其子树内所有关键点断开所需最小代价。
对于虚树上 \((u,v)\):若 \(v\) 是关键点,那么这条边必须断;否则判断是断这条边代价更小还是在 \(v\) 的子树中断若干边代价更小。
显然答案为 \(f_1\)。
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define ll long long
  4. #define ull unsigned long long
  5. #define db double
  6. #define ld long double
  7. #define rep(i,l,r) for (int i = (int)(l); i <= (int)(r); ++ i )
  8. #define rep1(i,l,r) for (int i = (int)(l); i >= (int)(r); -- i )
  9. #define il inline
  10. #define fst first
  11. #define snd second
  12. #define ptc putchar
  13. #define Yes ptc('Y'),ptc('e'),ptc('s'),puts("")
  14. #define No ptc('N'),ptc('o'),puts("")
  15. #define YES ptc('Y'),ptc('E'),ptc('S'),puts("")
  16. #define NO ptc('N'),ptc('O'),puts("")
  17. #define vi vector<int>
  18. #define pb emplace_back
  19. #define sz(x) (int)(x.size())
  20. #define all(x) x.begin(),x.end()
  21. #define me(a,x) memset(a,x,sizeof a)
  22. #define get(x) ((x - 1) / len + 1)
  23. #define debug() puts("------------")
  24. using namespace std;
  25. typedef pair<int,int> PII;
  26. typedef pair<int,PII> PIII;
  27. typedef pair<ll,ll> PLL;
  28. namespace szhqwq {
  29.     template<class T> il void read(T &x) {
  30.         x = 0; T f = 1; char ch = getchar();
  31.         while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
  32.         while (ch >= '0' && ch <= '9') { x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar(); }
  33.         x *= f;
  34.     }
  35.     template<class T,class... Args> il void read(T &x,Args &...x_) { read(x); read(x_...); }
  36.     template<class T> il void print(T x) {
  37.         if (x < 0) ptc('-'), x = -x;
  38.         if (x > 9) print(x / 10); ptc(x % 10 + '0');
  39.     }
  40.     template<class T,class T_> il void write(T x,T_ ch) { print(x); ptc(ch); }
  41.     template<class T,class T_> il void chmax(T &x,T_ y) { x = x < (T)y ? (T)y : x; }
  42.     template<class T,class T_> il void chmin(T &x,T_ y) { x = x > (T)y ? (T)y : x; }
  43.     template<class T,class T_,class T__> il T qmi(T a,T_ b,T__ p) {
  44.         T res = 1; while (b) {
  45.             if (b & 1) res = res * a % p;
  46.             a = a * a % p; b >>= 1;
  47.         } return res;
  48.     }
  49.     template<class T> il T gcd(T a,T b) { if (!b) return a; return gcd(b,a % b); }
  50.     template<class T,class T_> il void exgcd(T a, T b, T_ &x, T_ &y) {
  51.         if (b == 0) { x = 1; y = 0; return; }
  52.         exgcd(b,a % b,y,x); y -= a / b * x; return ;
  53.     }
  54.     template<class T,class T_> il T getinv(T x,T_ p) {
  55.         T inv,y; exgcd(x,(T)p,inv,y);
  56.         inv = (inv + p) % p; return inv;
  57.     }
  58. } using namespace szhqwq;
  59. const int N = 5e5 + 10,inf = 1e9,mod = 998244353;
  60. const ull base = 131,base_ = 233;
  61. const ll inff = 1e18;
  62. const db eps = 1e-6;
  63. int n,m; vector<PII> G[N];
  64. int h[N],e[N],ne[N],w[N],idx,dfn[N],tot;
  65. int d[N],fa[N][20],dis[N][20],f[N];
  66. bool st[N];
  67. il void add(int a,int b,int c) {
  68.     e[idx] = b;
  69.     w[idx] = c;
  70.     ne[idx] = h[a];
  71.     h[a] = idx ++;
  72.     return ;
  73. }
  74. il void dfs(int u,int faa,int val) {
  75.     dfn[u] = ++ tot;
  76.     fa[u][0] = faa; dis[u][0] = val;
  77.     d[u] = d[faa] + 1;
  78.     rep(i,1,18)
  79.         fa[u][i] = fa[fa[u][i - 1]][i - 1],
  80.         dis[u][i] = min(dis[u][i - 1],dis[fa[u][i - 1]][i - 1]);
  81.     for (int i = h[u]; ~i; i = ne[i]) {
  82.         int j = e[i];
  83.         if (j == faa) continue;
  84.         dfs(j,u,w[i]);
  85.     }
  86.     return ;
  87. }
  88. il int LCA(int x,int y) {
  89.     if (d[x] < d[y]) swap(x,y);
  90.     rep1(i,18,0) if (d[fa[x][i]] >= d[y]) x = fa[x][i];
  91.     if (x == y) return x;
  92.     rep1(i,18,0) if (fa[x][i] != fa[y][i]) x = fa[x][i],y = fa[y][i];
  93.     return fa[x][0];
  94. }
  95. il int calc(int x,int p) {
  96.     int ret = inf;
  97.     rep1(i,18,0) if (d[fa[x][i]] >= d[p])
  98.         chmin(ret,dis[x][i]),x = fa[x][i];
  99.     return ret;
  100. }
  101. il void dfss(int u,int faa) {
  102.     f[u] = 0;
  103.     for (auto x : G[u]) {
  104.         int v = x.fst,w = x.snd;
  105.         if (v == faa) continue;
  106.         dfss(v,u);
  107.         if (st[v]) f[u] += w;
  108.         else f[u] += min(f[v],w);
  109.     }
  110.     return ;
  111. }
  112. il void solve() {
  113.     //------------code------------
  114.     me(h,-1); me(dis,0x3f);
  115.     read(n);
  116.     rep(i,1,n - 1) {
  117.         int a,b,c; read(a,b,c);
  118.         add(a,b,c); add(b,a,c);
  119.     }
  120.     dfs(1,0,inf);
  121.     read(m);
  122.     while (m -- ) {
  123.         int k; read(k);
  124.         vi v,ve;
  125.         rep(i,1,k) {
  126.             int x; read(x);
  127.             v.pb(x);
  128.         }
  129.         sort(all(v),[](int x,int y){ return dfn[x] < dfn[y]; });
  130.         ve.pb(1); ve.pb(v[0]);
  131.         rep(i,1,k - 1)
  132.             ve.pb(LCA(v[i - 1],v[i])),
  133.             ve.pb(v[i]);
  134.         sort(all(ve),[](int x,int y){ return dfn[x] < dfn[y]; });
  135.         ve.erase(unique(all(ve)),ve.end());
  136.         rep(i,0,sz(ve) - 1) st[ve[i]] = 0,G[ve[i]].clear();
  137.         for (auto x : v) st[x] = 1;
  138.         rep(i,1,sz(ve) - 1) {
  139.             int lca = LCA(ve[i - 1],ve[i]);
  140.             G[lca].pb(ve[i],calc(ve[i],lca));
  141.         }
  142.         dfss(1,0); write(f[1],'\n');
  143.     }
  144.     return ;
  145. }
  146. il void init() {
  147.     return ;
  148. }
  149. signed main() {
  150.     // init();
  151.     int _ = 1;
  152.     // read(_);
  153.     while (_ -- ) solve();
  154.     return 0;
  155. }
复制代码
2.2.CF613D Kingdom and its Cities

同样建出虚树。要使所有关键点两两不连通,因为点权相同,可以直接贪心。
先判掉无解的情况。
若当前点 \(u\) 是关键点且其子树中存在其他关键点,那么子树中有多少关键点答案就加多少;
否则看子树中有多少关键点,若有 \(> 1\) 个,那么占领 \(u\) 点一定不劣;如果仅有 \(1\) 个,考虑放到父亲节点及上面进行处理一定更优。
  1. #include <bits/stdc++.h>
  2. // #define int long long
  3. #define ll long long
  4. #define ull unsigned long long
  5. #define db double
  6. #define ld long double
  7. #define rep(i,l,r) for (int i = (int)(l); i <= (int)(r); ++ i )
  8. #define rep1(i,l,r) for (int i = (int)(l); i >= (int)(r); -- i )
  9. #define il inline
  10. #define fst first
  11. #define snd second
  12. #define ptc putchar
  13. #define Yes ptc('Y'),ptc('e'),ptc('s'),puts("")
  14. #define No ptc('N'),ptc('o'),puts("")
  15. #define YES ptc('Y'),ptc('E'),ptc('S'),puts("")
  16. #define NO ptc('N'),ptc('O'),puts("")
  17. #define vi vector<int>
  18. #define pb emplace_back
  19. #define sz(x) (int)(x.size())
  20. #define all(x) x.begin(),x.end()
  21. #define me(a,x) memset(a,x,sizeof a)
  22. #define get(x) ((x - 1) / len + 1)
  23. #define debug() puts("------------")
  24. using namespace std;
  25. typedef pair<int,int> PII;
  26. typedef pair<int,PII> PIII;
  27. typedef pair<ll,ll> PLL;
  28. namespace szhqwq {
  29.     template<class T> il void read(T &x) {
  30.         x = 0; T f = 1; char ch = getchar();
  31.         while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
  32.         while (ch >= '0' && ch <= '9') { x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar(); }
  33.         x *= f;
  34.     }
  35.     template<class T,class... Args> il void read(T &x,Args &...x_) { read(x); read(x_...); }
  36.     template<class T> il void print(T x) {
  37.         if (x < 0) ptc('-'), x = -x;
  38.         if (x > 9) print(x / 10); ptc(x % 10 + '0');
  39.     }
  40.     template<class T,class T_> il void write(T x,T_ ch) { print(x); ptc(ch); }
  41.     template<class T,class T_> il void chmax(T &x,T_ y) { x = x < (T)y ? (T)y : x; }
  42.     template<class T,class T_> il void chmin(T &x,T_ y) { x = x > (T)y ? (T)y : x; }
  43.     template<class T,class T_,class T__> il T qmi(T a,T_ b,T__ p) {
  44.         T res = 1; while (b) {
  45.             if (b & 1) res = res * a % p;
  46.             a = a * a % p; b >>= 1;
  47.         } return res;
  48.     }
  49.     template<class T> il T gcd(T a,T b) { if (!b) return a; return gcd(b,a % b); }
  50.     template<class T,class T_> il void exgcd(T a, T b, T_ &x, T_ &y) {
  51.         if (b == 0) { x = 1; y = 0; return; }
  52.         exgcd(b,a % b,y,x); y -= a / b * x; return ;
  53.     }
  54.     template<class T,class T_> il T getinv(T x,T_ p) {
  55.         T inv,y; exgcd(x,(T)p,inv,y);
  56.         inv = (inv + p) % p; return inv;
  57.     }
  58. } using namespace szhqwq;
  59. const int N = 2e5 + 10,inf = 1e9,mod = 998244353;
  60. const ull base = 131,base_ = 233;
  61. const ll inff = 1e18;
  62. const db eps = 1e-6;
  63. int n,q,id[N],cnt,fa[N][20];
  64. int h[N],e[N],ne[N],idx,d[N];
  65. bool vis[N];
  66. vi G[N];
  67. il void add(int a,int b) {
  68.     e[idx] = b;
  69.     ne[idx] = h[a];
  70.     h[a] = idx ++;
  71.     return ;
  72. }
  73. il void dfs(int u,int f) {
  74.     fa[u][0] = f;
  75.     d[u] = d[f] + 1;
  76.     rep(i,1,18) fa[u][i] = fa[fa[u][i - 1]][i - 1];
  77.     id[u] = ++ cnt;
  78.     for (int i = h[u]; ~i; i = ne[i]) {
  79.         int j = e[i];
  80.         if (j == f) continue;
  81.         dfs(j,u);
  82.     }
  83.     return ;
  84. }
  85. il int LCA(int x,int y) {
  86.     if (d[x] < d[y]) swap(x,y);
  87.     rep1(i,18,0) if (d[fa[x][i]] >= d[y]) x = fa[x][i];
  88.     if (x == y) return x;
  89.     rep1(i,18,0) if (fa[x][i] != fa[y][i]) x = fa[x][i],y = fa[y][i];
  90.     return fa[x][0];
  91. }
  92. int ret = 0,st[N];
  93. il void calcans(int u) {
  94.     if (vis[u]) st[u] = 1;
  95.     int tot = 0;
  96.     for (auto v : G[u]) {
  97.         calcans(v);
  98.         tot += st[v];
  99.     }
  100.     if (vis[u] && tot) ret += tot;
  101.     else if (tot == 1) st[u] = 1;
  102.     else if (tot > 1) ++ ret;
  103.     return ;
  104. }
  105. il void solve() {
  106.     //------------code------------
  107.     read(n); me(h,-1);
  108.     rep(i,1,n - 1) {
  109.         int a,b; read(a,b);
  110.         add(a,b); add(b,a);
  111.     }
  112.     dfs(1,0);
  113.     read(q);
  114.     while (q -- ) {
  115.         int k; read(k);
  116.         vi v,ve;
  117.         rep(i,1,k) {
  118.             int x; read(x);
  119.             v.pb(x);
  120.         }
  121.         sort(all(v),[](int x,int y){ return id[x] < id[y]; });
  122.         ve.pb(1); ve.pb(v[0]);
  123.         rep(i,1,sz(v) - 1)
  124.             ve.pb(LCA(v[i - 1],v[i])),
  125.             ve.pb(v[i]);
  126.         sort(all(ve),[](int x,int y){ return id[x] < id[y]; });
  127.         ve.erase(unique(all(ve)),ve.end());
  128.         for (auto x : ve) G[x].clear(),vis[x] = vis[fa[x][0]] = 0,st[x] = 0;
  129.         for (auto x : v) vis[x] = 1;
  130.         bool fl = 1;
  131.         for (auto x : v) if (vis[fa[x][0]]) { fl = 0; break; }
  132.         if (!fl) { puts("-1"); continue; }
  133.         rep(i,1,sz(ve) - 1) G[LCA(ve[i - 1],ve[i])].pb(ve[i]);
  134.         ret = 0;
  135.         calcans(1);
  136.         write(ret,'\n');
  137.     }
  138.     return ;
  139. }
  140. il void init() {
  141.     return ;
  142. }
  143. signed main() {
  144.     // init();
  145.     int _ = 1;
  146.     // read(_);
  147.     while (_ -- ) solve();
  148.     return 0;
  149. }
复制代码
2.3.P3233 [HNOI2014] 世界树

建虚树,考虑 up and down DP。
\(f_u = (dist,id)\),分别表示最短距离及编号。
分别向上向下更新信息。
考虑最后计算答案怎么做。
对于虚树上 \((u,v)\),令 \(p\) 为 \(u\) 在原树上和 \(v\) 那条链上的儿子。
如果两点所属的关键点相同,则 \(cnt_{id} \gets siz_p - siz_v\)。
若不同,则倍增跳到分界点,即上半部分所属点与 \(u\) 相同,下半部分所属点与 \(v\) 相同的点 \(mid\),\(mid\) 自己和 \(y\) 相同。
\(cnt_{id_u} \gets siz_p - siz_{mid},cnt_{id_v} \gets siz_{mid} - siz_v\)。
注意到 \(u\) 某些子树中可能不存在关键点,那么这些子树中的点显然所属与 \(u\) 一致,处理一下即可。
  1. #include <bits/stdc++.h>
  2. // #define int long long
  3. #define ll long long
  4. #define ull unsigned long long
  5. #define db double
  6. #define ld long double
  7. #define rep(i,l,r) for (int i = (int)(l); i <= (int)(r); ++ i )
  8. #define rep1(i,l,r) for (int i = (int)(l); i >= (int)(r); -- i )
  9. #define il inline
  10. #define fst first
  11. #define snd second
  12. #define ptc putchar
  13. #define Yes ptc('Y'),ptc('e'),ptc('s'),puts("")
  14. #define No ptc('N'),ptc('o'),puts("")
  15. #define YES ptc('Y'),ptc('E'),ptc('S'),puts("")
  16. #define NO ptc('N'),ptc('O'),puts("")
  17. #define vi vector<int>
  18. #define pb emplace_back
  19. #define sz(x) (int)(x.size())
  20. #define all(x) x.begin(),x.end()
  21. #define me(a,x) memset(a,x,sizeof a)
  22. #define get(x) ((x - 1) / len + 1)
  23. #define debug() puts("------------")
  24. using namespace std;
  25. typedef pair<int,int> PII;
  26. typedef pair<int,PII> PIII;
  27. typedef pair<ll,ll> PLL;
  28. namespace szhqwq {
  29.     template<class T> il void read(T &x) {
  30.         x = 0; T f = 1; char ch = getchar();
  31.         while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
  32.         while (ch >= '0' && ch <= '9') { x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar(); }
  33.         x *= f;
  34.     }
  35.     template<class T,class... Args> il void read(T &x,Args &...x_) { read(x); read(x_...); }
  36.     template<class T> il void print(T x) {
  37.         if (x < 0) ptc('-'), x = -x;
  38.         if (x > 9) print(x / 10); ptc(x % 10 + '0');
  39.     }
  40.     template<class T,class T_> il void write(T x,T_ ch) { print(x); ptc(ch); }
  41.     template<class T,class T_> il void chmax(T &x,T_ y) { x = x < (T)y ? (T)y : x; }
  42.     template<class T,class T_> il void chmin(T &x,T_ y) { x = x > (T)y ? (T)y : x; }
  43.     template<class T,class T_,class T__> il T qmi(T a,T_ b,T__ p) {
  44.         T res = 1; while (b) {
  45.             if (b & 1) res = res * a % p;
  46.             a = a * a % p; b >>= 1;
  47.         } return res;
  48.     }
  49.     template<class T> il T gcd(T a,T b) { if (!b) return a; return gcd(b,a % b); }
  50.     template<class T,class T_> il void exgcd(T a, T b, T_ &x, T_ &y) {
  51.         if (b == 0) { x = 1; y = 0; return; }
  52.         exgcd(b,a % b,y,x); y -= a / b * x; return ;
  53.     }
  54.     template<class T,class T_> il T getinv(T x,T_ p) {
  55.         T inv,y; exgcd(x,(T)p,inv,y);
  56.         inv = (inv + p) % p; return inv;
  57.     }
  58. } using namespace szhqwq;
  59. const int N = 3e5 + 10,inf = 1e9,mod = 998244353;
  60. const ull base = 131,base_ = 233;
  61. const ll inff = 1e18;
  62. const db eps = 1e-6;
  63. int n,q,d[N],fa[N][20],siz[N];
  64. int h[N],e[N << 1],ne[N << 1],idx;
  65. PII f[N]; int id[N],cnt;
  66. vi G[N]; bool vis[N];
  67. int ret[N];
  68. il void add(int a,int b) {
  69.     e[idx] = b;
  70.     ne[idx] = h[a];
  71.     h[a] = idx ++;
  72.     return ;
  73. }
  74. il void dfs(int u,int f) {
  75.     d[u] = d[f] + 1;
  76.     fa[u][0] = f; id[u] = ++ cnt;
  77.     rep(i,1,18) fa[u][i] = fa[fa[u][i - 1]][i - 1];
  78.     siz[u] = 1;
  79.     for (int i = h[u]; ~i; i = ne[i]) {
  80.         int j = e[i];
  81.         if (j == f) continue;
  82.         dfs(j,u);
  83.         siz[u] += siz[j];
  84.     }
  85.     return ;
  86. }
  87. il int LCA(int x,int y) {
  88.     if (d[x] < d[y]) swap(x,y);
  89.     rep1(i,18,0) if (d[fa[x][i]] >= d[y]) x = fa[x][i];
  90.     if (x == y) return x;
  91.     rep1(i,18,0) if (fa[x][i] != fa[y][i]) x = fa[x][i],y = fa[y][i];
  92.     return fa[x][0];
  93. }
  94. il int getdis(int x,int y) {
  95.     return d[x] + d[y] - 2 * d[LCA(x,y)];
  96. }
  97. il void dfs1(int u) {
  98.     f[u] = {inf,0};
  99.     if (vis[u]) f[u] = {0,u};
  100.     for (auto v : G[u]) {
  101.         dfs1(v);
  102.         if (f[v].snd) {
  103.             int val = getdis(u,f[v].snd);
  104.             if (val < f[u].fst) f[u] = {val,f[v].snd};
  105.             else if (val == f[u].fst) chmin(f[u].snd,f[v].snd);
  106.         }
  107.     }
  108.     return ;
  109. }
  110. il void dfs2(int u) {
  111.     for (auto v : G[u]) {
  112.         if (f[u].snd) {
  113.             int val = getdis(v,f[u].snd);
  114.             if (val < f[v].fst) f[v] = {val,f[u].snd};
  115.             else if (val == f[v].fst) chmin(f[v].snd,f[u].snd);
  116.         }
  117.         dfs2(v);
  118.     }
  119.     return ;
  120. }
  121. il void calcans(int u) {
  122.     int val = siz[u];
  123.     for (auto v : G[u]) {
  124.         int p = v;
  125.         rep1(i,18,0) if (d[fa[p][i]] > d[u]) p = fa[p][i];
  126.         val -= siz[p];
  127.         if (f[u].snd == f[v].snd) ret[f[u].snd] += siz[p] - siz[v];
  128.         else {
  129.             int mid = v;
  130.             rep1(i,18,0) {
  131.                 int dis = getdis(f[u].snd,fa[mid][i]),diss = getdis(f[v].snd,fa[mid][i]);
  132.                 if (dis > diss || dis == diss && f[v].snd < f[u].snd) mid = fa[mid][i];
  133.             }
  134.             ret[f[u].snd] += siz[p] - siz[mid]; ret[f[v].snd] += siz[mid] - siz[v];
  135.         }
  136.         calcans(v);
  137.     }
  138.     ret[f[u].snd] += val;
  139.     return ;
  140. }
  141. il void solve() {
  142.     //------------code------------
  143.     read(n); me(h,-1);
  144.     rep(i,1,n - 1) {
  145.         int a,b; read(a,b);
  146.         add(a,b); add(b,a);
  147.     }
  148.     dfs(1,0);
  149.     read(q);
  150.     while (q -- ) {
  151.         int m; read(m);
  152.         vi v,ve,vec;
  153.         rep(i,1,m) {
  154.             int x; read(x);
  155.             v.pb(x); vec.pb(x);
  156.             ret[x] = 0;
  157.         }
  158.         sort(all(v),[](int x,int y){ return id[x] < id[y]; });
  159.         ve.pb(1); ve.pb(v[0]);
  160.         rep(i,1,sz(v) - 1)
  161.             ve.pb(LCA(v[i - 1],v[i])),
  162.             ve.pb(v[i]);
  163.         sort(all(ve),[](int x,int y){ return id[x] < id[y]; });
  164.         ve.erase(unique(all(ve)),ve.end());
  165.         for (auto x : ve) G[x].clear(),vis[x] = 0;
  166.         for (auto x : v) vis[x] = 1;
  167.         rep(i,1,sz(ve) - 1) G[LCA(ve[i - 1],ve[i])].pb(ve[i]);
  168.         dfs1(1); dfs2(1); calcans(1);
  169.         for (auto x : vec) write(ret[x],' ');
  170.         puts("");
  171.     }
  172.     return ;
  173. }
  174. il void init() {
  175.     return ;
  176. }
  177. signed main() {
  178.     // init();
  179.     int _ = 1;
  180.     // read(_);
  181.     while (_ -- ) solve();
  182.     return 0;
  183. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册