首页 > 其他分享 >Codeforces 1129E Legendary Tree

Codeforces 1129E Legendary Tree

时间:2024-05-03 21:56:03浏览次数:30  
标签:std sz back int Tree Codeforces mid second Legendary

考虑让选取的集合更加特殊,不妨就让 \(S = \{x\}\)。
那么这个时候能发现询问 \((S = \{x\}, T, v)\) 得到的就是以 \(x\) 为根时 \(v\) 的子树内 \(T\) 中的点的数量。

考虑定个根,不妨为 \(1\),同时令 \(S = \{1\}\)。
那么询问 \((\{1\}, \{1, \cdots n\} \backslash \{1, x\}, x)\),就可以得到 \(sz_x\)。

因为只有 \(sz_v < sz_u\) 的 \(v\) 可能是 \(u\) 的儿子,考虑按 \(sz\) 增序排序。
考虑当前处理到以 \(u\) 为父亲,寻找 \(u\) 的儿子。
令前面还没有确定父亲的点的集合叫做 \(P\),那么询问 \((\{1\}, P, u)\), 就得到了 \(u\) 的儿子的数量。
对于找儿子,就可以考虑二分,询问 \((\{1\}, P_{1\sim i}, u)\),找到最靠前的一个 \(i\),然后删掉 \(P_i\) 继续找其他的儿子。

询问次数上界为 \(2n + \mathcal{O}(n\log n)\)。

代码
#include<bits/stdc++.h>
const int maxn = 5e2 + 10;
std::pair<int, int> p[maxn];
int ask(int x, int y, std::vector<int> &S) {
   if (S.empty()) return 0;
   std::cout << 1 << std::endl << x << std::endl << S.size() << std::endl;
   for (int u : S) std::cout << u << ' ';
   std::cout << std::endl << y << std::endl;
   std::cin >> x;
   return x;
}
int main() {
   int n;
   scanf("%d", &n);
   std::vector<int> S;
   p[1] = {n, 1};
   for (int i = 2; i <= n; i++) S.push_back(i);
   for (int i = 2; i <= n; i++) {
      S.erase(std::find(S.begin(), S.end(), i));
      p[i] = {ask(1, i, S), i};
      S.push_back(i);
   }
   std::sort(p + 1, p + n + 1);
   S.clear(), S.push_back(p[1].second);
   std::vector<std::pair<int, int> > E;
   for (int i = 2; i < n; i++) {
      int cnt = ask(1, p[i].second, S);
      while (cnt--) {
         int l = 0, r = S.size() - 1, w;
         while (l <= r) {
            int mid = (l + r) >> 1;
            std::vector<int> T(S.begin(), S.begin() + mid + 1);
            ask(1, p[i].second, T) ? (w = mid, r = mid - 1) : (l = mid + 1);
         }
         E.emplace_back(p[i].second, S[w]), S.erase(S.begin() + w);
      }
      S.push_back(p[i].second);
   }
   for (int x : S) E.emplace_back(1, x);
   std::cout << "ANSWER" << std::endl;
   for (auto _ : E) std::cout << _.first << ' ' << _.second << std::endl;
   return 0;
}

标签:std,sz,back,int,Tree,Codeforces,mid,second,Legendary
From: https://www.cnblogs.com/rizynvu/p/18171690

相关文章

  • Codeforces Round 943 (Div. 3)
    无伤但没速通,然后被hack两个题,直接从rk90掉到rk114514+了,我是真他妈的服了。特此纪念A暴力枚举秒了。B二分答案秒了C他妈脑子抽了,差一步完全整解。我们发现只要确定\(a_{\mathbf{1}}\)那么你直接不断加\(x_i\)就能求出\(a_i\),但是直接这么搞过不了样例,观察一下,然后直......
  • Codeforces 452F Permutation
    对于\(a,b,\frac{a+b}{2}\)肯定是需要固定下一些变量来考虑的。考虑固定下\(c=\frac{a+b}{2}\),考虑\(a,b\)。那么这样的\(a,b\)肯定满足\(a-c=b-c,a\not=b\),那么以\(c\)为中心,\(a,b\)就是对称的。用\(s_i=0,1\)来表示\(i\)是在\(c\)的......
  • CompareBinaryTreeDepth
    /*******************************************************************************************************@filename: :CompareBinaryTreeDepth*@brief :采用递归的方式来计算二叉树的深度*@author :[email protected]*@date :2024/05/03*......
  • WPF TreeView HierarchicalDataTemplate
    //xaml<Windowx:Class="WpfApp87.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic......
  • Codeforces 1044F DFS
    考虑到存在方案使得以\(u\)为起点还能走出原树的条件。能发现是以\(u\)为根,在原树上新添加的边只会是返祖边而不会有横叉边。这是因为如果有横叉边就肯定会在遍历到一边的点后先通过这条边走到另一边的点,就算上了这条边就不是原树了。那么考虑\((x,y)\),合法的\(u\)需要......
  • Educational Codeforces Round 165 (Rated for Div. 2) C. Minimizing the Sum题解
    题意CodeforcesRound809(Div.2)D1.ChoppingCarrots(EasyVersion)给你两个整数\(n(1\len\le3e5),k(0\lek\le10)\),一个数组\(a(1\lea_i\le10^9)\)。你可以进行如下操作最多\(k\)次:选定一个数\(i(1\lei\len)\),让其变为相邻的数(变为\(a_{i-1},a_{i......
  • Codeforces Round 942 (Div. 2) (A - E)
    A.ContestProposal如果\(a_i>b_i\),则答案加一,令\(\foralli\in[i+1,n],\a_i\leftarrowa_{i-1}\)。submissionB.CoinGames题意:\(n\)枚硬币围成一圈,给出初始硬币状态,每取出一枚正面朝上的硬币并翻转相邻的两枚,没有正面则对方获胜,问先手胜负。令当前正面硬......
  • Codeforces Round 942 (Div. 2)
    CodeforcesRound942(Div.2)A.ContestProposal题意:有n个题目,每个题目的难度为a[i],要求每个题目的难度不大于对应的b[i],每次可以添加一个题目并且删去最难的题目,求最多能添加几个题目思路:暴力枚举即可,只要a[i]大于b[i],就把a[n]改为b[i],然后重新排序voidsolve(){int......
  • Codeforces Round 942 Div.2 题解
    蹭个热度,挽救一下cnblogs蒸蒸日上的阅读量。Q:你是手速狗吗?A:我觉得我是。2A因为选的\(w\)一定可以让它合法,一次操作可以看作\(a\)数组向右平移一位。枚举操作次数后暴力判断即可。#include<bits/stdc++.h>voidwork(){ intn; std::cin>>n; std::vector<......
  • 「CF1017G」The Tree
    这是一道非常NB的题意转化题.Introduction给定一棵树,维护以下3个操作:1x表示如果节点\(x\)为白色,则将其染黑.否则对这个节点的所有儿子递归进行相同操作;2x表示将以节点\(x\)为\(root\)的子树染白;3x表示查询节点\(x\)的颜色.StrikingIdeas修改复......