社区讨论

不过样例求条

P7834[ONTAK2010] Peaks 加强版参与者 1已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mj2zaiyz
此快照首次捕获于
2025/12/12 22:44
2 个月前
此快照最后确认于
2025/12/14 16:30
2 个月前
查看原帖
代码如下,全是 -1。
CPP
#include<bits/stdc++.h>
#define endl '\n'
//#define MSOD


using namespace std;
using ll = long long;

constexpr ll N = 1e5 + 5, M = 5e5 + 5, K = 5e6 + 5;

int n, m, q, tot, cnt, totp;
int rt[N], reg[N], fa[N << 1], dfn[N << 1], L[N << 1], R[N << 1], dad[N << 1][20];
ll a[N], buc[N], val[N];
struct ET {
	int u, v;
	ll w;
	inline friend bool operator < (ET x, ET y) {
		return x.w < y.w;
	}
} edg[M];
struct SGT {
	int ls, rs;
	ll v;
} t[K];
inline void build(int &p, int pl, int pr) {
	if(!p) {p = ++ totp;}
	if(pl == pr) {
		return;
	} else {
		int mid = (pl + pr) >> 1;
		build(t[p].ls, pl, mid);
		build(t[p].rs, mid + 1, pr);
	}
	return;
}
inline void pushup(int &p) {
	return t[p].v = t[t[p].ls].v + t[t[p].rs].v, void();
}
inline void upd(int &p, int lst, int pl, int pr, int pos, int d) {
	p = ++ totp;
	t[p] = t[lst];
	if(pl == pr) {
		t[p].v += d;
	} else {
		int mid = (pl + pr) >> 1;
		if(pos <= mid) {
			upd(t[p].ls, t[lst].ls, pl, mid, pos, d);
		} else {
			upd(t[p].rs, t[lst].rs, mid + 1, pr, pos, d);
		}
		pushup(p);
	}
	return;
}
inline int qry(int pL, int pR, int pl, int pr, int k) {
	// cout<<pl<<" "<<pr<<endl;
	if(t[pR].v - t[pL].v < k) {
		return -1;
	} else if(pl == pr) {
		return pl;
	} else {
		int mid = (pl + pr) >> 1, sm = t[t[pR].rs].v - t[t[pL].rs].v;
		if(sm >= k) {
			return qry(t[pL].rs, t[pR].rs, mid + 1, pr, sm);
		} else {
			return qry(t[pL].ls, t[pR].ls, pl, mid, k - sm);
		}
	}
}
vector<int> g[N << 1];
inline int fnd(int x) {
	return (x == fa[x] ? x : fa[x] = fnd(fa[x]));
}
inline void kruskal() {
	tot = n;
	sort(edg + 1, edg + m + 1);
	iota(fa + 1, fa + n + 1, 1);
	for(int i = 1 ; i <= m ; i ++) {
		int fu = fnd(edg[i].u), fv = fnd(edg[i].v);
		if(fu != fv) {
			++ tot, fa[tot] = fa[fu] = fa[fv] = tot, val[tot] = edg[i].w;
			g[fu].push_back(tot), g[fv].push_back(tot);
			g[tot].push_back(fu), g[tot].push_back(fv);
			// cout<<fu<<" "<<tot<<endl<<tot<<" "<<fv<<endl;
		}
	}
	return;
}
inline void dfs(int u, int dd) {
	dad[u][0] = dd;
	if(g[u].size() == 1 && g[u][0] == dd) {
		dfn[u] = L[u] = R[u] = ++ cnt, reg[cnt] = u;
	}
	for(auto v : g[u]) {
		if(v != dd) {
			dfs(v, u);
			L[u] = min(L[u], L[v]), R[u] = max(R[u], R[v]);
		}
	}
	return;
}
inline int get(int u, ll x, int k) {
	for(int i = 19 ; i >= 0 ; i --) {
		if(dad[u][i] && val[dad[u][i]] <= x) {
			u = dad[u][i];
		}
	}
	return qry(L[u], R[u], 1, n, k);
	// return -1;
}
inline void solve() {
	cin>>n>>m>>q;
	for(int i = 1 ; i <= n ; i ++) {
		cin>>a[i];
		buc[i] = a[i];
	}
	for(int i = 1 ; i <= m ; i ++) {
		cin>>edg[i].u>>edg[i].v>>edg[i].w;
	}
	kruskal();
	fill(L + 1, L + tot + 1, INT_MAX);
	for(int i = 1 ; i <= tot ; i ++) {
		if(!R[fnd(i)]) {
			dfs(fnd(i), 0);
		}
	}
	for(int i = 1 ; i < 20 ; i ++) {
		for(int j = 1 ; j <= tot ; j ++) {
			dad[j][i] = dad[dad[j][i - 1]][i - 1];
		}
	}
	sort(buc + 1, buc + n + 1, less<ll>());
	int mm = unique(buc + 1, buc + n + 1) - buc - 1;
	for(int i = 1 ; i <= n ; i ++) {
		a[i] = lower_bound(buc + 1, buc + mm + 1, a[i]) - buc;
	}
	build(rt[0], 1, n);
	for(int i = 1 ; i <= cnt ; i ++) {
		// cout<<a[reg[i]]<<" ";
		// cout<<t[totp].v<<" ";
		upd(rt[i], rt[i - 1], 1, n, a[reg[i]], 1);
	}
	ll lstans = 0;
	while(q --) {
		ll u, x, k;
		cin>>u>>x>>k;
		u = (u ^ lstans) % n + 1, k = (k ^ lstans) % n + 1, x = x ^ lstans;
		int res = get(u, x, k);
		if(res == -1) {
			cout<<-1<<endl;
			lstans = 0;
		} else {
			cout<<a[res]<<endl;
			lstans = a[res];
		}
	}
	return;
}

signed main() {
	ios::sync_with_stdio(false), cout.tie(0), cin.tie(0);
	int TC = 1;
#ifdef MSOD
	cin>>TC;
#endif
	while(TC --) {
		solve();
	}
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...