样例莓果,求条
查看原帖
样例莓果,求条
753640
封禁用户楼主2024/5/14 16:42
#include<bits/stdc++.h>
#define sd std::
//#define int long long
#define inf 0x3f3f3f3f
#define linf 1e18
#define il inline
#define db double
#define ldb long double
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define f(i,a,b) for(int i=(a);i>=(b);i--)
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
#define me(x,y) memset(x,y,sizeof x)
#define pii sd pair<int,int>
#define umap(x,y) sd unordered_map<x,y>
#define pque(x) sd priority_queue<x>
#define X first
#define Y second
#define kg putchar(' ')
#define Fr(a) for(auto it:a)
#define dbg(x) sd cout<<#x<<": "<<x<<sd endl
il int read(){int w=1,c=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) c=(c<<3)+(c<<1)+ch-48;return w*c;}
void printt(int x){if(x>9) printt(x/10);putchar(x%10+48);}
il void print(int x){if(x<0) putchar('-'),printt(-x);else printt(x);}
il void put(int x){print(x);putchar('\n');}
il void printk(int x){print(x);kg;}
const int N=1e5+10;
struct node
{
	int nex;
	int to;
}a[N<<1];
int tot,head[N];
void add(int u,int v)
{
	a[++tot].nex=head[u];
	head[u]=tot;
	a[tot].to=v;
}
int id[N],t,siz[N],son[N],dep[N],top[N],fa[N];
void dfs1(int u,int da)
{
	siz[u]=1;
	fa[u]=da;
	dep[u]=dep[da]+1;
	for(int i=head[u];i;i=a[i].nex)
	{
		int v=a[i].to;
		if(v==da) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]]) son[u]=v;
	}
}
void dfs2(int u,int da)
{
	int v=son[u];
	if(v)
	{
		id[v]=++t;
		top[v]=top[u];
		dfs2(v,u);
	}
	for(int i=head[u];i;i=a[i].nex)
	{
		v=a[i].to;
		if(!top[v])
		{
			id[v]=++t;
			top[v]=v;
			dfs2(v,u);
		}
	}
}
#define lowbit(x) (x&(-x))
int n,q,root;
int s[N];
void update(int x,int y)
{
	for(;x<=n;x+=lowbit(x)) s[x]+=y;
}
int ask(int x)
{
	int res=0;
	for(;x;x-=lowbit(x)) res+=s[x];
	return res;
}
struct query
{
	int x,y,c,id;
}q1[N],q2[N];
int ans1[N],ans2[N];
int c1,c2;
int lca(int u,int v)
{
	while(top[u]!=top[v])
	{
		if(dep[top[u]]>dep[top[v]]) u=fa[top[u]];
		else v=fa[top[v]];
	}
	return dep[u]<dep[v]?u:v;
}
int dis(int u,int v)
{
	return dep[u]+dep[v]-(dep[lca(u,v)]<<1)+1;
}
int cmp1(query a,query b){return a.id-a.c<b.id-b.c;}
int cmp2(query a,query b){return a.x<b.x;}
int Q(int x,int y)
{
	int l=lca(x,y);
	return ask(id[x])+ask(id[y])-ask(id[l])-ask(id[fa[l]]);
}
il void solve()
{
	n=read();
	F(i,1,n)
	{
		int x=read();
		if(x) add(i,x),add(x,i);
		else root=i;
	}
//	dbg(root);
	dfs1(root,0);
	id[root]=++t,top[root]=root;
	dfs2(root,root);
	int q=read();
	F(i,1,q)
	{
		int k=read(),x,y,z;
		if(k==1)
		{
			x=read(),y=read(),z=read();
			q1[++c1].x=x;
			q1[c1].y=y;
			q1[c1].c=z;
			q1[c1].id=i;
		}
		if(k==2)
		{
			x=read();
			q2[++c2].x=x;
			q2[c2].id=i;
		}
	}
	sd sort(q1+1,q1+1+c1,cmp1);
	sd sort(q2+1,q2+1+c2,cmp2);
	int j=1;//记录目前存进去的点 
	F(i,1,c1)
	{
		while(j<=c2&&q2[j].x<q1[i].id-q1[i].c)
		{
//			dbg(q2[j].x);
			update(id[q2[j].x],1);
			update(id[q2[j].x]+siz[q2[j].x],-1);
			j++;
		}
		ans1[q1[i].id]=dis(q1[i].x,q1[i].y);
		ans2[q1[i].id]=Q(q1[i].x,q1[i].y);
	}
	F(i,1,c1) printk(ans1[i]),put(ans2[i]);
}
int main()
{
	int T=1;
//	T=read();
	while(T--) solve();
    return 0;
}
2024/5/14 16:42
加载中...