当前位置:   article > 正文

2023年蓝桥杯软件类省赛 C/C++ B组 解析

2023年 蓝桥杯 b组省赛真题解析

可能有点错误,找到了再改(

A - 日期统计

将题面序列处理成数组放代码里

直接枚举八个位置的 O(n8) 复杂度对于 n=100 的范围显然本地跑也跑不出来

但由于年份限制在 2023 年内,那么就找到所有为 2023子序列中,3 出现的最早的位置,记作 p

那么接下来花 O(n4) 的时间枚举月份与日期所在位置,判断下即可

重复日期只算一次,故使用 set 去重

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  3. #define repp(i,a,b) for(int i=(a);i<(b);i++)
  4. #define per(i,a,b) for(int i=(a);i>=(b);i--)
  5. #define pb push_back
  6. using namespace std;
  7. int a[100]={5,6,8,6,9,1,6,1,2,4,
  8. 9,1,9,8,2,3,6,4,7,7,
  9. 5,9,5,0,3,8,7,5,8,1,
  10. 5,8,6,1,8,3,0,3,7,9,
  11. 2,7,0,5,8,8,5,7,0,9,
  12. 9,1,9,4,4,6,8,6,3,3,
  13. 8,5,1,6,3,4,6,7,0,7,
  14. 8,2,7,6,8,9,5,6,5,6,
  15. 1,4,0,1,0,0,9,4,8,0,
  16. 9,1,2,8,5,0,2,5,3,3};
  17. int cnt[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  18. int main()
  19. {
  20. int flag=0,p;
  21. repp(i,0,100)
  22. {
  23. if(flag==0&&a[i]==2)flag++;
  24. else if(flag==1&&a[i]==0)flag++;
  25. else if(flag==2&&a[i]==2)flag++;
  26. else if(flag==3&&a[i]==3)flag++;
  27. if(flag==4)
  28. {
  29. p=i;
  30. break;
  31. }
  32. }
  33. set<int> st;
  34. repp(x,p+1,100)
  35. repp(y,x+1,100)
  36. repp(z,y+1,100)
  37. repp(u,z+1,100)
  38. {
  39. int m=a[x]*10+a[y];
  40. int d=a[z]*10+a[u];
  41. if(m>=1&&m<=12&&d>=1&&d<=cnt[m])
  42. st.insert(m*100+d);
  43. }
  44. cout<<st.size()<<'\n';
  45. return 0;
  46. }

B - 01 串的熵

根据题意,p(0) 表示字符 0 在整个字符串中数量的占比,同理 p(1) 表示字符 1 在整个字符串中数量的占比

由于两者与字符串实际上长什么样并没有关系,我们只需要知道字符串总长以及两种字符各自的数量即可

cnt0 表示 0 的总数,cnt1 表示 1 的总数,且 cnt0+cnt1=total=23333333

根据式子,总共有 cnt0 项对熵的贡献是 p(0)log2p(0),总共有 cnt1=totalcnt0 项对熵的贡献是 p(1)log2p(1)

换句话说,熵就是 cnt0p(0)log2p(0)cnt1p(1)log2p(1)

枚举 cnt00total2,检查哪一项的值符合条件即可

时间复杂度 O(n)

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  3. #define repp(i,a,b) for(int i=(a);i<(b);i++)
  4. #define per(i,a,b) for(int i=(a);i>=(b);i--)
  5. #define pb push_back
  6. using namespace std;
  7. int main()
  8. {
  9. const double ans = 11625907.5798;
  10. int total=23333333;
  11. rep(i,0,total/2)
  12. {
  13. double c0=1.0*i/total;
  14. double c1=1.0*(total-i)/total;
  15. double s=-i*c0*log2(c0)-(total-i)*c1*log2(c1);
  16. if(fabs(s-ans)<1e-4)
  17. cout<<i<<'\n';
  18. }
  19. return 0;
  20. }

C - 冶炼金属

假设答案为 k,如果能用 a 份原料最多造出来 b 份成品,则应当满足:

  • bka<(b+1)k

对于左侧,移项得 kab,可向下取整,得右边界为 ab

对于右侧,移项得 k>ab+1,在 a 不是 b+1 的倍数的情况下应当向上取整,而在 ab+1 倍数的倍数的情况下应当 +1,得左边界为 ab+1+1

因此对于每条记录 (a,b),可以得出答案区间为 ab+1+1ab

对于多条记录,区间求交即可

时间复杂度 O(N)

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  3. #define repp(i,a,b) for(int i=(a);i<(b);i++)
  4. #define per(i,a,b) for(int i=(a);i>=(b);i--)
  5. #define pb push_back
  6. using namespace std;
  7. void solve()
  8. {
  9. int n;
  10. cin>>n;
  11. int mn=-1,mx=2e9;
  12. rep(i,1,n)
  13. {
  14. int a,b;
  15. cin>>a>>b;
  16. mn=max(mn,a/(b+1)+1);
  17. mx=min(mx,a/b);
  18. }
  19. cout<<mn<<' '<<mx<<'\n';
  20. }
  21. int main()
  22. {
  23. ios::sync_with_stdio(0);
  24. cin.tie(0);cout.tie(0);
  25. solve();
  26. return 0;
  27. }

D - 飞机降落

发现 N=10,考虑直接使用 next_permutation 或者 dfs 枚举所有可能的顺序即可

检查过程中,即上一架飞机降落后的时间为 mx,则下一架飞机能够成功降落的条件为 mxTi+Di,降落后的时间应当是 max(mx,Ti)+Li

时间复杂度 O(TN×N!)

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  3. #define repp(i,a,b) for(int i=(a);i<(b);i++)
  4. #define per(i,a,b) for(int i=(a);i>=(b);i--)
  5. #define pb push_back
  6. using namespace std;
  7. typedef long long ll;
  8. typedef pair<int,int> pii;
  9. int n,T[15],D[15],L[15];
  10. int ord[15];
  11. void solve()
  12. {
  13. cin>>n;
  14. repp(i,0,n)
  15. cin>>T[i]>>D[i]>>L[i];
  16. repp(i,0,n)
  17. ord[i]=i;
  18. do
  19. {
  20. int mx=0;
  21. bool flag=true;
  22. repp(i,0,n)
  23. {
  24. if(mx>T[ord[i]]+D[ord[i]])
  25. {
  26. flag=false;
  27. break;
  28. }
  29. mx=max(mx,T[ord[i]])+L[ord[i]];
  30. }
  31. if(flag)
  32. {
  33. cout<<"YES\n";
  34. return;
  35. }
  36. }while(next_permutation(ord,ord+n));
  37. cout<<"NO\n";
  38. }
  39. int main()
  40. {
  41. ios::sync_with_stdio(0);
  42. cin.tie(0);cout.tie(0);
  43. int T; cin>>T; while(T--)
  44. solve();
  45. return 0;
  46. }

E - 接龙数列

我们可以预先处理出第 i 个数的首位 Li 及末位 Ri,可以读入成字符串处理,也可以通过数位处理

考虑动态规划,记 dp[i] 表示在取第 i 个数当作接龙的最后一个数的前提下,第 1 个数到第 i 个数当中最长的接龙长度是多少

那么只需要按顺序处理,记一下 last[j] 表示最后一次出现末位为 j 的那个数在什么位置

转移方程便是 dp[i]=dp[last[Li]]+1

转移完成后更新一下 last[Ri]=i 即可

最后找一遍 dp 数组,取最大的值,答案便是 Nmax({dp})

时间复杂度 O(Nlog10Ai)

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  3. #define repp(i,a,b) for(int i=(a);i<(b);i++)
  4. #define per(i,a,b) for(int i=(a);i>=(b);i--)
  5. #define pb push_back
  6. using namespace std;
  7. int n;
  8. int L[100050],R[100050];
  9. int dp[100050];
  10. int last[100050];
  11. void solve()
  12. {
  13. cin>>n;
  14. rep(i,1,n)
  15. {
  16. int d; cin>>d;
  17. R[i]=d%10;
  18. while(d>9)
  19. d/=10;
  20. L[i]=d;
  21. }
  22. int mx=0;
  23. rep(i,1,n)
  24. {
  25. dp[i]=dp[last[L[i]]]+1;
  26. mx=max(mx,dp[i]);
  27. if(dp[i]>dp[last[R[i]])
  28. last[R[i]]=i;
  29. }
  30. cout<<n-mx<<'\n';
  31. }
  32. int main()
  33. {
  34. ios::sync_with_stdio(0);
  35. cin.tie(0);cout.tie(0);
  36. solve();
  37. return 0;
  38. }

F - 岛屿个数

明显,通过搜索的方式实现找环、判点在环内太麻烦了

由于如果某个岛屿 b 完全包含在岛屿 a 内,那么 b 是不会统计到答案里的

因此我们只需要找有多少个岛屿能够接触到最外层的海水即可

不妨将整张图往外扩张一格,让最外层填充满海水,从最外层开始搜索,那么能够从海水中一步到达的岛屿一定是最外层的那些岛屿

需要注意的是,岛屿的环的判定是只有上下左右四个方向,样例中也能看出,例如下图是一个完整的环,内部的海水是不能被搜索的:

  1. 00000
  2. 01110
  3. 01010
  4. 01110
  5. 00000

而下图不是一格完整的环,内部的海水是能被搜索到的,因此内部岛屿需要统计在答案中:

  1. 00000
  2. 00110
  3. 01010
  4. 01110
  5. 00000

根据上面两个例子不难发现,我们在搜索海水的时候,是可以往八个方向搜的(即包含对角)

最后搜索出一些一定是外层岛屿上的位置后,遍历整张图再跑几遍搜索,找出总共有多少个连通块即可

时间复杂度 O(TMN)

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  3. #define repp(i,a,b) for(int i=(a);i<(b);i++)
  4. #define per(i,a,b) for(int i=(a);i>=(b);i--)
  5. #define pb push_back
  6. using namespace std;
  7. typedef pair<int,int> pii;
  8. const int dx[8]={0,1,0,-1,-1,-1,1,1},dy[8]={1,0,-1,0,-1,1,-1,1};
  9. int n,m;
  10. char mp[55][55];
  11. bool vis[55][55];
  12. bool island[55][55];
  13. inline bool prim(int x,int y)
  14. {
  15. return x>=0&&y>=0&&x<=n+1&&y<=m+1;
  16. }
  17. void bfs(int sx,int sy)
  18. {
  19. queue<pii> q;
  20. q.push(pii(sx,sy));
  21. vis[sx][sy]=true;
  22. while(!q.empty())
  23. {
  24. pii p=q.front();
  25. q.pop();
  26. int x=p.first,y=p.second;
  27. repp(i,0,4) // 四个方向
  28. {
  29. int px=x+dx[i],py=y+dy[i];
  30. if(prim(px,py))
  31. {
  32. if(mp[px][py]=='1'&&!vis[px][py])
  33. {
  34. vis[px][py]=true;
  35. q.push(pii(px,py));
  36. }
  37. }
  38. }
  39. }
  40. }
  41. void solve()
  42. {
  43. cin>>n>>m;
  44. rep(i,1,n)
  45. cin>>(mp[i]+1);
  46. rep(i,0,n+1)
  47. rep(j,0,m+1)
  48. vis[i][j]=island[i][j]=false;
  49. // 周围填海水
  50. rep(i,0,n+1)
  51. mp[i][0]=mp[i][m+1]='0';
  52. rep(j,0,m+1)
  53. mp[0][j]=mp[n+1][j]='0';
  54. // 搜海水
  55. queue<pii> q;
  56. q.push(pii(0,0));
  57. vis[0][0]=true;
  58. while(!q.empty())
  59. {
  60. pii p=q.front();
  61. q.pop();
  62. int x=p.first,y=p.second;
  63. repp(i,0,8) // 八个方向
  64. {
  65. int px=x+dx[i],py=y+dy[i];
  66. if(prim(px,py))
  67. {
  68. if(mp[px][py]=='0')
  69. {
  70. if(!vis[px][py])
  71. {
  72. vis[px][py]=true;
  73. q.push(pii(px,py));
  74. }
  75. }
  76. else
  77. island[px][py]=true;
  78. }
  79. }
  80. }
  81. // 搜岛屿
  82. rep(i,0,n+1)
  83. rep(j,0,m+1)
  84. vis[i][j]=false;
  85. int ans=0;
  86. rep(i,1,n)
  87. rep(j,1,m)
  88. if(island[i][j]&&!vis[i][j]) // 如果是没有搜索过的外层岛屿
  89. {
  90. bfs(i,j);
  91. ans++;
  92. }
  93. cout<<ans<<'\n';
  94. }
  95. int main()
  96. {
  97. ios::sync_with_stdio(0);
  98. cin.tie(0);cout.tie(0);
  99. int T; cin>>T; while(T--)
  100. solve();
  101. return 0;
  102. }

G - 子串简写

直接遍历,在遇到字符 b 时统计下 1iK+1 内有多少个字符 a,加入答案即可

统计方面,遇到字符 a 时存下当前位置,只需二分找出最后一个符合条件的位置即可,时间复杂度 O(|S|log|S|);或者直接前缀和,时间复杂度 O(|S|)

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  3. #define repp(i,a,b) for(int i=(a);i<(b);i++)
  4. #define per(i,a,b) for(int i=(a);i>=(b);i--)
  5. #define pb push_back
  6. using namespace std;
  7. typedef long long ll;
  8. typedef pair<int,int> pii;
  9. void solve()
  10. {
  11. int k;
  12. string s;
  13. char a,b;
  14. cin>>k>>s>>a>>b;
  15. vector<int> vec;
  16. ll ans=0;
  17. repp(i,0,s.size())
  18. {
  19. if(s[i]==b)
  20. ans+=upper_bound(vec.begin(),vec.end(),i-k+1)-vec.begin();
  21. if(s[i]==a)
  22. vec.pb(i);
  23. }
  24. cout<<ans<<'\n';
  25. }
  26. int main()
  27. {
  28. ios::sync_with_stdio(0);
  29. cin.tie(0);cout.tie(0);
  30. solve();
  31. return 0;
  32. }

H - 整数删除

记录每个点左侧是哪个位置,记作 Li,右侧是哪个位置,记作 Ri,在删除之后更新一下左右两侧的相对位置

至于删除顺序,STL 维护下一个删除的元素,模拟 K 次即可

时间复杂度 O(NlogN)

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  3. #define repp(i,a,b) for(int i=(a);i<(b);i++)
  4. #define per(i,a,b) for(int i=(a);i>=(b);i--)
  5. #define pb push_back
  6. using namespace std;
  7. typedef long long ll;
  8. int n,k;
  9. ll A[500050];
  10. int L[500050],R[500050];
  11. bool vis[500050];
  12. struct node
  13. {
  14. ll val;
  15. int pos;
  16. node(){}
  17. node(ll _val,int _pos)
  18. {
  19. val=_val;
  20. pos=_pos;
  21. }
  22. bool operator < (const node& a) const
  23. {
  24. if(val!=a.val)
  25. return val<a.val;
  26. return pos<a.pos;
  27. }
  28. bool operator == (const node& a) const
  29. {
  30. return val==a.val&&pos==a.pos;
  31. }
  32. };
  33. set<node> st;
  34. void solve()
  35. {
  36. cin>>n>>k;
  37. rep(i,1,n)
  38. {
  39. cin>>A[i];
  40. L[i]=i-1;
  41. R[i]=i+1;
  42. st.insert(node(A[i],i));
  43. }
  44. rep(i,1,k)
  45. {
  46. node nd=*st.begin();
  47. st.erase(st.begin());
  48. int p=nd.pos;
  49. if(L[p]!=0)
  50. {
  51. st.erase(st.find(node(A[L[p]],L[p])));
  52. A[L[p]]+=A[p];
  53. st.insert(node(A[L[p]],L[p]));
  54. }
  55. if(R[p]!=n+1)
  56. {
  57. st.erase(st.find(node(A[R[p]],R[p])));
  58. A[R[p]]+=A[p];
  59. st.insert(node(A[R[p]],R[p]));
  60. }
  61. // 更新左右两侧相对关系
  62. int tl=L[p],tr=R[p];
  63. L[tr]=tl;
  64. R[tl]=tr;
  65. vis[p]=true;
  66. }
  67. rep(i,1,n)
  68. if(!vis[i])
  69. cout<<A[i]<<(++k==n?'\n':' ');
  70. }
  71. int main()
  72. {
  73. ios::sync_with_stdio(0);
  74. cin.tie(0);cout.tie(0);
  75. solve();
  76. return 0;
  77. }

I - 景区导游

首先,对于每对 (Ai,Ai+1) 通过搜索将最短路找出来,在 N=K=105 的数据范围下是不现实的

但发现给定的图是一棵树,假如可以确定树根 rt,那么树上两点 (a,b) 之间距离也就等于 art 的距离加上 b 到树根的距离减去两倍 lca(a,b) 到树根的距离,这里的 lca(a,b) 表示 ab 两点的最近公共祖先

通过倍增的方法,可以在 O(logN) 的时间复杂度内求出两点的 lca

因此我们可以计算得到按照 A1,A2,,AK 的顺序走时的总距离 sum

但根据题意,对于 i=1k 都需要求一遍当去除 Ai 这个点时的答案是多少,于是分以下三种情况讨论:

  • i=1,则从 sum 中减去 A1 走到 A2 的贡献;
  • i=K,则从 sum 中减去 AK1 走到 AK 的贡献;
  • i[2,k1],则先从 sum 中减去 Ai1 走到 Ai 的贡献,再减去 Ai 走到 Ai+1 的贡献,最后加上 Ai1 走到 Ai+1 的贡献。

时间复杂度 O(NlogN)

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  3. #define repp(i,a,b) for(int i=(a);i<(b);i++)
  4. #define per(i,a,b) for(int i=(a);i>=(b);i--)
  5. #define pb push_back
  6. using namespace std;
  7. typedef long long ll;
  8. typedef pair<int,int> pii;
  9. int n,k;
  10. vector<pii> G[100050];
  11. int A[100050],LCA[100050];
  12. int dep[100050];
  13. int fa[100050][18];
  14. ll dis[100050];
  15. void dfs(int u,int f)
  16. {
  17. fa[u][0]=f;
  18. rep(i,1,17)
  19. fa[u][i]=fa[fa[u][i-1]][i-1];
  20. for(pii &p:G[u])
  21. {
  22. int &v=p.first,&w=p.second;
  23. if(v==f)
  24. continue;
  25. dep[v]=dep[u]+1;
  26. dis[v]=dis[u]+w;
  27. dfs(v,u);
  28. }
  29. }
  30. int lca(int a,int b)
  31. {
  32. while(dep[a]>dep[b])
  33. {
  34. per(i,17,0)
  35. if(dep[a]-(1<<i)>=dep[b])
  36. a=fa[a][i];
  37. }
  38. while(dep[a]<dep[b])
  39. {
  40. per(i,17,0)
  41. if(dep[b]-(1<<i)>=dep[a])
  42. b=fa[b][i];
  43. }
  44. if(a==b)
  45. return a;
  46. while(fa[a][0]!=fa[b][0])
  47. {
  48. per(i,17,0)
  49. if(fa[a][i]!=fa[b][i])
  50. {
  51. a=fa[a][i];
  52. b=fa[b][i];
  53. }
  54. }
  55. return fa[a][0];
  56. }
  57. void solve()
  58. {
  59. cin>>n>>k;
  60. repp(i,1,n)
  61. {
  62. int a,b,w;
  63. cin>>a>>b>>w;
  64. G[a].pb(pii(b,w));
  65. G[b].pb(pii(a,w));
  66. }
  67. rep(i,1,k)
  68. cin>>A[i];
  69. dfs(1,0);
  70. rep(i,2,k)
  71. LCA[i]=lca(A[i-1],A[i]);
  72. ll sum=0;
  73. rep(i,2,k)
  74. sum+=dis[A[i-1]]+dis[A[i]]-2*dis[LCA[i]];
  75. rep(i,1,k)
  76. {
  77. ll tmp=sum;
  78. if(i==1)
  79. tmp-=dis[A[1]]+dis[A[2]]-2*dis[LCA[2]];
  80. else if(i==k)
  81. tmp-=dis[A[k-1]]+dis[A[k]]-2*dis[LCA[k]];
  82. else
  83. {
  84. tmp-=dis[A[i-1]]+dis[A[i]]-2*dis[LCA[i]];
  85. tmp-=dis[A[i]]+dis[A[i+1]]-2*dis[LCA[i+1]];
  86. tmp+=dis[A[i-1]]+dis[A[i+1]]-2*dis[lca(A[i-1],A[i+1])];
  87. }
  88. cout<<tmp<<(i==k?'\n':' ');
  89. }
  90. }
  91. int main()
  92. {
  93. ios::sync_with_stdio(0);
  94. cin.tie(0);cout.tie(0);
  95. solve();
  96. return 0;
  97. }

J - 砍树

可以将题意转换成,对于所有的 m 对给定的点对 (a,b),如果都从 a 走到 b,哪条边被走过了 m 次,多条边则取编号最大的一条

但本题统计的是边走过的次数,因此将边权转化为点权,以 1 为根时,其它所有点的点权都代表着连接自己与父亲的那条边走过的次数

对于从 a 走到 b 的路径上的标记,考虑采用树上差分,在 a 所在位置 +1,在 b 所在位置 +1,在 lca(a,b) 所在位置 2,最后从叶子向树根求和来算出每个点的点权,这里的 lca(a,b) 表示 ab 两点的最近公共祖先,通过倍增实现

搜索时记录下每条边的编号是多少,把点权加到那个编号上,最后倒序找一遍那条边经过次数 =m 即可

时间复杂度 O(nlogn)

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  3. #define repp(i,a,b) for(int i=(a);i<(b);i++)
  4. #define per(i,a,b) for(int i=(a);i>=(b);i--)
  5. #define pb push_back
  6. using namespace std;
  7. typedef long long ll;
  8. typedef pair<int,int> pii;
  9. int n,m;
  10. vector<pii> G[100050];
  11. int dep[100050];
  12. int fa[100050][18];
  13. int cha[100050];
  14. int ans[100050];
  15. void dfs(int u,int f)
  16. {
  17. fa[u][0]=f;
  18. rep(i,1,17)
  19. fa[u][i]=fa[fa[u][i-1]][i-1];
  20. for(pii &p:G[u])
  21. {
  22. int &v=p.first,&w=p.second;
  23. if(v==f)
  24. continue;
  25. dep[v]=dep[u]+1;
  26. dfs(v,u);
  27. }
  28. }
  29. int lca(int a,int b)
  30. {
  31. while(dep[a]>dep[b])
  32. {
  33. per(i,17,0)
  34. if(dep[a]-(1<<i)>=dep[b])
  35. a=fa[a][i];
  36. }
  37. while(dep[a]<dep[b])
  38. {
  39. per(i,17,0)
  40. if(dep[b]-(1<<i)>=dep[a])
  41. b=fa[b][i];
  42. }
  43. if(a==b)
  44. return a;
  45. while(fa[a][0]!=fa[b][0])
  46. {
  47. per(i,17,0)
  48. if(fa[a][i]!=fa[b][i])
  49. {
  50. a=fa[a][i];
  51. b=fa[b][i];
  52. }
  53. }
  54. return fa[a][0];
  55. }
  56. void dfs2(int u,int f)
  57. {
  58. for(pii &p:G[u])
  59. {
  60. int &v=p.first,&id=p.second;
  61. if(v==f)
  62. continue;
  63. dfs2(v,u); // 子树搜索完后再往上传,处理答案
  64. cha[u]+=cha[v];
  65. ans[id]=cha[v];
  66. }
  67. }
  68. void solve()
  69. {
  70. cin>>n>>m;
  71. repp(i,1,n)
  72. {
  73. int a,b;
  74. cin>>a>>b;
  75. G[a].pb(pii(b,i));
  76. G[b].pb(pii(a,i));
  77. }
  78. dfs(1,0);
  79. rep(i,1,m)
  80. {
  81. int a,b;
  82. cin>>a>>b;
  83. cha[a]++;
  84. cha[b]++;
  85. cha[lca(a,b)]-=2;
  86. }
  87. dfs2(1,0);
  88. per(i,n-1,1)
  89. {
  90. if(ans[i]==m)
  91. {
  92. cout<<i<<'\n';
  93. return;
  94. }
  95. }
  96. cout<<-1<<'\n';
  97. }
  98. int main()
  99. {
  100. ios::sync_with_stdio(0);
  101. cin.tie(0);cout.tie(0);
  102. solve();
  103. return 0;
  104. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/430178
推荐阅读
相关标签
  

闽ICP备14008679号