zoukankan      html  css  js  c++  java
  • bzoj3011 [Usaco2012 Dec]Running Away From the Barn 左偏树

    题目传送门

    https://lydsy.com/JudgeOnline/problem.php?id=3011

    题解

    复习一下左偏树板子。

    看完题目就知道是左偏树了。

    结果这个板子还调了好久。

    大概已经不会写左偏树了。


    时间复杂度 (O(nlog n))

    #include<bits/stdc++.h>
    
    #define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to)
    #define dbg(...) fprintf(stderr, __VA_ARGS__)
    #define File(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
    #define fi first
    #define se second
    #define pb push_back
    
    template<typename A, typename B> inline char smax(A &a, const B &b) {return a < b ? a = b, 1 : 0;}
    template<typename A, typename B> inline char smin(A &a, const B &b) {return b < a ? a = b, 1 : 0;}
    
    typedef long long ll; typedef unsigned long long ull; typedef std::pair<int, int> pii;
    
    template<typename I> inline void read(I &x) {
    	int f = 0, c;
    	while (!isdigit(c = getchar())) c == '-' ? f = 1 : 0;
    	x = c & 15;
    	while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);
    	f ? x = -x : 0;
    }
    
    const int N = 200000 + 7;
    
    #define lc c[0]
    #define rc c[1]
    
    int n; ll l;
    int ans[N], rt[N];
    ll dis[N];
    
    struct Edge { int to, ne; ll w; } g[N << 1]; int head[N], tot;
    inline void addedge(int x, int y, ll z) { g[++tot].to = y, g[tot].w = z, g[tot].ne = head[x], head[x] = tot; }
    inline void adde(int x, int y, ll z) { addedge(x, y, z), addedge(y, x, z); }
    
    struct Node { int c[2], dis, s; ll v; } t[N];
    
    inline int merge(int o, int p) {
    	if (!o || !p) return o ^ p;
    	if (t[o].v < t[p].v) std::swap(o, p);
    	t[o].rc = merge(t[o].rc, p);
    	if (t[t[o].lc].dis < t[t[o].rc].dis) std::swap(t[o].lc, t[o].rc);
    	t[o].dis = t[t[o].rc].dis + 1, t[o].s = t[t[o].lc].s + t[t[o].rc].s + 1;
    	return o;
    }
    inline void pop(int &o) { o = merge(t[o].lc, t[o].rc); }
    
    inline void dfs(int x, int fa = 0) {
    	rt[x] = x, t[x].v = dis[x], t[x].s = 1;
    	for fec(i, x, y) if (y != fa) dis[y] = dis[x] + g[i].w, dfs(y, x), rt[x] = merge(rt[x], rt[y]);
    	while (t[rt[x]].v > dis[x] + l) pop(rt[x]);
    	ans[x] = t[rt[x]].s;
    }
    
    inline void work() {
    	for (int i = 1; i <= n; ++i) if (!dis[i]) dfs(i);
    	for (int i = 1; i <= n; ++i) printf("%d
    ", ans[i]);
    }
    
    inline void init() {
    	read(n), read(l);
    	int x; ll y;
    	for (int i = 2; i <= n; ++i) read(x), read(y), adde(x, i, y);
    }
    
    int main() {
    #ifdef hzhkk
    	freopen("hkk.in", "r", stdin);
    #endif
    	init();
    	work();
    	fclose(stdin), fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    数据库基础(2)
    数据库基础
    多线程(3)
    多线程(2)
    多线程(1)
    并发编程(3)
    软件工程——个人总结
    软件工程第二次作业-结对编程
    软件工程第二次作业——结对编程心得体会
    软件工程第一次作业补充
  • 原文地址:https://www.cnblogs.com/hankeke/p/bzoj3011.html
Copyright © 2011-2022 走看看