社区讨论
25ptsWA求助 ,求数据 让我WA!!!!!
P4197[ONTAK2010] Peaks参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lobnwzdr
- 此快照首次捕获于
- 2023/10/30 00:05 2 年前
- 此快照最后确认于
- 2023/11/04 04:49 2 年前
CPP
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10,M = 5e5 + 10,inf = 2e9 + 1;
int n,m,q;
int h[N],fa[N],sz = 0,dif[N],f[N][22],id[N],rk[N],cnt = 0,root[N],tree_sz = 0;
struct node{
int sum,l,r;
}tree[N*60];
typedef pair<int,int> P;
P ran[N];
bool book[N];
vector<int>v[N],vt;
struct edge{
int a,b,w;
}e[M];
int get_id(int x){return lower_bound(vt.begin(),vt.end(),x) - vt.begin() + 1;}
bool cmp(edge a,edge b){
return a.w<b.w;
}
int find(int n){return fa[n]==n?n:fa[n]=find(fa[n]);}
void update(int l,int r,int &x,int y,int loc){
x = ++tree_sz;
tree[x] = tree[y];
tree[x].sum++;
if(l==r)return ;
int m = (l+r)>>1;
if(loc<=m)
update(l,m,tree[x].l,tree[y].l,loc);
else
update(m+1,r,tree[x].r,tree[y].r,loc);
}
int query(int l,int r,int x,int y,int loc){
if(l==r)return l;
int m = (l+r)>>1;
int s = tree[tree[y].l].sum - tree[tree[x].l].sum;
if(loc<=s)return query(l,m,tree[x].l,tree[y].l,loc);
else return query(m+1,r,tree[x].r,tree[y].r,loc - s);
}
void dfs(int s){
book[s] = 1;
ran[s].first = cnt + 1;
for(int i = 0;i<v[s].size();++i){
f[v[s][i]][0] = s;
dfs(v[s][i]);
}
if(!v[s].size()){
id[s] = ++cnt;
rk[cnt] = s;
}
ran[s].second = cnt;
}
int get_node(int v,int x){
dif[0] = inf;
for(int i = 20;i>=0;--i){
if(dif[f[v][i]]<=x){
v = f[v][i];
}
}
return v;
}
int main(){
//freopen("a.txt","r",stdin);
//IOS;
cin>>n>>m>>q;
for(int i = 1;i<=n;++i){
cin>>h[i];
vt.push_back(h[i]);
}
sort(vt.begin(),vt.end());
vt.erase(unique(vt.begin(),vt.end()),vt.end());
for(int i = 0;i<N;++i)fa[i] = i;
for(int i = 1;i<=m;++i){
cin>>e[i].a>>e[i].b>>e[i].w;
}
sort(e+1,e+1+m,cmp);
sz = n;
for(int i = 1;i<=m;++i){
int ta = find(e[i].a),tb = find(e[i].b);
if(ta!=tb){
fa[ta] = ++sz;
fa[tb] = sz;
dif[sz] = e[i].w;
v[sz].push_back(ta);
v[sz].push_back(tb);
}
}
for(int i = sz;i>=1;--i){
if(!book[i])dfs(i);
}
for(int i = 1;i<=n;++i){
update(1,n,root[i],root[i-1],get_id(h[rk[i]]));
}
for(int j = 1;j<21;++j){
for(int i = 1;i<=n;++i){
f[i][j] = f[f[i][j-1]][j-1];
}
}
for(int i = 1;i<=q;++i){
int v,x,k;
cin>>v>>x>>k;
int p = get_node(v,x),temp = ran[p].second - ran[p].first + 1;
if(k>temp){
cout<<-1<<endl;
}
else{
if(tree[root[ran[p].second]].sum - tree[root[ran[p].first - 1]].sum!=temp)cout<<"!!!"<<endl;
int l = query(1,n,root[ran[p].first - 1],root[ran[p].second],temp - k + 1) - 1;
cout<<vt[l]<<endl;
}
}
return 0;
}
真的不知道哪wa了???
各种数据都没错啊!!!
回复
共 4 条回复,欢迎继续交流。
正在加载回复...