社区讨论

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 条回复,欢迎继续交流。

正在加载回复...