RE 10分,读入有问题
查看原帖
RE 10分,读入有问题
109220
Farkas_W楼主2021/3/9 20:50
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define re register int
#define il inline
#define next nee
using namespace std;
il int read()
{
  int x=0,f=1;char ch=getchar();
  while(!isdigit(ch)&&ch!='-')ch=getchar();
  if(ch=='-')f=-1,ch=getchar();
  while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  return x*f;
}
il void print(int x)
{
  if(x<0)putchar('-'),x=-x;
  if(x/10)print(x/10);
  putchar(x%10+'0');
}
const int N=8e4+5;
int n,m,q,v[N],rt[N],b[N],next[N<<1],head[N],go[N<<1],tot,fa[N][20],L,pos[N];
int rev[N],dep[N],cnt,last,f[N],size[N];
bool vis[N];
struct node{
	int l,r,sz;
}t[N*105];
il int new_node(int x){++cnt;t[cnt]=t[x];return cnt;}
il void update(int x){t[x].sz=t[t[x].l].sz+t[t[x].r].sz;}
il void Add(int x,int y)
{
	next[++tot]=head[x];
	head[x]=tot;go[tot]=y;
}
il int search(int l,int r,int x)
{
	int ans=0;
	while(l<=r){
		int mid=l+r>>1;
		if(x<=b[mid])ans=mid,r=mid-1;
		else l=mid+1;
	}
	return ans;
}
il int find(int x)
{
	if(f[x]!=x)f[x]=find(f[x]);
	return f[x];
}
il void connect(int x,int y)
{
	int xx=find(x),yy=find(yy);
	f[yy]=xx;size[xx]+=size[yy];size[yy]=0;
}
il int insert(int k,int l,int r,int x)
{
	int now=new_node(k);
	t[now].sz++;
	if(l==r)return now;
	int mid=l+r>>1;
	if(x<=mid)t[now].l=insert(t[now].l,l,mid,x);
	else t[now].r=insert(t[now].r,mid+1,r,x);
	return now;
}
il void dfs(int x,int father)
{
	rt[x]=insert(rt[father],1,L,pos[x]);
	fa[x][0]=father;dep[x]=dep[father]+1;
	for(re i=1;i<=19;i++)fa[x][i]=fa[fa[x][i-1]][i-1];
	for(re i=head[x],y;i,y=go[i];i=next[i])
	{
		if(y==father)continue;
		dfs(y,x);
	}
}
il int lca(int x,int y)
{
	if(dep[x]<dep[y])swap(x,y);
	for(re i=19;i>=0;i--)
	if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
	if(x==y)return x;
	for(re i=19;i>=0;i--)
	if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
il int build(int l,int r)
{
	++cnt;int mid=l+r>>1;
	if(l==r)return cnt;
	t[cnt].l=build(l,mid);
	t[cnt].r=build(mid+1,r);
	return cnt;
}
il void query(int a,int b,int c,int d,int l,int r,int k)
{
	if(l==r){print(last=rev[l]);putchar('\n');return;}
	int res=t[t[a].l].sz+t[t[b].l].sz-t[t[c].l].sz-t[t[d].l].sz,mid=l+r>>1;
	if(k<=res)query(t[a].l,t[b].l,t[c].l,t[d].l,l,mid,k);
	else query(t[a].r,t[b].r,t[c].r,t[d].r,mid+1,r,k-res);
}
signed main()
{
	int T=read();n=read();m=read();q=read();
	printf("%d %d %d\n",n,m,q);
	for(re i=1;i<=n;i++)
	{
		cin>>b[i];v[i]=b[i];f[i]=i;size[i]=1;
	}
	return 0;
	for(re i=1,x,y;i<=m;i++)x=read(),y=read(),connect(x,y),Add(x,y),Add(y,x);
	sort(b+1,b+n+1);
	L=unique(b+1,b+n+1)-b-1;
	for(re i=1;i<=n;i++)pos[i]=search(1,L,v[i]),rev[pos[i]]=v[i];
	rt[0]=build(1,L);
	for(re i=1,x;i<=n,x=find(i);i++)if(!vis[x])vis[x]=1,dfs(x,0);
	while(q--)
	{
		char s;cin>>s;
		int x=read()^last,y=read()^last;
		if(s=='Q'){
			int k=read()^last,l=lca(x,y);
			query(rt[x],rt[y],rt[l],rt[fa[l][0]],1,L,k);
		}
		else {
			Add(x,y);Add(y,x);
			if(size[find(x)]<size[find(y)])dfs(x,y),connect(y,x);
			else dfs(y,x),connect(x,y);
		}
	}
	return 0;
}

好像读点权的时候多读了,不知道怎么改

2021/3/9 20:50
加载中...