社区讨论
不过样例求条
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 条回复,欢迎继续交流。
正在加载回复...