萌新求助,调不出来
  • 板块P4197 Peaks
  • 楼主shight
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/7/19 20:54
  • 上次更新2023/10/27 19:26:46
查看原帖
萌新求助,调不出来
114859
shight楼主2022/7/19 20:54

做法是离散化后离线然后线段树合并+权值线段树

参照离散化并离线版本的P3224永无乡

然后问题应该是在主程序里

现在50分,真的调不出来了

求大佬帮忙

#include <bits/stdc++.h>
#define N 1000010
#define M 2000010
#define pii pair<int,int>
#define mkp make_pair
#define pb push_back
#define fi first
#define se second
//#define int long long
#define int_edge int to[M],val[M],nxt[M],head[N],cnt=0;
#define ls(nw) tr[nw].ls
#define rs(nw) tr[nw].rs
using namespace std;
int n,m,Q,ans[N],a[N],h[N],fa[N],tot=0,rt[N],len;
struct Y{
	int x,y,v;
}e[N];
struct Pat{
	int x,v,k,id;
}q[N];
struct Tree{
	int val,id,ls,rs;
}tr[N*40];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
int insert(int nw,int l,int r,int x,int i){
	if(!nw)nw=++tot;
	if(l==r){
		tr[nw].id=i;
		tr[nw].val++;
		return nw;
	}
	int mid=(l+r)/2;
	if(x<=mid)ls(nw)=insert(ls(nw),l,mid,x,i);
	if(x>mid)rs(nw)=insert(rs(nw),mid+1,r,x,i);
	tr[nw].val=tr[ls(nw)].val+tr[rs(nw)].val;
	return nw;
}
int merge(int x,int y,int l,int r){
	if(!x)return y;
	if(!y)return x;
	if(x==y){if(tr[y].id){tr[x].id=tr[y].id,tr[x].val+=tr[y].val;}return x;}
	int mid=(l+r)/2;
	ls(x)=merge(ls(x),ls(y),l,mid);
	rs(x)=merge(rs(x),rs(y),mid+1,r);
	tr[x].val=tr[ls(x)].val+tr[rs(x)].val;
	return x;
}
int query(int nw,int l,int r,int k){
	if(tr[nw].val<k||!nw)return 0;
	if(l==r)return tr[nw].id;
	int mid=(l+r)/2;
	if(k<=tr[rs(nw)].val)return query(rs(nw),mid+1,r,k);
	return query(ls(nw),l,mid,k-tr[rs(nw)].val);
}
int cmp(Y x,Y y){return x.v<y.v;}
int cmp2(Pat x,Pat y){return x.v<y.v;}
void add(int x,int y){
	x=find(x),y=find(y);
	fa[y]=x;rt[x]=merge(rt[x],rt[y],1,len);
}
signed main()
{
	scanf("%d %d %d",&n,&m,&Q);
	for(int i=1;i<=n;i++)scanf("%d",&h[i]),a[i]=h[i];
	sort(a+1,a+n+1);len=unique(a+1,a+n+1)-a-1;
	for(int i=1;i<=n;i++){
		h[i]=lower_bound(a+1,a+len+1,h[i])-a;
		fa[i]=i;rt[i]=insert(rt[i],1,len,h[i],i);
	}
	for(int i=1;i<=m;i++)scanf("%d %d %d",&e[i].x,&e[i].y,&e[i].v);
	for(int i=1;i<=Q;i++)scanf("%d %d %d",&q[i].x,&q[i].v,&q[i].k),q[i].id=i;
	sort(e+1,e+m+1,cmp);sort(q+1,q+Q+1,cmp2);
	int nw=1;
	for(int i=1;i<=Q;i++){
		while(nw<=m&&e[nw].v<=q[i].v)add(e[nw].x,e[nw].y),nw++;
		int pos=query(rt[find(q[i].x)],1,len,q[i].k);
		if(pos==0)ans[q[i].id]=-1;
			else ans[q[i].id]=a[h[pos]];
	}
	for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);
	return 0;
}
2022/7/19 20:54
加载中...