zoukankan      html  css  js  c++  java
  • 《CF767C Garland》

    难顶,这题其实不难,但是细节问题出的有点多。

    考虑删的两条边的相对位置,如果他们的LCA不等于他们,那么很显然就是LCA的两个子树里删边。

    如果LCA = 其中一条边,那么就有LCA = 2 * average,然后子树内再删一条。这里记录一下子树里 = average / 3的即可。

    emmm细节有点多。

    // Author: levil
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef long double ld;
    typedef pair<int,int> pii;
    const int N = 1e6 + 5;
    const int M = 1e4 + 5;
    const LL Mod = 998244353;
    #define rep(at,am,as) for(int at = am;at <= as;++at)
    #define ret(at,am,as) for(int at = am;at >= as;--at)
    #define INF 1e9
    #define dbg(ax) cout << "now this num is " << ax << endl;
    inline long long ADD(long long x,long long y) {
        if(x + y < 0) return ((x + y) % Mod + Mod) % Mod;
        return (x + y) % Mod;
    }
    inline long long MUL(long long x,long long y) {
        if(x * y < 0) return ((x * y) % Mod + Mod) % Mod;
        return x * y % Mod;
    }
    inline long long DEC(long long x,long long y) {
        if(x - y < 0) return (x - y + Mod) % Mod;
        return (x - y) % Mod;
    }
    
    int n,rt,val[N],now,dp[N],vis[N];
    vector<pii> G[N];
    void dfs(int u,int fa,int id) {
        dp[u] = val[u];
        vector<int> vec;
        for(auto v : G[u]) {
            if(v.first == fa) continue;
            dfs(v.first,u,v.second);
            if(vis[v.first]) vec.push_back(vis[v.first]);
            dp[u] += dp[v.first];
        }
        if(vec.size() > 1) {
            printf("%d %d\n",vec[0],vec[1]);
            exit(0);
        }
        else if(u != rt && dp[u] == 2 * now && vec.size() > 0) {
            printf("%d %d\n",id,vec[0]);
            exit(0);
        }
        if(dp[u] == now) vis[u] = id;
        else if(vec.size() > 0) vis[u] = vec[0];
    }
    void solve() {
        scanf("%d",&n);
        int sum = 0;
        rep(i,1,n) {
            int x,y;scanf("%d %d",&x,&y);
            val[i] = y;
            if(x == 0) rt = i;
            else {
                G[x].push_back(pii{i,i});
                G[i].push_back(pii{x,i});
            }
            sum += val[i];
        }
        if(sum % 3 != 0) {printf("-1\n");exit(0);}
        now = sum / 3;
        dfs(rt,0,0);
        printf("-1\n");
    }   
    int main() {
        //int _;
        //for(scanf("%d",&_);_;_--) {
            solve();
        //}
        system("pause");
        return 0;
    }
    /*
    3
    0 1
    1 2
    1 3
    
    
    */
    View Code
  • 相关阅读:
    对获取的DataTable表进行过滤筛选得到DataView
    简单提取iOS13的ipsw固件的内置壁纸(或文件)
    win10设置Python程序定时运行(设置计划任务)
    后端返回一个这种类型的时间格式给前端2020-01-16T09:10:02.349Z
    js把每个词的首字母转大写
    idea连接mysql自动生成实体类
    el自定义函数
    js日期时间格式化
    js大小写转换
    js瞄点
  • 原文地址:https://www.cnblogs.com/zwjzwj/p/15621122.html
Copyright © 2011-2022 走看看