WA25求条
  • 板块P4197 Peaks
  • 楼主wangkangyou
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/15 13:28
  • 上次更新2023/11/15 13:30:36
查看原帖
WA25求条
655383
wangkangyou楼主2023/11/15 13:28
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){
	int sum = 0, f = 1;
	char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -f;
	for(; isdigit(ch); ch = getchar()) sum = (sum << 3) + (sum << 1) + (ch ^ 48);
	return sum * f; 
}
void write(int x){
	if(x < 0) putchar('-'), x = -x;
	if(x > 9) write(x / 10);
	putchar('0' + x % 10);
	return;
}
const int N = 1e5 + 10,
		  M = 5e5 + 10;
int n, m, q, len, tot, num, lst;
int a[N], b[N], val[N << 1], f[N << 1], fa[N << 1][21], ch[N << 1][2];
int dfn[N], st[N], ed[N];
int rt[N], cnt, sum[N << 6], ls[N << 6], rs[N << 6];
struct edge{
	int u, v, w;
	edge(int u = 0, int v = 0, int w = 0) : u(u), v(v), w(w){}
	bool operator < (const edge &b) const{
		return this -> w < b.w;
	}
}e[M];
int getf(int x){
	return f[x] == x ? x : f[x] = getf(f[x]);
}
void dfs(int u){
	st[u] = num;
	if(!ch[u][0] && !ch[u][1])
		dfn[++ num] = u;
	if(ch[u][0]) dfs(ch[u][0]);
	if(ch[u][1]) dfs(ch[u][1]);
	ed[u] = num;
	return;
}
void build(int &p, int l, int r){
	p = ++ cnt;
	if(l == r) return;
	int mid = l + r >> 1;
	build(ls[p], l, mid);
	build(rs[p], mid + 1, r);
	return;
}
void update(int &p1, int p2, int l, int r, int x, int k){
	p1 = ++ cnt;
	sum[p1] = sum[p2];
	ls[p1] = ls[p2];
	rs[p1] = rs[p2];
	sum[p1] += k;
	if(l == r) return;
	int mid = l + r >> 1;
	if(x <= mid) update(ls[p1], ls[p2], l, mid, x, k);
	else update(rs[p1], rs[p2], mid + 1, r, x, k);
	return;
}
int query(int p1, int p2, int l, int r, int k){
	int x = sum[ls[p2]] - sum[ls[p1]], mid = l + r >> 1;
	if(l == r) return l;
	if(k <= x) return query(ls[p1], ls[p2], l, mid, k);
	return query(rs[p1], rs[p2], mid + 1, r, k - x);
}
signed main(){
	n = read(), m = read(), q = read();
	for(int i = 1; i <= n; ++ i) a[i] = b[i] = read();
	sort(b + 1, b + n + 1);
	len = unique(b + 1, b + n + 1) - b - 1;
	for(int i = 1; i <= n; ++ i) a[i] = lower_bound(b + 1, b + len + 1, a[i]) - b;
	for(int i = 1, u, v, w; i <= m; ++ i){
		u = read(), v = read(), w = read();
		e[i] = edge(u, v, w);
	}
	sort(e + 1, e + m + 1);
	tot = n;
	for(int i = 1; i <= 2 * n; ++ i) f[i] = i;
	for(int i = 1, fu, fv; i <= m; ++ i){
		fu = getf(e[i].u), fv = getf(e[i].v);
		if(fu != fv){
			++ tot;
			val[tot] = e[i].w;
			f[fu] = f[fv] = tot;
			fa[fu][0] = fa[fv][0] = tot;
			ch[tot][0] = fu;
			ch[tot][1] = fv;
		}
	} 
	for(int i = 1; i <= tot; ++ i) if(f[i] == i) dfs(i);
	for(int i = 1; i <= 20; ++ i)
		for(int j = 1; j <= tot; ++ j)
			fa[j][i] = fa[fa[j][i - 1]][i - 1];
	build(rt[0], 1, len);
	for(int i = 1; i <= n; ++ i)
		update(rt[i], rt[i - 1], 1, len, a[dfn[i]], 1);
	while(q --){
		int u = read(), x = read(), k = read();
		for(int i = 20; i >= 0; -- i)
			if(fa[u][i] != 0 && val[fa[u][i]] <= x)
				u = fa[u][i];
		if(ed[u] - st[u] < k) puts("-1"), lst = 0;
		else write(lst = b[query(rt[st[u]], rt[ed[u]], 1, len, ed[u] - st[u] - k + 1)]), puts("");
	}
	return 0;
}
2023/11/15 13:28
加载中...