QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#287530 | #7206. Triple | zjy0001 | WA | 2ms | 11920kb | C++14 | 5.2kb | 2023-12-20 18:29:29 | 2023-12-20 18:29:29 |
Judging History
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'