首页 > 其他分享 >Codeforces Round 967 (Div. 2) - C

Codeforces Round 967 (Div. 2) - C

时间:2024-08-24 14:15:49浏览次数:14  
标签:std 967 cout int Codeforces Test Div 节点 define

题意概述

这是一个交互题。

有一棵有 \(n\) 个节点的树,节点编号从 \(1\) 到 \(n\) ,并要求你使用以下类型的查询来猜测它:

  • "? a b" 会告诉你哪个节点 \(x\) 在点 \(a\) 和 \(b\) 之间(\(|d(a,x) - d(b,x)|\) 的值最小),其中 \(d(x,y)\) 是节点 \(x\) 和 \(y\) 之间的距离。如果存在不止一个这样的节点,那么会告诉你哪个节点在哪一个 \(x\) 使 \(d(a,x)\) 最小。

用最多 \(15n\) 次查询找出树的结构。

思路

对于每一个 \(n\) 我们可以深搜节点编号 \(p\) 的点和 \(i\) 之间的节点,得到的值为 \(w\) 若 \(w\) 和 \(p\) 相等就在 \(p\) 和 \(i\) 之间连一条边,否则就继续深搜 \(w\) 和 \(i\),初始时 \(p\) 等于 \(1\),\(2 \le i \le n\)。对于每次输出使用 fflush(stdout); 清空缓存。输出格式! a1 b1 a2 b2……

代码

#include <bits/stdc++.h>
#define ll long long
#define N 100001
#define mod 998244353
#define ios std::ios::sync_with_stdio(false)
#define itie std::cin.tie(0)
#define otie std::cout.tie(0)
std::mt19937_64 mrand(std::random_device{}());
 
int Test;
std::vector<int> a, b;
 
inline void solve(int p, int i) {
    std::cout << "? " << p << " " << i << std::endl;
    fflush(stdout);
    int w;
    std::cin >> w;
    if (w == p) {
        a.push_back(p),
        b.push_back(i);
        return;
    }
    solve(w, i);
}
 
int main() {
    std::cin >> Test; 
    for ( ; Test--; ) {
        int n;
        std::cin >> n;
        a.clear();
        b.clear();
        for (int i = n; i >= 2; i--)
            solve(1, i);
        std::cout << "! ";
        for (int i = 0; i < n - 1; i++)
            std::cout << a[i] << " " << b[i] << " ";
        puts("");
        fflush(stdout);
    }
}

标签:std,967,cout,int,Codeforces,Test,Div,节点,define
From: https://www.cnblogs.com/Sliver-jiblogs/p/18377713

相关文章

  • CodeForces - 1353D Constructing the Array
    CodeForces-1353D这道题也可能比较简单,主要是要想到优先队列要怎么使用,这一点如果用递归会写不了但是因为对优先队列不太熟悉,只有被提示可以用优先队列才想到要怎么用,还是很重要的STL注意运算符的重构应该反着来写其他的思维很朴素,运算符的重构就是,先比较长度,优先用长度长......
  • CodeForces-431C k-Tree
    感觉这个题的dp还是有点思维的,可能就是我现在能做到的题目的天花板级别的了,dp还是要点灵感感觉,以下是代码,可能要写题解要过好久,先水着include<bits/stdc++.h>defineintlonglongdefineendl'\n'usingnamespacestd;constintmod=1000000007;intn,k,d;intdp[200][2]=......
  • CodeForces - 1336A Linova and Kingdom
    CodeForces-1336A就差一点点,很可惜,少发现个很显而易见的结论就是一个点的价值,实际上就是(这个点的深度-之后的点的数目)就是\(depth_i-size_i\)然后只要用dfs维护就好了然后把一个点的价值用STL优先队列放在一起,贪心完成。但是可能也算不上什么贪心,因为是很朴素的东西......
  • Codeforces Round 967 (Div. 2)
    A.MakeAllEqual签到题,先确定最终答案,然后把其他数删去,转化为统计众数点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsignedlonglongintread(){intx=0;boolf=false;charc=getchar();while(c<......
  • Codeforces Round 967(Div.2)之赛后总结
    CodeforcesRound967(Div.2)传送锚点A.MakeAllEqual1.题面分析废话这么多,说白了就是求总数减去最多出现数的个数的值。2.解法直接用桶装一下,然后扫一遍维护最大值。3.code#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e6+520;......
  • Codeforces Round 967 (Div. 2) ABCD
    来源:CodeforcesRound967(Div.2)做题时间:2024_08_21A.MakeAllEqual使所有元素相等的最小操作次数,就是保留最大的数字所以操作次数就是总数减去数量最多得数B.GeneratePermutation题意构造一个序列\(p\),内部元素是\([1,2,\cdots,n]\)打乱使长度为\(n\)的初始......
  • Solution - Codeforces 1970G3 Min-Fund Prison (Hard)
    时间\(\mathcal{O}(\frac{n\sqrt{n}\logn}{\omega})\)空间\(\mathcal{O}(\frac{n\logn}{w})\)的爆标做法。首先无解当且仅当图联通且无割边。首先考虑加边的贡献。一个比较直观的感受就是只会尽可能少的加边,即加边到整个图连通。证明考虑删掉的边。如果加多了边导致删......
  • Codeforces Round 967 (Div. 2)-D
    CodeforcesRound967(Div.2)-D这些天在留校集训……我之前空余时间在看模电,最近在玩黑猴……九月开学了估计也不能闲下来……但这个博客我还是会抽空更新的╰(°▽°)╯Problem-D-Codeforces虽然代码写得特别丑陋,但好歹是我完全想的思路——自己还de了一天bug(゜ー゜)......
  • Codeforces Round 967 (Div. 2)
    题不难。A.MakeAllEqual题意:一个圆,上面有\(n\)个数,每次可以删去相邻的两个不同数中任意一个,求至少几次使得剩下的数都一样。显然下界是出现次数最多的数且一定能取到,时间复杂度\(O(n)\)。提交记录B.GeneratePermutation题意:要求构造一个排列,使得\(x\)所在位置大......
  • CF 2001 E2 solution (967 Div.2)
    CF2001E2由于对称,所以设\(heap[u]\)为两次确定堆,且第一次弹出的是\(u\),\(heap[u,v]\)是第一次\(u\),第二次\(v\)则答案就是\(\sumheap[u]=2^{n-1}·heap[x]\)其中\(x\)任意。不妨我们考虑第一次都是从第一个叶子弹出,那么对于其他不同的第二个弹出的点,根据对称性......