QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#287498#7206. Triplezjy0001WA 2ms11856kbC++145.5kb2023-12-20 17:50:412023-12-20 17:50:42

Judging History

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

  • [2023-12-20 17:50:42]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:11856kb
  • [2023-12-20 17:50:41]
  • 提交

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;
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];
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;
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){
    ds.clear();
    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);
    if(son[u])dfs2(son[u],u,d+1),ds.shift();
    ans+=2ll*ds.qrysuf(1)*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)]*(2ll*lst*nw+2ll*cnt[j]*suf);
                lst+=cnt[j],suf+=nw,ds.add(j,cnt[j]),cnt[j]=0;
            }
        }
}
inline void solve_1(const int&u){
    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);
        for(int d=len[v];d;--d)
            ans+=vec[v][d]*(L[d+1]*(L[d+1]-1ll)-R[d+1]);
        LL nR=0;
        for(int d=len[v],nL=0;d;--d)
            L[d]+=(nL+=vec[v][d]),R[d]+=(nR+=vec[v][d]*(vec[v][d]-1ll));
    }
    ans+=(L[1]*(L[1]-1ll)-R[1]);
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])if(!vs[v]){
        for(int d=len[v],nL=0;d;--d)L[d]-=(nL+=vec[v][d]);
        for(int d=len[v];d;--d)ans+=(LL)L[d+1]*U[d+1];
        for(int d=len[v],nL=0;d;--d)U[d]+=(nL+=vec[v][d]);
    }
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])if(!vs[v]){
        LL nR=0;
        for(int d=len[v],nL=0;d;--d)
            U[d]-=(nL+=vec[v][d]),R[d]-=(nR+=vec[v][d]*(vec[v][d]-1ll));
        for(int d=len[v];d;--d)
            ans+=vec[v][d]*(U[d+1]*(U[d+1]-1ll)-R[d+1]);
    }
}
inline void solve_2(const int&u){
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])if(!vs[v])
        for(int d=len[v],nL=0;~d;--d)L[d]+=(nL+=vec[v][d]);
    ++L[0];
    int mxd=0;
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])if(!vs[v]){
        for(int d=len[v],nL=0;~d;--d)L[d]-=(nL+=vec[v][d]);
        dfs2(v,u,1),mxd=max(mxd,len[v]);
        for(int d=len[v],nL=0;~d;--d)L[d]+=(nL+=vec[v][d]);
    }
    fill(L,L+mxd+1,0);
}
inline void solve(const int&u){
    solve_1(u);
    solve_2(u);
    vs[u]=1;
    for(int i=Gh[u],v;v=Gv[i];i=Gnxt[i])
        if(!vs[v])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;
}
/*
*/

詳細信息

Test #1:

score: 100
Accepted
time: 2ms
memory: 9820kb

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: 11856kb

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:

36
42
42
36
42
36
36
36
42
36
42
42
42
42
42
42
36
36
42
36
36
42
42
42
36
42
36
36
42
42
36
42
42
36
42
48
42
36
36
36
36
36
48
36
42
42
36
42
48
36
36
42
36
42
42
42
36
36
36
36
42
42
42
42
36
36
42
48
36
42
36
36
42
42
42
36
42
42
42
42
42
48
42
36
36
36
36
48
36
42
42
36
42
42
42
36
36
42
42
36
...

result:

wrong answer 1st words differ - expected: '40', found: '36'