如何提高调代码素质
  • 板块学术版
  • 楼主AKPC
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/12/20 20:32
  • 上次更新2023/12/21 00:21:16
查看原帖
如何提高调代码素质
540363
AKPC楼主2023/12/20 20:32

P2633

赏 88 个关注。

除了第 66 个点 AC 全 RE。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mpr make_pair
#define fr first
#define sc second
inline int read(){
	int res=0,f=1;char c=getchar();
	while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9') {res=res*10+(c-'0');c=getchar();}
	return res*f;
}
const int N=7e5+5;
int n,m,a[N],b[N],root[N],sz;
vector<int>e[N];
int dep[N],siz[N],fa[N],son[N];
int dfs(int u,int father){
	dep[u]=dep[father]+1;
	fa[u]=father;
	siz[u]=1;
	int maxn=-1;
	for (auto v:e[u]){
		if (v==father) continue;
		int sizes=dfs(v,u);
		siz[u]+=sizes;
		if (sizes>maxn) maxn=sizes,son[u]=v;
	}
	return siz[u];
}
int dfn[N],top[N],tip=1;
void dfs2(int u,int father,int op){
	if (op==1) top[u]=top[father];
	dfn[u]=tip++;
	if (son[u]!=0) dfs2(son[u],u,1);
	for (auto v:e[u]){
		if (v==father||v==son[u]) continue;
		dfs2(v,u,0);
	}
}
struct dot{
	int ls,rs,val;
}d[N<<5];
struct tree{
	int cntdot=0;
	void build(int &cnt,int l,int r){
		cnt=++cntdot;
		if (l==r) return;
		int mid=(l+r)>>1;
		build(d[cnt].ls,l,mid);
		build(d[cnt].rs,mid+1,r);
	}
	void insert(int &cnt,int pre,int l,int r,int id){
		cnt=++cntdot;
		d[cnt].ls=d[pre].ls,d[cnt].rs=d[pre].rs,d[cnt].val=d[pre].val+1;
		if (l==r) return;
		int mid=(l+r)>>1;
		if (id<=mid) insert(d[cnt].ls,d[pre].ls,l,mid,id);
		if (id>mid) insert(d[cnt].rs,d[pre].rs,mid+1,r,id);
	}
	int query(int u,int v,int _lca,int flca,int l,int r,int k){
		if (l==r) return l;
		int mid=(l+r)>>1,x=d[d[v].ls].val+d[d[u].ls].val-d[d[_lca].ls].val-d[d[flca].ls].val;
		if (x>=k) return query(d[u].ls,d[v].ls,d[_lca].ls,d[flca].ls,l,mid,k);
		if (x<k) return query(d[u].rs,d[v].rs,d[_lca].rs,d[flca].rs,mid+1,r,k-x);
	}
}book;
int lca(int x,int y){
	if (top[x]==top[y]) return dep[x]>dep[y]?y:x;
	if (dep[top[x]]<dep[top[y]]) swap(x,y);
	return lca(fa[top[x]],y);
}
signed main(){
	int n=read(),m=read();
	for (int i=1;i<=n;i++) a[i]=b[i]=read(),top[i]=i;
	for (int i=1;i<n;i++){
		int u=read(),v=read();
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs(1,0),dfs2(1,0,0);
	sort(b+1,b+n+1);
	sz=unique(b+1,b+n+1)-b-1;
	book.build(root[0],1,sz);
	for (int i=1;i<=n;i++){
		int id=lower_bound(b+1,b+sz+1,a[i])-b;
		book.insert(root[i],root[fa[i]],1,sz,id);
	}
	int lst=0;
	while (m--){
		int x=read()^lst,y=read(),z=read();
		int _lca=lca(x,y);cout<<x<<'\n';
		int ans=b[book.query(root[x],root[y],root[_lca],root[fa[_lca]],1,sz,z)];
		cout<<ans<<'\n';
		lst=ans;
	}
	return 0;
}
2023/12/20 20:32
加载中...