QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#595357#3226. Distance Sumdongyc666RE 0ms0kbC++143.7kb2024-09-28 13:31:502024-09-28 13:31:51

Judging History

This is the latest submission verdict.

  • [2024-09-28 13:31:51]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 0kb
  • [2024-09-28 13:31:50]
  • Submitted

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

output:


result: