再編

セグメントツリー

プラグマコメント(リンカ、 "/ STACK:1024000000,1024000000")// HDU 5692

含める

含める

含める

含める

名前空間stdを使用。

MAXN 400010を定義します

INF 1E18を定義します

構造体の再
{
int型のX、Y、RZ。
長い長いZ;
}。
F再[MAXN]。

INT Fiの[MAXN]、NE [MAXN]、U [MAXN]、V [MAXN]。
BOOL VIS [MAXN]。
INT、T = 0、ステップ= 0。
[MAXN] int型。
長い長D [MAXN]。
intデータ[MAXN]。
INT L [MAXN]、R [MAXN]。

長い長いMAX(長い長い、長い長いB)
{
(> b)に戻す場合は、そうでなければ、リターンB。
}
ボイドエッジ(int型のx、int型のY)
{
T ++。
NE [T] = Fiが[X]。
Fiの[X] = T。
U [T] = X。
V [T] = Y。
トン++;
NE [T] = Fiの[Y]。
Fiの[Y] = T。
U [T] = Y。
V [T] = X。
}
ボイドDFS(今INT)
{
ステップ++。
[ステップ]次に=。
L [今] =ステップと
VIS [今] = 1。
以下のために(!; I = - 1; INT iがFiの[今]を= Iは、NE [I]を=)(VIS [V [I]]!)場合
{
INT次= V [i]は、
D [次] + = D [今]。
DFS(次)
}
R [今] =ステップと
リターン;
}

ボイドダウン(int型K)
{
F [K * 2] .rz + = [K] F .rz。
F [K * 2] .Z + = F [K] .rz。

f[k*2+1].rz+=f[k].rz;
f[k*2+1].z+=f[k].rz;    

f[k].rz=0;
return;

}

ボイドアップ(int型K)
{
F [k]は.Z = MAX(F [K * 2] .Z、F [K * 2 + 1] .Z)。
リターン;
}

ボイド更新(int型K、int型のL、R INT、INT ZD)
{
IF((F [k]は.X> R)||(F [k]は.Y <L))のリターン;
IF((F [K] .X> = 1)&&(F [K]・Y <= R))
{
F [k]を.rz + = ZD。
F [K] .Z + = ZD。
// int型私はKを=。printf( "%D%D%D%D%LF%D \ n"は、L、R、F [i]が.X、F [i]が.Y、F [i]が.Z、F [i]は.rz );
リターン;
}

down(k);
update(k*2,l,r,zd);
update(k*2+1,l,r,zd);       

up(k);

// int型私はKを=。printf( "%D%D%D%D%LF%D \ n"は、L、R、F [i]が.X、F [i]が.Y、F [i]が.Z、F [i]は.rz );
リターン;
}

長い長い問い合わせ(int型K、INT L、int型R)
{

//のprintf( "%D%D%D%D%LLD \ n" は、L、R、F [k]は.X、F [K]・Y、F .Z [K])。

if ((f[k].x>r)||(f[k].y<l)) return -INF;
if ((f[k].x>=l)&&(f[k].y<=r))
{
    return f[k].z;
}           
down(k);
long long aa=inquiry(k*2,l,r);
long long bb=inquiry(k*2+1,l,r);    
return max(aa,bb);

}

ボイドビルド(int型K、INT L、INT R)
{
F [k]は.X = L。
F [K] .Y = R。
IF(L == R)
{
F [k]は.Z = D [L]]。
F [K] .rz = 0。
リターン;
}
INT半ば=(L + R)/ 2。
ビルド(K 2、L、MID)。
ビルド(K
2 + 1、中間+ 1、R)。
アップ(K)。
リターン;
}

INTのmain()
{
int型のターン。
cinを>>回します。
int型加瀬= 0;
一方、(turn--)
{

    printf("Case #%d:\n",++kase);
            
    t=0,step=0;
    
    int n,m;
    cin>>n>>m;
    for (int i=0;i<=n;i++) fi[i]=-1;
    for (int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        edge(x,y);
    }
    for (int i=0;i<n;i++)
    {
        scanf("%d",&data[i]);
        d[i]=data[i];
    }
    memset(vis,0,sizeof(vis));
    dfs(0);

printf( "%D%D%D%D \ n" は、I、L [i]は、R [i]は、D [I]); //(; I <N I ++ INTがI = 0)するため

    build(1,1,n);

//ため(INT iが= 1; I <= 15; I ++)のprintf( "%D%D%D%LLD \ n" は、I、F [i]が.X、F [i]が.Y、F [I ] .Z)。

    for (int i=1;i<=m;i++)
    {
        int qwe;
        scanf("%d",&qwe);
        if (qwe==1)
        {
            int xx;
            scanf("%d",&xx);
            printf("%lld\n",inquiry(1,l[xx],r[xx]));
        }
        else if (qwe==0)
        {
            int xx,yy;
            scanf("%d%d",&xx,&yy);
            int delta=yy-data[xx];
            data[xx]=yy;
            update(1,l[xx],r[xx],delta);
        }
    }

}

return 0;

}

おすすめ

転載: www.cnblogs.com/reshuffle/p/11890518.html