zoukankan      html  css  js  c++  java
  • 十二省联考 Day2 T2 春节十二响(贪心)

    什么启发式合并,我不懂,我就是知道可以贪心!!!

    其实是到很水的题目

    我这么菜的人其实也是可以做出来的

    但是,嗯,真香

    暴力不说,直接是链

    那么相当于就是把两边的子树合并起来,把 a 小的 和 a 大的合并在一起

    那么是否能够推广到树上?

    答案是肯定的

    然后就没了

    我们对于每个点都开一个堆,每次将 siz 较小的合并到 siz 较大的堆中

    #include <map>
    #include <set>
    #include <ctime>
    #include <queue>
    #include <stack>
    #include <cmath>
    #include <vector>
    #include <bitset>
    #include <cstdio>
    #include <cctype>
    #include <string>
    #include <numeric>
    #include <cstring>
    #include <cassert>
    #include <climits>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std ;
    //#define int long long
    #define rep(i, a, b) for (int i = (a); i <= (b); i++)
    #define per(i, a, b) for (int i = (a); i >= (b); i--)
    #define loop(s, v, it) for (s::iterator it = v.begin(); it != v.end(); it++)
    #define cont(i, x) for (int i = head[x]; i; i = e[i].nxt)
    #define clr(a) memset(a, 0, sizeof(a))
    #define ass(a, sum) memset(a, sum, sizeof(a))
    #define lowbit(x) (x & -x)
    #define all(x) x.begin(), x.end()
    #define ub upper_bound
    #define lb lower_bound
    #define pq priority_queue
    #define mp make_pair
    #define pb push_back
    #define pof pop_front
    #define pob pop_back
    #define fi first
    #define se second
    #define iv inline void
    #define enter cout << endl
    #define siz(x) ((int)x.size())
    #define file(x) freopen(#x".in", "r", stdin),freopen(#x".out", "w", stdout)
    typedef long long ll ;
    typedef unsigned long long ull ;
    typedef pair <int, int> pii ;
    typedef vector <int> vi ;
    typedef vector <pii> vii ;
    typedef queue <int> qi ;
    typedef queue <pii> qii ;
    typedef set <int> si ;
    typedef map <int, int> mii ;
    typedef map <string, int> msi ;
    const int N = 200010 ;
    const int INF = 0x3f3f3f3f ;
    const int iinf = 1 << 30 ;
    const ll linf = 2e18 ;
    const int MOD = 1000000007 ;
    const double eps = 1e-7 ;
    void douout(double x){ printf("%lf
    ", x + 0.0000000001) ; }
    template <class T> void print(T a) { cout << a << endl ; exit(0) ; }
    template <class T> void chmin(T &a, T b) { if (a > b) a = b ; }
    template <class T> void chmax(T &a, T b) { if (a < b) a = b ; }
    template <class T> void upd(T &a, T b) { (a += b) %= MOD ; }
    template <class T> void mul(T &a, T b) { a = (ll) a * b % MOD ; }
    
    int top, n, m, tim ;
    int head[N], id[N], fa[N], tmp[N], a[N] ;
    pq <int> q[N] ;
    
    struct Edge {
    	int to, nxt ;
    } e[N << 1] ;
    
    void add(int x, int y) {
    	e[++top] = (Edge) {y, head[x]} ;
    	head[x] = top ;
    }
    
    void dfs(int x) {
    	id[x] = ++tim ;
    	cont(i, x) {
    		int y = e[i].to ;
    		dfs(y) ;
    		if (siz(q[id[x]]) < siz(q[id[y]])) swap(id[x], id[y]) ;
    		int m = siz(q[id[y]]) ;
    		rep(i, 1, m) {
    			tmp[i] = max(q[id[x]].top(), q[id[y]].top()) ;
    			q[id[x]].pop() ;
    			q[id[y]].pop() ;
    		}
    		rep(i, 1, m) q[id[x]].push(tmp[i]) ;
    	}
    	q[id[x]].push(a[x]) ;
    }
    
    /*
    其实链的部分分已经提示你可以尝试合并两个集合的最大值了
    我们对于每个点都开一个堆,每次将 siz 较小的合并到 siz 较大的堆中
    */
    
    signed main(){
    //	file(test) ;
    	scanf("%d", &n) ;
    	rep(i, 1, n) scanf("%d", &a[i]) ;
    	rep(i, 2, n) scanf("%d", &fa[i]), add(fa[i], i) ;
    	dfs(1) ;
    	ll ans = 0 ;
    	while (!q[id[1]].empty()) ans += q[id[1]].top(), q[id[1]].pop() ;
    	printf("%lld
    ", ans) ;
    	return 0 ;
    }
    
    /*
    写代码时请注意:
    	1.ll?数组大小,边界?数据范围?
    	2.精度?
    	3.特判?
    	4.至少做一些
    思考提醒:
    	1.最大值最小->二分?
    	2.可以贪心么?不行dp可以么
    	3.可以优化么
    	4.维护区间用什么数据结构?
    	5.统计方案是用dp?模了么?
    	6.逆向思维?
    */
    
    
    
    
    加油ヾ(◍°∇°◍)ノ゙
  • 相关阅读:
    LeetCode: LRU Cache
    LeetCode: Reorder List
    LeetCode: Linked List Cycle I && II
    LeetCode: Word Break I && II
    LeetCode: Single Number I && II
    太坑了,mybatis注解一对多,id没了
    ajax请求参数的格式
    查询结果拼接
    id拼接保存到单个字段后作为表连接的查询条件
    seam的定时轮巡
  • 原文地址:https://www.cnblogs.com/harryhqg/p/10672789.html
Copyright © 2011-2022 走看看