萌新自闭
  • 板块P4197 Peaks
  • 楼主hegm
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/10/17 07:23
  • 上次更新2023/10/27 07:10:10
查看原帖
萌新自闭
331947
hegm楼主2022/10/17 07:23

后两个点疯狂WA

#include<bits/stdc++.h>
#define N 200005
#define int long long
using namespace std;
int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int n,m,q,a[N],e[N],t[N],cnt,tot,head[N],awa,p[N],size[N],l[N],r[N],val[N];
int fa[N*2][20],deep[N*2],num,rt[N],lans;
struct edge
{
	int u,v,w;
}g[N*3];
struct tree
{
	int from,to,next;
}tr[N*3];
struct awa
{
	int l,r,size;
}k[N*20];
bool cmp(int a,int b){return a<b;}
bool gru(edge a,edge b){return a.w<b.w;}
int find(int now)
{
	if(t[now]==now)return now;
	else return t[now]=find(t[now]);
}
void add(int from,int to)
{
	tr[++tot].from=from;
	tr[tot].to=to;
	tr[tot].next=head[from];
	head[from]=tot;
}
void dfs(int now,int f)
{
	fa[now][0]=f;
	deep[now]=deep[f]+1;
	l[now]=100000008;
	for(int i=1;i<=19;i++)fa[now][i]=fa[fa[now][i-1]][i-1];
	for(int i=head[now];i;i=tr[i].next)
	{
		dfs(tr[i].to,now);
		l[now]=min(l[now],l[tr[i].to]);
		r[now]=max(r[now],r[tr[i].to]);
		size[now]+=size[tr[i].to];
	}
	if(size[now]==0)
	{
		p[++awa]=now;
		l[now]=r[now]=awa;
		size[now]=1;
	}
}
int lca(int a,int pt)
{
	for(int i=19;i>=0;i--)
	{
		if(val[fa[a][i]]<=pt&&fa[a][i]!=0)a=fa[a][i];
	}
	return a;
}
int build(int l,int r)
{
	int to=++num;
	if(l==r)return to;
	int mid=(l+r)>>1;
	k[to].l=build(l,mid);
	k[to].r=build(mid+1,r);
	return to;
}
void hb(int now){k[now].size=k[k[now].l].size+k[k[now].r].size;}
int news(int now)
{
	++num;
	k[num]=k[now];
	return num;
}
int update(int now,int l,int r,int x)
{
	int to=news(now);
	int mid=(l+r)>>1;
	if(l==r)
	{
		k[to].size++;
		return to;
	}
	if(x<=mid)k[to].l=update(k[now].l,l,mid,x);
	else k[to].r=update(k[now].r,mid+1,r,x);
	hb(to);
	return to;
}
void que(int l,int r,int now,int cl,int cr)
{
	int cnt=k[k[r].r].size-k[k[l].r].size;
	if(cl==cr)
	{
		lans=cl;
		cout<<e[cl]<<"\n";
		return ;
	}
	int mid=(cl+cr)>>1;
	if(cnt>=now)que(k[l].r,k[r].r,now,mid+1,cr);
	else que(k[l].l,k[r].l,now-cnt,cl,mid);
}
signed main()
{
	n=read();m=read();q=read();
	for(int i=1;i<=n;i++)a[i]=read(),e[i]=a[i];
	sort(e+1,e+1+n);int len=unique(e+1,e+1+n)-e-1;
	for(int i=1;i<=n;i++)a[i]=lower_bound(e+1,e+1+len,a[i])-e;
	for(int i=1;i<=m;i++)
	{
		g[i].u=read();
		g[i].v=read();
		g[i].w=read();
	}
	sort(g+1,g+1+n,gru);
	for(int i=1;i<=n*2;i++)t[i]=i;
	cnt=n;
	for(int i=1,u,v;i<=m;i++)
	{
		u=find(g[i].u);v=find(g[i].v);
		if(u!=v)
		{
			++cnt;val[cnt]=g[i].w;
			add(cnt,u);add(cnt,v);
			t[u]=cnt;t[v]=cnt;
		}
	}
	for(int i=cnt;i>=1;i--)if(!deep[i])dfs(i,0);
	rt[0]=build(1,len);
	for(int i=1;i<=n;i++)rt[i]=update(rt[i-1],1,len,a[p[i]]);
	int U,X,K,y;
	while(q--)
	{
		U=read();X=read();K=read();
		y=lca(U,X);
		if(size[y]<K)cout<<-1<<"\n",lans=0;
		else que(rt[l[y]-1],rt[r[y]],K,1,len);
	}
	return 0;
}

最后一个输出里有 - 不知道是判断为 1-1 还是炸了

2022/10/17 07:23
加载中...