Submission #1291304

#TimeUsernameProblemLanguageResultExecution timeMemory
1291304simona1230Designated Cities (JOI19_designated_cities)C++20
0 / 100
2097 ms55988 KiB
#include <bits/stdc++.h>

using namespace std;
const long long maxn=2*1e5+5;

long long n;
vector<long long> v[maxn],a[maxn],b[maxn];
long long q;
long long e[maxn];
long long sum;

void read()
{
    cin>>n;
    for(long long i=1;i<n;i++)
    {
        long long v1,v2,d1,d2;
        cin>>v1>>v2>>d1>>d2;
        v[v1].push_back(v2);
        v[v2].push_back(v1);
        a[v1].push_back(d1);
        b[v1].push_back(d2);
        a[v2].push_back(d2);
        b[v2].push_back(d1);
        sum+=d1;
        sum+=d2;
    }

    cin>>q;
    for(long long i=1;i<=q;i++)
        cin>>e[i];
}


long long up1[maxn],dw1[maxn];
long long vl[maxn];

void dfs2(long long i,long long p)
{
    for(long long j=0;j<v[i].size();j++)
    {
        long long nb=v[i][j];
        if(nb==p)continue;

        dfs2(nb,i);
        up1[i]+=up1[nb]+b[i][j];
        dw1[i]+=dw1[nb]+a[i][j];
    }
}
long long ans3;

void dfs12(long long i,long long p)
{
    for(long long j=0;j<v[i].size();j++)
    {
        long long nb=v[i][j];
        if(nb==p)continue;
        vl[nb]=vl[i]-b[i][j]+a[i][j];
        ans3=max(ans3,vl[nb]);
        dfs12(nb,i);
    }
}

void solve1()
{
    dfs2(1,0);
    ans3=vl[1]=up1[1];
    dfs12(1,0);
}

long long up,dw[maxn];
long long u[maxn];
long long num,in[maxn],out[maxn];
long long op[maxn];

long long t[4*maxn],td[4*maxn];
long long lz[4*maxn];

void build(long long i,long long l,long long r)
{
    if(l==r)
    {
        t[i]=op[l];
        td[i]=dw[op[l]];
        return;
    }

    long long m=(l+r)/2;
    build(i*2,l,m);
    build(i*2+1,m+1,r);

    if(dw[t[i*2]]>dw[t[i*2+1]])t[i]=t[i*2],td[i]=td[i*2];
    else t[i]=t[i*2+1],td[i]=td[i*2+1];
}

void push(long long i,long long l,long long r)
{
    td[i]+=lz[i];
    if(l!=r)
    {
        lz[i*2]+=lz[i];
        lz[i*2+1]+=lz[i];
    }
    lz[i]=0;
}

void update(long long i,long long l,long long r,long long ql,long long qr,long long vl)
{
    push(1,1,n);
    if(ql>qr)return;
    if(ql<=l&&r<=qr)
    {
        lz[i]+=vl;
        push(1,1,n);
        return;
    }
    long long m=(l+r)/2;
    update(i*2,l,m,ql,min(qr,m),vl);
    update(i*2+1,m+1,r,max(m+1,ql),qr,vl);

    if(td[i*2]>td[i*2+1])t[i]=t[i*2],td[i]=td[i*2];
    else t[i]=t[i*2+1],td[i]=td[i*2+1];
}

// t[i] = the original id of the vertex which is the furthest in l-r

long long par[maxn],val[maxn];
void use(long long i)
{
    if(u[i]||par[i]==0)return;

    update(1,1,n,in[i],out[i],-val[i]);
    u[i]=1;
    use(par[i]);
}

void dfs(long long i,long long p)
{
    in[i]=num++;
    op[num-1]=i;
    par[i]=p;

    for(long long j=0;j<v[i].size();j++)
    {
        long long nb=v[i][j];
        if(nb==p)continue;
        val[nb]=a[i][j];

        dw[nb]=dw[i]+a[i][j];
        dfs(nb,i);

        up+=b[i][j];
    }
    out[i]=num;
}

long long cnt;
long long ans[2001];
void prec()
{
    for(long long i=1;i<=n;i++)
    {
        if(v[i].size()>=2)continue;
        cnt++;

        num=1;
        up=0;
        dw[i]=0;
        dfs(i,0);

        build(1,1,n);
        long long curs=0;
        ans[0]=max(ans[0],up);

        for(long long j=1;j<=n-1;j++)
        {
            push(1,1,n);
            curs+=td[1];
            use(t[1]);
            ans[j]=max(ans[j],up+curs);
        }
    }
}

void solve()
{
    for(long long i=1;i<=q;i++)
    {
        if(e[i]==1)cout<<sum-ans3<<endl;
        else if(e[i]>=cnt)cout<<0<<endl;
        else cout<<sum-ans[e[i]-1]<<endl;
    }
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	read();
	prec();
	solve1();
	solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...