JZOJ5730 luoguP2146 [] [] []コメットOJC0396パッケージマネージャ

説明

特定のユーザーのパッケージマネージャにOSXとLinuxユーザーは不慣れではありません。パッケージマネージャを介して、あなたは、コマンドラインでパッケージをインストールすることができ、その後、パッケージマネージャを使用すると、ソースからソフトウェアパッケージをダウンロードして、自動的にすべての依存関係(すなわち、ダウンロードを解決するのに役立つとインストールパッケージが依存インストールされますコンフィギュレーションのすべてを完了するために他のパッケージ)。apt-getは、Debianの/ Ubuntuは使用yumを使用して、だけでなく、OSXの下で利用可能自作のFedora / CentOSのは、優れたパッケージマネージャです。

あなたはあなた自身のパッケージマネージャを設計することを決定しました。必然的に、あなたは、パッケージ間の依存関係を解決する必要があります。パッケージAはパッケージBに依存している場合、以前のインストールパッケージには、最初のソフトウェア・パッケージBをインストールする必要があります。あなたがパッケージBをアンインストールしたい場合一方、あなたはパッケージAをアンインストールする必要があります 今、あなたは、パッケージ間の依存関係をすべて持っています。また、あなたの前の仕事から、0パッケージに加えて、パッケージには、唯一のパッケージの中で上司に依存しますが、パッケージは、任意の数0パッケージに依存しません。依存環の非存在下(M(≧2)パッケージA1、A2、A3、⋯、AM、A1、A2、A2がA3に依存前記依存関係、A3依存A4、...、A [M-1]に依存する場合アム、及びアムA1を頼って、環を構成するm個のパッケージの依存関係と呼ばれる)、そしてもちろんパッケージは存在しませんが、独自に依存します。

今すぐあなたのパッケージマネージャに頼る解決するためのプログラムを記述する必要があります。フィードバックに基づいて、ユーザがソフトウェアパッケージをインストールし、アンインストールしたい、かつ迅速に効果的に(つまり、インストールの数はパッケージ操作がインストールされますインストールされていない、またはアンインストール操作はアンロードするどのように多くのパッケージのインストール状態を変更することになる知っているときどのように多くのインストールされたパッケージ)、あなたのタスクは、このセクションを実装することです。パッケージの数がインストールされたソフトウェアパッケージをインストールすることに注意してください、またはアンインストールするパッケージがインストールされていない、インストールは任意のパッケージのステータスが変更されません、つまり、この場合には、インストール状態を変更するゼロです。


分析

  • しかし、ツリーは、直接断面であってもよいです

  • ソフトウェアのインストール、ルートへのパスのすべてを置くがするように設定されている\(1 \)

  • この時点からインターバル期間ツリーを変更根、ダンス、副業をジャンプしてきました

  • アンインストール用のソフトウェアは、すべてのセットがすることとそのサブツリーを置く(0 \)\します

  • 第1セグメントツリーは、間隔を変更することができるであろう

  • 操作の数前後の異なる数は、ツリー全体を前に取るとの動作の後ことができる\(1 \)を引いた数


コード

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#define MAXN 100005
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define rep(i,a) for (reg i=last[a];i;i=next[i])

using namespace std;

ll last[MAXN],next[MAXN],tov[MAXN];
ll fa[MAXN],top[MAXN],size[MAXN],depth[MAXN],heavy_son[MAXN];
ll tr[MAXN<<2],bz[MAXN<<2],to_tree[MAXN],to_num[MAXN];
ll n,q,tot;
char s[10];

inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
    while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline ll abs(ll x){return x>0?x:-x;}
inline void link(ll x,ll y){next[++tot]=last[x],last[x]=tot,tov[tot]=y;}
inline void dfs1(ll x)
{
    rep(i,x)
    {
        depth[tov[i]]=depth[x]+1,size[tov[i]]=1,dfs1(tov[i]),size[x]+=size[tov[i]];
        if (size[tov[i]]>size[heavy_son[x]])heavy_son[x]=tov[i];
    }
}
inline void dfs2(ll x,ll y)
{
    if (!x)return;top[x]=y;
    to_tree[x]=++tot,to_num[tot]=x,dfs2(heavy_son[x],y);
    rep(i,x)if (tov[i]!=heavy_son[x])dfs2(tov[i],tov[i]);
}
inline void maketree(ll t,ll l,ll r)
{
    bz[t]=-1;if (l==r)return;
    ll mid=(l+r)>>1;maketree(t<<1,l,mid),maketree((t<<1)+1,mid+1,r);
}
inline void downdata(ll t,ll l,ll r)
{
    if (bz[t]==-1)return;ll mid=(l+r)>>1;
    tr[t<<1]=(mid-l+1)*bz[t],tr[(t<<1)+1]=(r-mid)*bz[t];
    bz[t<<1]=bz[(t<<1)+1]=bz[t],bz[t]=-1;
}
inline void tree_modify(ll t,ll l,ll r,ll x,ll y,ll z)
{
    if (l==x && y==r){tr[t]=(r-l+1)*z,bz[t]=z;return;}
    ll mid=(l+r)>>1;downdata(t,l,r);
    if (y<=mid)tree_modify(t<<1,l,mid,x,y,z);
    else if (x>mid)tree_modify((t<<1)+1,mid+1,r,x,y,z);
    else tree_modify(t<<1,l,mid,x,mid,z),tree_modify((t<<1)+1,mid+1,r,mid+1,y,z);
    tr[t]=tr[t<<1]+tr[(t<<1)+1];
}
inline void modify(ll x)
{
    while (top[x]!=1)tree_modify(1,1,n,to_tree[top[x]],to_tree[x],1),x=fa[top[x]];
    tree_modify(1,1,n,1,to_tree[x],1);
}
int main()
{
    //freopen("P2146.in","r",stdin);
    freopen("manager.in","r",stdin);
    freopen("manager.out","w",stdout);
    n=read();fo(i,2,n)link(fa[i]=read()+1,i);
    tot=0,dfs1(depth[1]=size[1]=1),
    dfs2(1,1),maketree(1,1,n),q=read();
    while (q--)
    {
        scanf("%s",&s);ll x=read()+1,tmp=tr[1];
        if (s[0]=='i')
        {
            modify(x),printf("%lld\n",abs(tr[1]-tmp));
            continue;
        }
        tree_modify(1,1,n,to_tree[x],to_tree[x]+size[x]-1,0);
        printf("%lld\n",abs(tr[1]-tmp));
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/horizonwd/p/11716861.html