[APIO2012]派遣

2021-06-17 06:05

阅读:693

标签:back   return   cto   struct   ons   [1]   clu   roo   problem   

P1552 [APIO2012]派遣

遍历每个点,维护可并堆。

遍历结束后,将所有儿子的可并堆并起来。并计算答案。

#include 
#include 
#include 
#include 
#include 

using std::vector;
using std::max;
using std::swap;

const int maxn=100010;

struct Data
{
    long long sum,val;
    int ch[2];
    int dis=0;
    int tot;
    int p,f;
    void Set(int a=0,int b=0,int c=0,int d=0,int e=0,int g=0)
    {
        sum=a;val=b;
        p=c;f=d;
        tot=e;
        dis=g;
    }
};

Data H[maxn];
vectorV[maxn];
long long I[maxn],Cost[maxn],ans;
int n,m,root;

int Find(int x)
{
    if(H[x].f==x)   return x;
    return H[x].f=Find(H[x].f);
}

int Merge(int x,int y)
{
    if(!x||!y)  return x+y;
    if(H[x].valy))    swap(x,y);
    H[x].ch[1]=Merge(H[x].ch[1],y);
    H[H[x].ch[1]].f=Find(x);
    int &Ls=H[x].ch[0],&Rs=H[x].ch[1];
    if(H[Ls].dism)
    {
        int Ls=H[pas].ch[0],Rs=H[pas].ch[1];
        H[Ls].f=Ls;H[Rs].f=Rs;
        H[pas].Set(0,0,0,Merge(Ls,Rs));
        pas=Find(pas);
    }
    ans=max(ans,I[now]*H[pas].tot);
    return ;
}

void dfs(int now)
{
    H[now].Set(Cost[now],Cost[now],now,now,1);
    for(int i=0;i

[APIO2012]派遣

标签:back   return   cto   struct   ons   [1]   clu   roo   problem   

原文地址:https://www.cnblogs.com/Lance1ot/p/10332308.html


评论


亲,登录后才可以留言!