Submission #1011075

# Submission time Handle Problem Language Result Execution time Memory
1011075 2024-06-29T18:29:14 Z imarn JOI tour (JOI24_joitour) C++17
6 / 100
1114 ms 293972 KB
#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define plx pair<ll,int>
#define f first
#define s second
#define pb push_back
#define all(x) x.begin(),x.end()
#define vi vector<int>
#define vl vector<ll>
#define vvi vector<vi>
using namespace std;
const int mxn=2e5+5;
vector<int>g[mxn],f;
int sz[mxn]{0},lv[mxn]{0},pr[mxn];
bool vis[mxn]{0};
ll ans=0;
int getsz(int u,int p){
    sz[u]=1;
    for(auto v:g[u])if(v!=p&&!vis[v])sz[u]+=getsz(v,u);
    return sz[u];
}
int getct(int u,int p,int r){
    for(auto v:g[u])if(v!=p&&!vis[v]&&sz[v]*2>r)return getct(v,u,r);
    return u;
}
vector<ll>dp[6][mxn];
ll td[6][mxn]{0};
struct few{
    ll fw[mxn]{0};
    void add(int i,int amt){
        for(;i<mxn;i+=i&-i)fw[i]+=amt;
    }
    ll qr(int i,ll res=0){
        for(;i;i-=i&-i)res+=fw[i];
        return res;
    }
}fw[3][19],wf[3][19];
int tin[19][mxn],tout[19][mxn],cnt[19]{0},ID[19][mxn];
ll getP(int col,int lvl,int u){
    return fw[col][lvl].qr(tin[lvl][u]);
}
ll getC(int col,int lvl,int u){
    return wf[col][lvl].qr(tout[lvl][u])-wf[col][lvl].qr(tin[lvl][u]-1);
}
void gen1(int u,int p,int x,int id,int x0,int x1,int x2){
    dp[f[u]][x][id]++;tin[lv[x]][u]=++cnt[lv[x]];
    fw[f[u]][lv[x]].add(tin[lv[x]][u],1);
    if(f[u]==2)dp[3][x][id]+=x1;
    for(auto v:g[u])if(v!=p&&!vis[v])gen1(v,u,x,id,x0+(f[v]==0),x1+(f[v]==1),x2+(f[v]==2));
    tout[lv[x]][u]=cnt[lv[x]];ID[lv[x]][u]=id;
    fw[f[u]][lv[x]].add(tout[lv[x]][u]+1,-1);
}
void gen2(int u,int p,int x,int id){
    for(auto v:g[u])if(v!=p&&!vis[v])gen2(v,u,x,id);
    wf[f[u]][lv[x]].add(tin[lv[x]][u],1);
    if(f[u]==1)dp[4][x][id]+=getC(0,lv[x],u);
}
void play(int u,int p){int id=-1;
    u = getct(u,u,getsz(u,u));vis[u]=1;
    pr[u]=p;if(p!=-1)lv[u]=lv[p]+1;
    tin[lv[u]][u]=++cnt[lv[u]];
    for(auto v:g[u]){
        if(vis[v])continue;
        for(int i=0;i<6;i++)dp[i][u].pb(0);id++;
        gen1(v,u,u,id,(f[v]==0),(f[v]==1),(f[v]==2));gen2(v,u,u,id);
        for(int i=0;i<5;i++)td[i][u]+=dp[i][u][id];td[5][u]+=dp[0][u][id]*dp[2][u][id];
    }tout[lv[u]][u]=cnt[lv[u]];
    for(int j=0;j<=id;j++){
        ans+=dp[0][u][j]*(td[3][u]-dp[3][u][j]);
        ans+=dp[4][u][j]*(td[2][u]-dp[2][u][j]);
        if(f[u]==1)ans+=dp[0][u][j]*(td[2][u]-dp[2][u][j]);
    }if(f[u]==0)ans+=td[3][u];if(f[u]==2)ans+=td[4][u];
    for(auto v:g[u])if(!vis[v])play(v,u);
}
void init(int N, std::vector<int> F, std::vector<int> U, std::vector<int> V,int Q){
    f=F;for(int i=0;i<N-1;i++)g[U[i]].pb(V[i]),g[V[i]].pb(U[i]);
    play(0,-1);
}
void up(int col,int u,int sig){
    int x=u;
    if(col==0){
        ans+=td[3][u]*sig;x=pr[u];int j=ID[lv[x]][u];
        while(x!=-1){
            ans-=dp[0][x][j]*(td[3][x]-dp[3][x][j]);
            ans-=dp[4][x][j]*(td[2][x]-dp[2][x][j]);
            ans-=dp[3][x][j]*(td[0][x]-dp[0][x][j]);
            ans-=dp[2][x][j]*(td[4][x]-dp[4][x][j]);
            if(f[x]==1)ans-=td[0][x]*td[2][x]-td[5][x];
            if(f[x]==2)ans-=td[4][x];td[0][x]+=sig;dp[0][x][j]+=sig;
            td[5][x]-=td[0][x]*td[2][x];
            td[4][x]-=dp[4][x][j];
            dp[4][x][j]+=sig*getP(1,lv[x],u);
            td[4][x]+=dp[4][x][j];
            td[5][x]+=td[0][x]*td[2][x];
            if(f[x]==1)ans+=td[0][x]*td[2][x]-td[5][x];
            if(f[x]==2)ans+=td[4][x];
            ans+=dp[0][x][j]*(td[3][x]-dp[3][x][j]);
            ans+=dp[4][x][j]*(td[2][x]-dp[2][x][j]);
            ans+=dp[3][x][j]*(td[0][x]-dp[0][x][j]);
            ans+=dp[2][x][j]*(td[4][x]-dp[4][x][j]);
            fw[0][lv[x]].add(tin[lv[x]][u],sig);
            fw[0][lv[x]].add(tout[lv[x]][u]+1,-sig);
            wf[0][lv[x]].add(tin[lv[x]][u],sig);
            if(pr[x]==-1)break;x=pr[x];j=ID[lv[x]][u];
        }
    }
    else if(col==1){
        ans+=(td[0][u]*td[2][u]-td[5][u])*sig;x=pr[u];int j=ID[lv[x]][u];
        while(x!=-1){
            ans-=dp[0][x][j]*(td[3][x]-dp[3][x][j]);
            ans-=dp[4][x][j]*(td[2][x]-dp[2][x][j]);
            ans-=dp[3][x][j]*(td[0][x]-dp[0][x][j]);
            ans-=dp[2][x][j]*(td[4][x]-dp[4][x][j]);
            if(f[x]==0)ans-=td[3][x];
            if(f[x]==2)ans-=td[4][x];td[1][x]+=sig;dp[1][x][j]+=sig;
            td[4][x]-=dp[4][x][j];
            td[3][x]-=dp[3][x][j];
            dp[4][x][j]+=sig*getC(0,lv[x],u);
            dp[3][x][j]+=sig*getC(2,lv[x],u);
            td[4][x]+=dp[4][x][j];
            td[3][x]+=dp[3][x][j];
            if(f[x]==0)ans+=td[3][x];
            if(f[x]==2)ans+=td[4][x];
            ans+=dp[0][x][j]*(td[3][x]-dp[3][x][j]);
            ans+=dp[4][x][j]*(td[2][x]-dp[2][x][j]);
            ans+=dp[3][x][j]*(td[0][x]-dp[0][x][j]);
            ans+=dp[2][x][j]*(td[4][x]-dp[4][x][j]);
            fw[1][lv[x]].add(tin[lv[x]][u],sig);
            fw[1][lv[x]].add(tout[lv[x]][u]+1,-sig);
            wf[1][lv[x]].add(tin[lv[x]][u],sig);
            if(pr[x]==-1)break;x=pr[x];j=ID[lv[x]][u];
        }
    }
    else {
        ans+=td[3][u]*sig;x=pr[u];int j=ID[lv[x]][u];
        while(x!=-1){
            ans-=dp[0][x][j]*(td[3][x]-dp[3][x][j]);
            ans-=dp[4][x][j]*(td[2][x]-dp[2][x][j]);
            ans-=dp[3][x][j]*(td[0][x]-dp[0][x][j]);
            ans-=dp[2][x][j]*(td[4][x]-dp[4][x][j]);
            if(f[x]==1)ans-=td[0][x]*td[2][x]-td[5][x];
            if(f[x]==0)ans-=td[3][x];td[2][x]+=sig;dp[2][x][j]+=sig;
            td[5][x]-=td[0][x]*td[2][x];
            td[3][x]-=dp[3][x][j];
            dp[3][x][j]+=sig*getP(1,lv[x],u);
            td[3][x]+=dp[3][x][j];
            td[5][x]+=td[0][x]*td[2][x];
            if(f[x]==1)ans+=td[0][x]*td[2][x]-td[5][x];
            if(f[x]==0)ans+=td[3][x];
            ans+=dp[0][x][j]*(td[3][x]-dp[3][x][j]);
            ans+=dp[4][x][j]*(td[2][x]-dp[2][x][j]);
            ans+=dp[3][x][j]*(td[0][x]-dp[0][x][j]);
            ans+=dp[2][x][j]*(td[4][x]-dp[4][x][j]);
            fw[2][lv[x]].add(tin[lv[x]][u],sig);
            fw[2][lv[x]].add(tout[lv[x]][u]+1,-sig);
            wf[2][lv[x]].add(tin[lv[x]][u],sig);
            if(pr[x]==-1)break;x=pr[x];j=ID[lv[x]][u];
        }
    }
}
void change(int X, int Y){
    up(f[X],X,-1);up(Y,X,1);
    f[X]=Y;
}

long long num_tours() {
  return ans;
}
/*int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    int n;cin>>n;
    vector<int>ff(n),u(n-1),v(n-1);
    for(int i=0;i<n;i++)cin>>ff[i];
    for(int i=0;i<n-1;i++)cin>>u[i]>>v[i];
    init(n,ff,u,v,0);cout<<num_tours()<<'\n';
    int q;cin>>q;
    while(q--){
        int x,y;cin>>x>>y;change(x,y);
        cout<<num_tours()<<'\n';
    }
}*/

Compilation message

joitour.cpp: In function 'void play(int, int)':
joitour.cpp:68:9: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   68 |         for(int i=0;i<6;i++)dp[i][u].pb(0);id++;
      |         ^~~
joitour.cpp:68:44: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   68 |         for(int i=0;i<6;i++)dp[i][u].pb(0);id++;
      |                                            ^~
joitour.cpp:70:9: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   70 |         for(int i=0;i<5;i++)td[i][u]+=dp[i][u][id];td[5][u]+=dp[0][u][id]*dp[2][u][id];
      |         ^~~
joitour.cpp:70:52: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   70 |         for(int i=0;i<5;i++)td[i][u]+=dp[i][u][id];td[5][u]+=dp[0][u][id]*dp[2][u][id];
      |                                                    ^~
joitour.cpp: In function 'void up(int, int, int)':
joitour.cpp:93:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   93 |             if(f[x]==2)ans-=td[4][x];td[0][x]+=sig;dp[0][x][j]+=sig;
      |             ^~
joitour.cpp:93:38: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   93 |             if(f[x]==2)ans-=td[4][x];td[0][x]+=sig;dp[0][x][j]+=sig;
      |                                      ^~
joitour.cpp:108:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  108 |             if(pr[x]==-1)break;x=pr[x];j=ID[lv[x]][u];
      |             ^~
joitour.cpp:108:32: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  108 |             if(pr[x]==-1)break;x=pr[x];j=ID[lv[x]][u];
      |                                ^
joitour.cpp:119:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  119 |             if(f[x]==2)ans-=td[4][x];td[1][x]+=sig;dp[1][x][j]+=sig;
      |             ^~
joitour.cpp:119:38: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  119 |             if(f[x]==2)ans-=td[4][x];td[1][x]+=sig;dp[1][x][j]+=sig;
      |                                      ^~
joitour.cpp:135:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  135 |             if(pr[x]==-1)break;x=pr[x];j=ID[lv[x]][u];
      |             ^~
joitour.cpp:135:32: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  135 |             if(pr[x]==-1)break;x=pr[x];j=ID[lv[x]][u];
      |                                ^
joitour.cpp:146:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  146 |             if(f[x]==0)ans-=td[3][x];td[2][x]+=sig;dp[2][x][j]+=sig;
      |             ^~
joitour.cpp:146:38: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  146 |             if(f[x]==0)ans-=td[3][x];td[2][x]+=sig;dp[2][x][j]+=sig;
      |                                      ^~
joitour.cpp:161:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  161 |             if(pr[x]==-1)break;x=pr[x];j=ID[lv[x]][u];
      |             ^~
joitour.cpp:161:32: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  161 |             if(pr[x]==-1)break;x=pr[x];j=ID[lv[x]][u];
      |                                ^
# Verdict Execution time Memory Grader output
1 Correct 8 ms 60760 KB Output is correct
2 Correct 8 ms 60760 KB Output is correct
3 Correct 10 ms 77144 KB Output is correct
4 Incorrect 17 ms 142984 KB Wrong Answer [1]
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 8 ms 60760 KB Output is correct
2 Correct 8 ms 60760 KB Output is correct
3 Correct 10 ms 77144 KB Output is correct
4 Incorrect 17 ms 142984 KB Wrong Answer [1]
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 7 ms 60760 KB Output is correct
2 Correct 902 ms 282352 KB Output is correct
3 Correct 949 ms 281096 KB Output is correct
4 Correct 908 ms 282000 KB Output is correct
5 Correct 912 ms 281088 KB Output is correct
6 Correct 338 ms 268008 KB Output is correct
7 Correct 357 ms 268168 KB Output is correct
8 Correct 771 ms 267600 KB Output is correct
9 Correct 810 ms 268040 KB Output is correct
10 Correct 718 ms 260596 KB Output is correct
11 Correct 765 ms 251724 KB Output is correct
12 Correct 911 ms 277800 KB Output is correct
13 Correct 876 ms 277840 KB Output is correct
14 Correct 838 ms 277836 KB Output is correct
15 Correct 901 ms 276940 KB Output is correct
16 Correct 1114 ms 293748 KB Output is correct
17 Correct 7 ms 54700 KB Output is correct
18 Correct 8 ms 60760 KB Output is correct
19 Correct 8 ms 66904 KB Output is correct
20 Correct 9 ms 73048 KB Output is correct
21 Correct 725 ms 240516 KB Output is correct
22 Correct 700 ms 239952 KB Output is correct
23 Correct 743 ms 242000 KB Output is correct
24 Correct 747 ms 244148 KB Output is correct
25 Correct 109 ms 91440 KB Output is correct
26 Correct 156 ms 91496 KB Output is correct
27 Correct 113 ms 94884 KB Output is correct
28 Correct 104 ms 93604 KB Output is correct
29 Correct 469 ms 293968 KB Output is correct
30 Correct 436 ms 293972 KB Output is correct
31 Correct 407 ms 293888 KB Output is correct
32 Correct 446 ms 293892 KB Output is correct
33 Correct 386 ms 263248 KB Output is correct
34 Correct 394 ms 261880 KB Output is correct
35 Correct 342 ms 263248 KB Output is correct
36 Correct 349 ms 263528 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 7 ms 60760 KB Output is correct
2 Correct 8 ms 60760 KB Output is correct
3 Correct 8 ms 63064 KB Output is correct
4 Incorrect 11 ms 73304 KB Wrong Answer [1]
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 77144 KB Output is correct
2 Correct 9 ms 64924 KB Output is correct
3 Incorrect 10 ms 77144 KB Wrong Answer [1]
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 8 ms 60760 KB Output is correct
2 Correct 8 ms 60760 KB Output is correct
3 Correct 10 ms 77144 KB Output is correct
4 Incorrect 17 ms 142984 KB Wrong Answer [1]
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 8 ms 60760 KB Output is correct
2 Correct 8 ms 60760 KB Output is correct
3 Correct 10 ms 77144 KB Output is correct
4 Incorrect 17 ms 142984 KB Wrong Answer [1]
5 Halted 0 ms 0 KB -