P4197 不太会,求条
  • 板块灌水区
  • 楼主Henly_Z
  • 当前回复29
  • 已保存回复29
  • 发布时间2024/8/12 15:53
  • 上次更新2024/8/12 16:40:07
查看原帖
P4197 不太会,求条
683212
Henly_Z楼主2024/8/12 15:53

题目链接

#include<bits/stdc++.h>
#define mid ((l + r) / 2)
using namespace std;
constexpr int N = 200005;
int n , m  , a[N] , b[N] , dfn[N] ,deg[N] , val[N];
int root[N] , tot , q;
int ls[N * 20] , rs[N* 20] , sum[N * 20],Cnt,head[N],fa[N],in[N],f[N][20],size[N],out[N],h[N];
struct node {
	int x , y , w;
} e[N];
struct Node {
	int to , nxt;
} edge[N];

void add(int u, int v) {
	edge[++Cnt]=(Node) {
		v, head[u]
	};
	head[u]=Cnt;
	deg[v]++;
}

bool cmp(node a, node b) {
	return a.w<b.w;
}
int find(int x) {
	return x==fa[x]?x:fa[x]=find(fa[x]);
}

void dfs(int u) {
	dfn[++tot]=u;
	in[u]=tot;
	for (int i=1; (1<<i)<=(n<<1); i++) f[u][i]=f[f[u][i-1]][i-1];
	for (int i=head[u]; i; i=edge[i].nxt) {
		int v=edge[i].to;
		if (v==f[u][0]) continue;
		f[v][0]=u;
		dfs(v);
		size[u]+=size[v];
	}
	if (!size[u]) size[u]=1;
	out[u]=tot;
}

void build(int &u , int l , int r) {
	u = ++tot;
	if(l == r) return;
	build(ls[u] , l , mid);
	build(rs[u] , mid + 1, r);
}
void change(int &u , int v , int l , int r , int p) {
	u = ++tot;
	ls[u] = ls[v];
	rs[u] = rs[v];
	sum[u] = sum[v] + 1;
	if(l == r) return ;
	if(p <= mid) change(ls[u] , ls[v] , l , mid ,p);
	else change(rs[u] , rs[v] , mid + 1 , r , p);
}
int query(int u ,int v ,int l ,int r ,int k) {
	if(l == r) return l;
	int s = sum[ls[u]] - sum[ls[v]];
	if(s >= k) return query(ls[u] , ls[v] , l , mid , k);
	else return query(rs[u] , rs[v] , mid + 1, r , k - s);
}
int main() {
	cin >> n >> m >> q;
	
	for(int i = 1 ; i <= n ; i++){
		cin >> h[i];
		b[i] = h[i];
	}
	for(int i = 1 ; i <= m ; i++){	
		cin >> e[i].x >> e[i].y >> e[i].w;
	}
	sort(e + 1 , e + m + 1 , cmp);
	for(int i = 1 ; i <= n ; i++){
		fa[i] = i;
	}
	int nn = n;
	for(int i = 1 ; i <= m ; i++){
		int fx = find(e[i].x);
		int fy = find(e[i].y);
		if(fx^fy){
			val[++nn]  = e[i].w;
			fa[fx] = fa[fy] = 0;
			add(nn,fx);
			add(nn,fy);
		}
	}
	for(int i = 1 ; i <= n ; i++){
		if(!deg[i]) dfs(i);
	}
	for(int i = 1 ; i <= n ; i++){
		b[i] = h[dfn[i]];
	}
	sort(b + 1 , b + n + 1);
	int bn = unique(b + 1 , b + n + 1) - b - 1;
	for(int i = 1 ; i <= n ; i++) {
		int p = lower_bound(b + 1 , b + bn + 1 ,a[i]) - b;
		change(root[i] , root[i - 1] , 1 , bn ,p);
	}
	while(q--) {
		int l , r , k;
		cin >> l >> r >> k;
		int p = query(root[r] , root[l - 1] , 1 , bn, k);
		cout << b[p] << endl;
	}
}
2024/8/12 15:53
加载中...