QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#287530#7206. Triplezjy0001WA 2ms11920kbC++145.2kb2023-12-20 18:29:292023-12-20 18:29:29

Judging History

你现在查看的是最新测评结果

  • [2023-12-20 18:29:29]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:11920kb
  • [2023-12-20 18:29:29]
  • 提交

answer

#include<bits/stdc++.h>
#include<bits/extc++.h>
#define LL long long
#define uint unsigned
#define LLL __int128_t
#define ldb long double
#define uLL unsigned long long
using namespace std;
char wS[262144],rdc[262144],*rS,*rT,*wT=wS;
#define gc() (rS==rT?rT=rdc+fread(rS=rdc,1,262144,stdin),rS==rT?EOF:*rS++:*rS++)
#define flush() fwrite(wS,1,wT-wS,stdout),wT=wS
inline void pc(const char&x){*wT++=x;if(__builtin_expect(wS+262144==wT,0))flush();}
template<class T=int>inline T read(){
    T x(0);char c;bool f(1);while(!isdigit(c=gc())&&c!=EOF)if(c==45)f=!f;
    if(c==EOF)return -1;
    if(f)do x=x*10+(c&15);while(isdigit(c=gc()));
    else do x=x*10-(c&15);while(isdigit(c=gc()));
    return x;
}
template<>inline char read(){char c;while((c=gc())<33);return c;}
template<>inline string read(){char c;string s;while((c=gc())<33);do s+=c;while((c=gc())>32);return s;}
inline int read(char*const s){char c,*t=s;while((c=gc())<33);do *t++=c;while((c=gc())>32);return *t=0,t-s;}
template<class T>inline void write(T x){
    int wtop=0;char wbuf[numeric_limits<T>::digits10+1];
    if(x>=0)do wbuf[wtop++]=(x%10)|48;while(x/=10);
    else{pc(45);do wbuf[wtop++]=-(x%10)|48;while(x/=10);}
    for(;wtop;pc(wbuf[--wtop]));
}
template<>inline void write(char x){pc(x);}
template<>inline void write(char*s){for(;*s;pc(*s++));}
template<>inline void write(const char*s){for(;*s;pc(*s++));}
template<>inline void write(string s){for(auto c:s)pc(c);}
template<class T,class...YP>inline void write(const T&x,const YP&...y){write(x),write(y...);}
const int N=1e5+5;
int n,lim,rt,Cn,Bn;
bool vs[N];
LL ans,R[N];
vector<int>vec[N];
int Gm,Gh[N],Gv[N*2],Gnxt[N*2];
int sz[N],mx[N],len[N],son[N],cnt[N],L[N],U[N],B[N];
struct DS{
    int L,R,all,a[N*2];
    inline void clear(){L=N,R=N-1,all=0;}
    inline void shift(){a[--L]=0;}
    inline int qry(const int&p){return a[p+L];}
    inline void add(const int&p,const int&q){
        while(R<L+p)a[++R]=0;
        a[L+p]+=q,all+=q;
    }
    inline int qrysuf(const int&p){
        if(L+p>R)return 0;
        int res=all;
        for(int i=0;i<p;++i)res-=a[L+i];
        return res;
    }
}ds;
struct fenwicktree{
    int c[N];
    inline void add(int x,const int&y){
        for(++x;x<=n;x+=x&-x)c[x]+=y;
    }
    inline int qry(int x){
        int res=0;
        for(++x;x;x-=x&-x)res+=c[x];
        return res;
    }
}T;
inline void add(const int&u,const int&v){
    Gv[++Gm]=v,Gnxt[Gm]=Gh[u],Gh[u]=Gm;
    Gv[++Gm]=u,Gnxt[Gm]=Gh[v],Gh[v]=Gm;
}
inline void dfs0(const int&u,const int&fa){
    sz[u]=1,mx[u]=0;
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])
        if(v!=fa&&!vs[v])dfs0(v,u),sz[u]+=sz[v],mx[u]=max(mx[u],sz[v]);
    if((mx[u]=max(mx[u],lim-sz[u]))<mx[rt])rt=u;
}
inline void dfs1(const int&u,const int&fa,const int&bl,const int&d){
    if(d>len[bl])len[bl]=d,vec[bl].emplace_back(0);
    ++vec[bl][d],sz[u]=1,son[u]=0;
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])if(v!=fa&&!vs[v])
        dfs1(v,u,bl,d+1),sz[u]+=sz[v],sz[v]>sz[son[u]]?son[u]=v:0;
}
inline void ins(const int&u,const int&fa,const int&d){
    ++cnt[d],Cn=max(d,Cn);
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])
        if(v!=fa&&!vs[v])ins(v,u,d+1);
}
inline void dfs2(const int&u,const int&fa,const int&d){
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])
        if(v!=fa&&!vs[v]&&v!=son[u])dfs2(v,u,d+1);
    ds.clear();
    if(son[u])dfs2(son[u],u,d+1),ds.shift();
    ans+=2ll*ds.all*L[0],ds.add(0,1);
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])
        if(v!=fa&&!vs[v]&&v!=son[u]){
            Cn=0,ins(v,u,1);
            int lst=0,suf=ds.qrysuf(Cn+1);
            for(int j=Cn;~j;--j){
                int nw=ds.qry(j);
                ans+=L[max(0,j-d+1)]*(1ll*lst*nw+1ll*cnt[j]*suf);
                suf+=nw,ds.add(j,cnt[j]);
                if(j>d)ans+=T.qry(j-d-1)*(2ll*lst*nw+2ll*cnt[j]*suf);
                lst+=cnt[j],cnt[j]=0;
            }
        }
}
inline void solve(const int&u){
    Bn=0,L[0]=1;
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])if(!vs[v]){
        vec[v]={len[v]=0},dfs1(v,u,v,1),B[++Bn]=v;
        for(int d=len[v],nL=0;~d;--d)
            L[d]+=(nL+=vec[v][d]),R[d]+=(nL*(nL-1ll)),T.add(d,vec[v][d]);
    }
    ans+=(L[1]*(L[1]-1ll)-R[1]);
    for(int i=1,v;v=B[i],i<=Bn;++i){
        for(int d=len[v],nL=0;~d;--d)
            L[d]-=(nL+=vec[v][d]),R[d]+=(nL*(nL-1ll)),T.add(d,-vec[v][d]);
        dfs2(v,u,1);
        for(int d=len[v];d;--d)ans+=vec[v][d]*(L[d+1]*(L[d+1]-1ll)-R[d+1]);
        for(int d=len[v],nL=0;~d;--d)
            L[d]+=(nL+=vec[v][d]),R[d]+=(nL*(nL-1ll)),T.add(d,vec[v][d]);
    }
    for(int i=1,v;v=B[i],i<=Bn;++i)
        for(int d=len[v],nL=0;~d;--d)
            L[d]-=(nL+=vec[v][d]),T.add(d,-vec[v][d]);
    vs[u]=1;
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])
        if(!vs[v]&&sz[v]>2)lim=sz[v],dfs0(v,u),solve(rt);
}
inline void MAIN(){
    ans=0,Gm=0,fill(Gh+1,Gh+n+1,0),fill(vs+1,vs+n+1,0);
    for(int i=1;i<n;++i)add(read(),read());
    mx[rt=0]=1e9,lim=n,dfs0(1,0),solve(rt);
    write(n*(n-1ll)*(n-2)-ans,'\n');
}
signed main(){
    cin.tie(0)->sync_with_stdio(0);
#define LOCAL
#ifndef LOCAL
    freopen("triple.in","r",stdin);
    freopen("triple.out","w",stdout);
#endif
    while(~(n=read()))MAIN();
    return flush(),0;
}
/*

*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 11800kb

input:

3
1 2
2 3
4
1 2
2 3
2 4

output:

4
18

result:

ok 2 tokens

Test #2:

score: -100
Wrong Answer
time: 2ms
memory: 11920kb

input:

5
4 1
3 4
2 5
3 5
5
5 4
3 4
4 1
1 2
5
4 5
4 1
3 2
4 3
5
1 3
4 3
2 4
5 1
5
4 1
4 2
5 4
5 3
5
1 4
5 2
3 5
3 1
5
5 3
3 4
2 1
5 2
5
5 1
5 4
1 2
2 3
5
5 2
2 4
1 3
1 2
5
1 3
2 4
5 4
3 5
5
4 1
2 4
5 4
3 1
5
1 5
3 1
1 2
4 2
5
2 5
4 2
3 4
4 1
5
5 1
4 2
2 1
1 3
5
4 2
3 4
1 4
5 2
5
3 1
3 2
3 5
4 1
5
3 4
2 5
4 ...

output:

40
56
62
64
80
82
94
106
122
124
140
146
152
158
164
170
172
184
200
202
214
230
236
242
244
260
262
274
290
296
298
314
320
322
338
348
344
346
358
370
382
394
414
406
422
428
430
446
456
448
460
476
478
494
500
506
508
520
532
544
560
566
572
578
580
592
608
618
610
626
628
640
656
662
668
670
686...

result:

wrong answer 2nd words differ - expected: '44', found: '56'