0分求调,倍增写挂了
  • 板块P4197 Peaks
  • 楼主封禁用户
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/26 13:36
  • 上次更新2025/7/26 16:43:23
查看原帖
0分求调,倍增写挂了
1659518
封禁用户楼主2025/7/26 13:36
#include<bits/stdc++.h>//大佬们指出我倍增哪里写挂了就好
#define int long long
using namespace std;
const int N=2e5+10,M=5e5+10;
int n,m,q,h[N],faa[N],fa[N][25],num,dis[N],dep[N];
bool v[N];
struct nodde{
	int x,y,c;
}a[M];
int head[N],tot;
struct node{
	int to,next;
}edge[2*M];
bool cmp(nodde x,nodde y)
{
	return x.c<y.c;
}
void add(int from,int to)
{
	++tot;
	edge[tot].to=to;
	edge[tot].next=head[from];
	head[from]=tot;
}
int find(int x)
{
	if(faa[x]==x)return x;
	return faa[x]=find(faa[x]);
}
void k()
{
	for(int i=1;i<=2*n;i++)faa[i]=i;
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		int fx=find(a[i].x);
		int fy=find(a[i].y);
		if(fx!=fy)
		{
			++num;
			faa[fx]=faa[fy]=faa[num]=num;
			dis[num]=a[i].c;
			add(num,fx);
			add(num,fy);
		}
	}
	return ;
}
void dfs(int x)
{
	v[x]=1;
	for(int i=head[x];i;i=edge[i].next)
	{
		int y=edge[i].to;
		fa[y][0]=x;
		for(int i=1;i<=20;i++)fa[y][i]=fa[fa[y][i-1]][i-1];
		dep[y]=dep[x]+1;
		dfs(y);
	}
}
int found(int v,int x)
{
	for(int i=20;i>=0;i--)
	{
		if(dis[fa[v][i]]<=x)v=fa[v][i];
	}
	return v;
}
//主席树
struct nodee{
	int ls,rs;
	int val;
}t[N*15];
int root[N],tot1;
int build(int l,int r)
{
	int p=++tot1;
	if(l==r)
	{
		t[p].val=0;
		return p;
	}
	int mid=l+r>>1;
	t[p].ls=build(l,mid);
	t[p].rs=build(mid+1,r);
	t[p].val=0;
	return p;
}
int modify(int now,int l,int r,int x,int d)
{
	int p=++tot1;
	t[p]=t[now];
	if(l==r)
	{
		t[p].val+=d;
		return p;
	}
	int mid=l+r>>1;
	if(x<=mid)t[p].ls=modify(t[now].ls,l,mid,x,d);
	else t[p].rs=modify(t[now].rs,mid+1,r,x,d);
	t[p].val=t[t[p].ls].val+t[t[p].rs].val;
	return p;
}
int query(int p,int q,int l,int r,int k)
{
	if(l==r)return l;
	int mid=l+r>>1;
	int lcnt=t[t[p].ls].val-t[t[q].ls].val; 
	if(k<=lcnt)return query(t[p].ls,t[q].ls,l,mid,k);
	else return query(t[p].rs,t[q].rs,mid+1,r,k-lcnt); 
}
signed main()
{
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)cin>>h[i];
	for(int i=1;i<=m;i++)
	{
		cin>>a[i].x>>a[i].y>>a[i].c;
	}
	num=n;
	k();
	for(int i=num;i>n;i--)
	{
		if(!v[i])
		{
			dep[i]=1;
			fa[i][0]=i;
			dfs(i);
		}
	}
	root[0]=build(1,num);
	for(int i=1;i<=num;i++)root[i]=modify(root[i-1],1,num,h[i],1);
	while(q--)
	{
		int v,x,k;
		cin>>v>>x>>k;
		int cnt=found(v,x);//存编号
		int ans=query(root[cnt],root[v-1],1,num,num-k+1);
		cout<<h[cnt]<<"\n";
	}
	return 0;
}//目前倍增写挂了 
2025/7/26 13:36
加载中...