首页 > 其他分享 >Codeforces Round 897 (Div. 2)

Codeforces Round 897 (Div. 2)

时间:2023-09-12 19:14:51浏览次数:42  
标签:cur 897 int u64 Codeforces long st nex Div

F. Most Different Tree

当 \(n=2\) 时,只能构造一条长度为 \(2\) 的链。

当 \(n\ge 3\) 时,对于 \(i\) \((1\le i\le n)\),以 \(i\) 作为根的树记为 \(h_i\),考虑枚举树找一个大小为 \(s\) 的树 \(t\),使得不存在任何一个 \(h_i=t\),且 \(s\) 尽可能小,然后从 \(1\) 连一条链到该数的根节点。

这样可以保证构造出来的以 \(1\) 到 \(t\) 为根的树都和所给的不同。

使用树 \(\text{hash}\)。

#include "bits/stdc++.h"

using namespace std;
using i64 = long long;
using u64 = unsigned long long;

const u64 mask = chrono::steady_clock::now().time_since_epoch().count();

u64 shift(u64 x) {
    x ^= mask;
    x ^= x << 13;
    x ^= x >> 7;
    x ^= x << 17;
    x ^= mask;
    return x;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    vector<vector<int>> g(n);
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;

        u--, v--;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    if (n == 2) {
        cout << "1 2\n";
        return 0;
    }

    unordered_set<u64> st(1024);
    st.max_load_factor(0.25);

    function<u64(int, int)> dfs = [&](int cur, int pre) {
        u64 h = 1;
        for (auto &nex : g[cur]) {
            if (nex != pre) {
                h += shift(dfs(nex, cur));
            }
        }
        st.insert(h);
        return h;
    };  

    dfs(0, -1);

    vector<vector<int>> b(n);

    function<u64(int)> TreeHash = [&](int cur) {
        u64 h = 1;
        for (auto &nex : b[cur]) {
            h += shift(TreeHash(nex));
        }
        return h;
    };

    for (int s = 2; s <= n; s++) {
        function<void(int, int)> get = [&](int cur, int pre) {
            if (cur == s) {
                if (st.count(TreeHash(0))) {
                    return;
                }

                for (int i = 1; i <= n - s; i++) {
                    cout << i << ' ' << i + 1 << '\n';
                } 

                for (int i = 0; i < s; i++) {
                    for (auto &j : b[i]) {
                        cout << i + n - s + 1 << ' ' << j + n - s + 1 << '\n';
                    }
                }
                exit(0);
            }

            for (int i = pre; i < cur; i++) {
                b[i].push_back(cur);
                get(cur + 1, i);
                b[i].pop_back();
            }
        };

        get(1, 0);
    }

    return 0;
}

标签:cur,897,int,u64,Codeforces,long,st,nex,Div
From: https://www.cnblogs.com/kiddingma/p/17697545.html

相关文章

  • html div && span 容器元素
    htmldiv&&span容器元素div标签定义HTML文档中的一个分隔区块或者一个区域部分,标签常用于组合块级元素,以便通过CSS来对这些元素进行格式化span用于对文档中的行内元素进行组合标签提供了一种将文本的一部分或者文档的一部分独立出来的方式<html><head>......
  • Codeforces Round 897 (Div. 2)
    CodeforcesRound897(Div.2)A.green_gold_dog,arrayandpermutation分析:由题意:\[c_i=a_i-b_i\]\(c_i\)种类最多就是\(n\)个数都不同。若\(a_i\)不断变大,\(b_i\)不断变小,那么\(c_i\)会不断变大。代码:#include<bits/stdc++.h>usingnamespacestd;usingll......
  • Codeforces Round 897 (Div. 2) A~E
    CodeforcesRound897(Div.2)A~EA:原先数组里面最小的位置放最大的数,次小的放次大的即可。voidsolve(){ intn;cin>>n; for(inti=1;i<=n;i++){ intx;cin>>x; c[i]={x,i}; } sort(c+1,c+1+n); intnum=n; for(inti=1;i<=n;i++){ ans[c[i].second]=num;num--......
  • Codeforces Round 896 (Div. 2)
    CodeforcesRound896(Div.2)A.MakeItZero代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingi128=__int128;intn,m;voidsolve(){scanf("%d",&n);vector<int>a(n+1);for(inti......
  • CodeForces 542B Duck Hunt
    洛谷传送门CF传送门首先转化一下,让鸭子不动,猎人往右移动,就相当于开的相邻两枪距离\(>m\)。设\(f_{x,i}\)为仅考虑\(r\lex\)的鸭子,上一次在\(i\)开枪,能打到的最大鸭子个数。\(f_{x-1}\tof_x\)时,首先有\(f_{x,i}=f_{x-1,i}\)。我们先找到所有\(r=x\)......
  • Codeforces Round 896 (Div. 1)
    Preface不管怎么说,最后还是被我苟上橙名了(虽然刚好2100整,不多不少)感觉我在1900~2100之间卡了好久好久,反观我的队友都是打上紫名后随便两三场就打上橙了,狠狠地羞辱我这个铁混子由于暑假集训打的校内排名比较高,作为新队伍也拿到了今年的一场CCPC+一场ICPC的名额,虽然要自费出行但......
  • Codeforces Round 101 (Div. 2) C - E
    C.Queue(思维、排序、构造、*1800)题意:$n$个人排队,为他们构造一组身高,使得$x$的前面有$a_i$个人比他高。如果无法构造满足所有条件的身高序列,输出-1。思路:首先考虑,对于$a_i$较大的人,肯定尽可能地将其往队伍后面放,然后从后往前构造,因为只有$......
  • abc288F - Integer Division
    F-IntegerDivision挺有意思的一道题,贪心的做法就是排序之后,逐个加入,如果不能被之前的表示则加入题解证明的话大概是这样考虑第i个数选不选首先加入前面选的数,如果能够表示当前的数,则必然不选否则前面的数不能表示当前的数,假如我们不选\(p_i\)假设最后得到一个合法序列,则......
  • 【题解】Educational Codeforces Round 142(CF1792)
    没有手速,再加上被E卡了,废掉了。A.GamingForces题目描述:Monocarp正在玩电脑游戏。他打算杀死\(n\)个怪兽,第\(i\)个的血量为\(h_i\)。Monocarp的角色有两个魔法咒语如下,都可以以任意顺序用任意次(可以不用),每次使用相当于一次操作。选择两个怪兽并各扣一滴血。选择......
  • Codeforces Global Round 21 B. NIT Destroys the Universe
    给一个长为\(n\)的数组,可以执行以下操作任意次:选择\(l,r(1\leql<r\leqn)\),让\(\foralli(l\leqi\leqr),a_i=mex(\{a_l,a_{l+1},\cdots,a_{r}\})\)。问最小操作数使得\(\foralli,a_i=0\)。观察:答案\(\leq2\),因为对\([1,n]\)操作不超过两次......