제출 #398528

#제출 시각아이디문제언어결과실행 시간메모리
398528model_codeArboras (RMI20_arboras)C++17
100 / 100
4265 ms19200 KiB
/**
* user:  perju-verzotti-712
* fname: Luca
* lname: Perju-Verzotti
* task:  Arboras
* score: 100.0
* date:  2020-12-04 11:29:29.204456
*/
#include <bits/stdc++.h>

using namespace std;
const long long mod=1000000007;
long long p[100003],t[100003],sz[100003],depth[100003],heavyhead[100003],heavychild[100003];
vector<long long>v[100003];
long long d[100003];
unsigned long long dp[100003],dp1[100003];
long long bstfiu[100003];
long long pzlin[100003];
long long cnttidk;
long long lsb (long long x)
{
    return x&-x;
}
long long aib[100003];
void update (long long pz, long long val)
{
    for(long long i=pz;i<=100000;i+=lsb(i))
        aib[i]=aib[i]+val;
}
long long query (long long pz)
{
    long long rz=0;
    for(long long i=pz;i>0;i-=lsb(i))
        rz=rz+aib[i];
    return rz;
}
long long s=0;
long long tata (long long pz)
{
    if(t[pz]==0 || t[pz]==pz)
        return pz;
    if(cnttidk>10)
        return tata(t[pz]);
    else
        return t[pz]=tata(t[pz]);
}
void dfsinit (long long pz)
{
    t[pz]=pz;
    sz[pz]=1;
    if(v[pz].size()==0)
        return;
    long long bst=v[pz][0];
    long long b1=-1,b2=-1;
    for(long long i=0;i<v[pz].size();++i)
    {
        depth[v[pz][i]]=1+depth[pz];
        dfsinit(v[pz][i]);
        sz[pz]+=sz[v[pz][i]];
        if(sz[v[pz][i]]>sz[bst])
            bst=v[pz][i];
        unsigned long long dpc=dp[v[pz][i]]+d[v[pz][i]];
        if(b1==-1 || dpc>dp[b1]+d[b1])
        {
            b2=b1;
            b1=v[pz][i];
        }
        else if(b2==-1 || dpc>dp[b2]+d[b2])
            b2=v[pz][i];
    }
    dp[pz]=dp[b1]+d[b1];
    if(b2!=-1)
        dp1[pz]=dp[b2]+d[b2];
    t[b1]=pz;
    bstfiu[pz]=b1;
    s=(s+dp[pz])%mod;
    s=(s+dp1[pz])%mod;
    heavychild[pz]=bst;
}
void dfsinit1 (long long pz)
{
    if(heavychild[p[pz]]==pz)
        heavyhead[pz]=heavyhead[p[pz]];
    else
    {
        heavyhead[pz]=pz;
        ++cnttidk;
    }
    for(long long i=0;i<v[pz].size();++i)
        dfsinit1(v[pz][i]);
}
long long tmpc=0;
void dfsinit2 (long long pz)
{
    pzlin[pz]=++tmpc;
    if(heavychild[pz])
        dfsinit2(heavychild[pz]);
    for(long long i=0;i<v[pz].size();++i)
    {
        if(v[pz][i]==heavychild[pz])
            continue;
        dfsinit2(v[pz][i]);
    }
}
void updatelin (long long a, long long b, long long val)
{
    if(depth[a]>depth[b])
        return;
    s=(s+val%mod*1LL*(depth[b]-depth[a]+1)%mod)%mod;
    while(heavyhead[b]!=heavyhead[a])
    {
        update(pzlin[heavyhead[b]],val);
        update(pzlin[b]+1,-val);
        b=p[heavyhead[b]];
    }
    if(heavyhead[a]==heavyhead[b])
    {
        update(pzlin[a],val);
        update(pzlin[b]+1,-val);
        return;
    }
}
void jegupdate (long long pz, long long val)
{
    d[pz]+=val;
    long long pzc=pz;
    while(1)
    {
        long long tc=tata(pzc);
        long long ptc=p[tc];
        if(p[pzc])
            updatelin(tc,p[pzc],val);
        if(tc==1)
            break;
        pzc=tc;
        long long dpc=query(pzlin[pzc]);
        long long dpt=query(pzlin[ptc]);
        if(dpc+d[pzc]>dpt)
        {
            t[bstfiu[ptc]]=bstfiu[ptc];
            bstfiu[ptc]=pzc;
            t[pzc]=ptc;
            val=dpc+d[pzc]-dpt;
            s=(s+dpt-dp1[ptc])%mod;
            dp1[ptc]=dpt;
           // update(pzlin[ptc],val);
           // s=(s+val)%mod;
        }
        else
        {
            if(dpc+d[pzc]>dp1[ptc])
            {
                s=(s+dpc+d[pzc]-dp1[ptc])%mod;
                dp1[ptc]=dpc+d[pzc];
            }
            break;
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    long long n,i,j;
    cin>>n;
    for(i=2;i<=n;++i)
    {
        cin>>p[i];
        ++p[i];
        v[p[i]].push_back(i);
    }
    for(i=2;i<=n;++i)
        cin>>d[i];
    depth[1]=1;
    dfsinit(1);
    dfsinit1(1);
    dfsinit2(1);
    /*if(cnttidk<=10)
    {
        i/=0;
        ++p[-100];
        return 0;
    }*/
    for(i=1;i<=n;++i)
    {
        update(pzlin[i],dp[i]);
        update(pzlin[i]+1,-dp[i]);
    }
    long long q;
    cin>>q;
    cout<<s<<'\n';
    for(i=1;i<=q;++i)
    {
        long long a,b;
        cin>>a>>b;
        ++a;
        jegupdate(a,b);
        cout<<s<<'\n';
    }
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

arboras.cpp: In function 'void dfsinit(long long int)':
arboras.cpp:55:24: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |     for(long long i=0;i<v[pz].size();++i)
      |                       ~^~~~~~~~~~~~~
arboras.cpp: In function 'void dfsinit1(long long int)':
arboras.cpp:89:24: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |     for(long long i=0;i<v[pz].size();++i)
      |                       ~^~~~~~~~~~~~~
arboras.cpp: In function 'void dfsinit2(long long int)':
arboras.cpp:98:24: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |     for(long long i=0;i<v[pz].size();++i)
      |                       ~^~~~~~~~~~~~~
arboras.cpp: In function 'void jegupdate(long long int, long long int)':
arboras.cpp:151:26: warning: comparison of integer expressions of different signedness: 'long long int' and 'long long unsigned int' [-Wsign-compare]
  151 |             if(dpc+d[pzc]>dp1[ptc])
      |                ~~~~~~~~~~^~~~~~~~~
arboras.cpp: In function 'int main()':
arboras.cpp:163:19: warning: unused variable 'j' [-Wunused-variable]
  163 |     long long n,i,j;
      |                   ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...