QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#594609#3226. Distance Sumdongyc666WA 0ms30220kbC++143.1kb2024-09-28 09:09:282024-09-28 09:09:30

Judging History

This is the latest submission verdict.

  • [2024-09-28 09:09:30]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 30220kb
  • [2024-09-28 09:09:28]
  • Submitted

answer

#pragma GCC optimize("Ofast,unroll-loops,inline")
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int NR=5e5+10;
int n,dis[NR],fa[NR][20],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;
	fa[id][0]=fath;siz[id]=1;
	dfn[id]=++S;idx[S]=id;
	L[id]=dfn[id];
	for(int i=1;i<=18;i++)fa[id][i]=fa[fa[id][i-1]][i-1];
	for(auto lcy:son[id]){
		dis[lcy.fi]=dis[id]+lcy.se;
		dfs(lcy.fi,id);
		siz[id]+=siz[lcy.fi];
	}
	R[id]=dfn[id]+siz[id]-1;
}
int LCA(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	for(int i=18;i>=0;i--)
		if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
	if(x==y)return x;
	for(int i=18;i>=0;i--)
		if(fa[x][i]!=fa[y][i])
			x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
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=18;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){
		while(x<=n){
			c[x]+=y;
			x+=lowbit(x); 
		}
	}
	int ask(int x){
		int res=0;
		while(x){
			res+=c[x];
			x-=lowbit(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){
		while(x<=n){
			chkmin(c[x],y);
			x+=lowbit(x);
		}
	}
	int ask(int x){
		int res=n+1;
		while(x){
			chkmin(res,c[x]);
			x-=lowbit(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){
		while(x<=n){
			chkmax(c[x],y);
			x+=lowbit(x);
		}
	}
	int ask(int x){
		int res=0;
		while(x){
			chkmax(res,c[x]);
			x-=lowbit(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=T2.query(R[x]),it2=T1.query(dfn[x]);
	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;
}
signed main(){
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=2,x,y;i<=n;i++)
		cin>>x>>y,son[x].pb(mkp(i,y));
	dfs(1,0);T1.init();
	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';
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 30220kb

input:

10
5 1
2 1
1 1
4 1
2 1
5 1
2 1
2 1
5 1

output:

0
3
4
6
7
8
10
11
12
14

result:

wrong answer 5th lines differ - expected: '6', found: '7'