QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#595357 | #3226. Distance Sum | dongyc666 | RE | 0ms | 0kb | C++14 | 3.7kb | 2024-09-28 13:31:50 | 2024-09-28 13:31:51 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define si signed
const int NR=2e6+10;
int n,fa[NR][22],dis[NR],pos[NR<<1],arr[NR<<1],Len;
si lg[NR<<1],minp[NR<<1][22],mind[NR<<1][22],dep[NR];
int L[NR],R[NR],dfn[NR],siz[NR],idx[NR],S;
#define pii pair<int,int>
#define fi first
#define se second
#define mkp make_pair
#define pb emplace_back
vector<pii>son[NR];
void chkmin(int &x,int y){x=(x<y)?x:y;}
void chkmax(int &x,int y){x=(x>y)?x:y;}
void dfs(int id,int fath){
dep[id]=dep[fath]+1;siz[id]=1;
dfn[id]=++S;idx[S]=id;
L[id]=dfn[id];fa[id][0]=fath;
for(int i=1;i<=20;i++)fa[id][i]=fa[fa[id][i-1]][i-1];
pos[id]=++Len;arr[Len]=id;
for(auto lcy:son[id]){
dis[lcy.fi]=dis[id]+lcy.se;
dfs(lcy.fi,id);
arr[++Len]=id;
siz[id]+=siz[lcy.fi];
}
R[id]=dfn[id]+siz[id]-1;
}
void init(){
for(int i=1;i<=Len;i++)
mind[i][0]=dep[arr[i]],minp[i][0]=i,lg[i]=lg[i>>1]+1;
for(int i=1;i<=21;i++)
for(int j=1;j+(1<<i)<=Len+1;j++)
if(mind[j][i-1]<mind[j+(1<<(i-1))][i-1])mind[j][i]=mind[j][i-1],minp[j][i]=minp[j][i-1];
else mind[j][i]=mind[j+(1<<(i-1))][i-1],minp[j][i]=minp[j+(1<<(i-1))][i-1];
}
int query(int l,int r){
int k=lg[r-l+1]-1;
if(mind[l][k]<mind[r-(1<<k)+1][k])return minp[l][k];
else return minp[r-(1<<k)+1][k];
}
int LCA(int x,int y){
int l=pos[x],r=pos[y];
if(l>r)swap(l,r);
return idx[query(l,r)];
}
int CNT1,CNT2;
int getd(int x,int y){
return dis[x]+dis[y]-2*dis[LCA(x,y)];
}
int jump(int x,int y){
for(int i=20;i>=0;i--)
if((y>>i)&1)x=fa[x][i];
return x;
}
int lowbit(int x){
return x&(-x);
}
struct BIT{
int c[NR];
void add(int x,int y){
for(;x<=n;x+=lowbit(x))c[x]+=y;
}
int ask(int x){
int res=0;
for(;x;x-=lowbit(x))res+=c[x];
return res;
}
int calc(int l,int r){return ask(r)-ask(l-1);}
}T;
struct BIT1{
int c[NR];
void init(){
for(int i=1;i<=n;i++)c[i]=n+1;
}
void add(int x,int y){
for(;x<=n;x+=lowbit(x))chkmin(c[x],y);
}
int ask(int x){
int res=n+1;
for(;x;x-=lowbit(x))chkmin(res,c[x]);
return res;
}
void modify(int x,int y){add(n-x+1,y);}
int query(int x){return ask(n-x+1);}
}T1;//查 x 后继
struct BIT2{
int c[NR];
void add(int x,int y){
for(;x<=n;x+=lowbit(x))chkmax(c[x],y);
}
int ask(int x){
int res=0;
for(;x;x-=lowbit(x))chkmax(res,c[x]);
return res;
}
void modify(int x,int y){add(x,y);}
int query(int x){return ask(x);}
}T2;//查 x 前驱
int getfa(int x){
int it1=T1.query(R[x]+1),it2=T2.query(L[x]-1);
int d1=0,d2=0,p1,p2;
if(it1)p1=LCA(x,idx[it1]),d1=dep[p1];
if(it2!=n+1){
p2=LCA(x,idx[it2]);
d2=dep[p2];
}
if(d1>d2)return p1;
return p2;
}
int tmp[NR];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
// int st=clock();
cin>>n;
for(int i=2,x,y;i<=n;i++)
cin>>x>>y,son[x].pb(mkp(i,y));
// cerr<<clock()-st<<endl;
dfs(1,0);T1.init();init();
// cerr<<clock()-st<<endl;
// for(int i=1;i<n;i++)tmp[i]=jump(i,10);
// cerr<<clock()-st<<endl;
// for(int i=1;i<n;i++)tmp[i]=LCA(i,i+1);
// cerr<<clock()-st<<endl;
int res=0,rt=0;
for(int i=1;i<=n;i++){
if(!rt)rt=i;
res+=getd(rt,i);
T.add(dfn[i],1);T1.modify(dfn[i],dfn[i]);T2.modify(dfn[i],dfn[i]);
if(L[rt]<=L[i]&&R[i]<=R[rt]&&i!=rt){
int tmp=jump(i,dep[i]-dep[rt]-1);
int it1=T1.query(L[tmp]),it2=T2.query(R[tmp]);
int tar=LCA(idx[it1],idx[it2]),val=T.calc(L[tar],R[tar]);
if(val*2>i){
res-=(val*2-i)*(dis[tar]-dis[rt]);
rt=tar;
}
}
else{
int val=T.calc(L[rt],R[rt]);
if(val*2<i){
int nxt=getfa(rt);
res-=(i-val*2)*(dis[rt]-dis[nxt]);
rt=nxt;
}
}
cout<<res<<'\n';
}
// cerr<<CNT1<<" "<<clock()-st<<endl;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Runtime Error
input:
10 5 1 2 1 1 1 4 1 2 1 5 1 2 1 2 1 5 1