求助div1 T1正解(被常数杀了)
  • 板块学术版
  • 楼主CuSO4_and_5H2O
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/10/4 21:13
  • 上次更新2023/10/27 08:47:22
查看原帖
求助div1 T1正解(被常数杀了)
231946
CuSO4_and_5H2O楼主2022/10/4 21:13

我觉得复杂度没问题,但是只能拿五十分,有没有好心人帮忙卡一下

#include<bits/stdc++.h>
#define bug cout<<"I AK IOI"<<endl;
#define gc getchar
#define in inline
using namespace std;
const int N=2e6+1;

inline void print(int x) {if (x < 0) putchar('-'), x = -x; if(x > 9) print(x / 10); putchar(x % 10 + '0');}
inline int read(){int res = 0, f = 0; char ch = gc();for(; !isdigit(ch); ch = gc()) f |= (ch == '-'); for(;isdigit(ch);ch=gc()) res = (res << 1) + (res << 3) + (ch ^ '0');return f ? -res :res;}

struct node{
	int to,nxt;
}e[N*2];int cnt,head[N];
in void add(int x,int y)
{
	e[++cnt].nxt=head[x];e[cnt].to=y;head[x]=cnt;
	e[++cnt].nxt=head[y];e[cnt].to=x;head[y]=cnt;
}

int er[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912};

int n,q,lg[N],fa[3][N][21];
int rot1,rot2,Max=-1;
int dep[N][3];

in void dfs(int x,int faa,int bj)
{
	dep[x][bj]=dep[faa][bj]+1;
	for(int i=head[x];i;i=e[i].nxt)
	{
		int nxt=e[i].to;
		if(faa==nxt) continue ;
		dfs(nxt,x,bj);
	}
	if(dep[x][bj]>Max){
		Max=dep[x][bj];
		if(bj==1) rot1=x;
		else rot2=x;
	}
}

in void DFS(int x,int faa,int bj)
{
	dep[x][bj]=dep[faa][bj]+1;
	fa[bj][x][0]=faa;
	for(int i=1;i<=lg[dep[x][bj]];i++) fa[bj][x][i]=fa[bj][fa[bj][x][i-1]][i-1];
	for(int i=head[x];i;i=e[i].nxt)
	{
		int nxt=e[i].to;
		if(faa==nxt) continue ;
		DFS(nxt,x,bj);
	}
}

int cx(int a,int k,int bj)
{
	for(int i=lg[dep[a][bj]];i>=0;i--)
	{
		if(k<er[i]) continue ;
		k-=er[i];
		a=fa[bj][a][i];
	}
	return a;
}

signed main(){
	cin>>n>>q;
	for(register int i = 1; i <= n; ++i) lg[i] = lg[i-1] + (1 << lg[i-1] == i);
	for(register int a,b,i=1;i<n;i++)
	{
		a=read(),b=read();
		add(a,b);
	}
	dfs(1,0,1);Max=-1;dfs(rot1,0,2);
	DFS(rot1,0,1);DFS(rot2,0,2);
//	cout<<fa[2][2][0]<<endl<<endl;
//	return 0;
	for(register int a,k,i=1;i<=q;i++)
	{
		a=read(),k=read();
		if(dep[a][1]<=k && dep[a][2]<=k) cout<<-1<<endl;
		else{
			if(dep[a][1]>k){
				print(cx(a,k,1)),cout<<endl;
				continue ;
			}
			print(cx(a,k,2)),cout<<endl;
		}
	}
}

2022/10/4 21:13
加载中...