全MLE求助
查看原帖
全MLE求助
824941
bsjsaikou10楼主2024/11/29 16:37
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN = 1e6 + 5;
typedef struct Edge{
	int u,v,w;
}Edge;
bool cmp(Edge x,Edge y){
	return x.w < y.w;
}
Edge ed[MAXN];
vector<int> edge[MAXN];
int n,m,q,cnt = 0,node;
int a[MAXN],val[MAXN],f[MAXN],dfn[MAXN];
int sz[MAXN],rdfn[MAXN],fa[MAXN][30];
int find(int x){
	return x == f[x] ? x : f[x] = find(f[x]);
}
void ex_kurskal(){
	sort(ed + 1,ed + 1 + cnt,cmp);
	for(int i = 1; i <= cnt; i++){
		int u = ed[i].u,v = ed[i].v,w = ed[i].w;
		if(find(u) != find(v)){
			node++;
			u = find(u),v = find(v);
			f[u] = f[v] = node;
			fa[u][0] = fa[v][0] = node;
			val[node] = w;
			edge[node].push_back(u);
			edge[node].push_back(v);
		}
	}
}
int tim = 0,vis[MAXN],lf[MAXN];
void dfs(int u,int fat){
	dfn[u] = ++tim;
	rdfn[tim] = u;
	vis[u] = 1;
	sz[u] = 1;
	for(int i = 20; i >= 1; i--){
		fa[u][i] = fa[fa[u][i - 1]][i - 1];
	}
	for(int i = 0; i < edge[u].size(); i++){
		int v = edge[u][i];
		if(v == fat){
			continue;
		}
		dfs(v,u);
		sz[u] += sz[v];
		lf[u] += lf[v];
	}
}
typedef struct TR{
	int ls,rs,sum;
}TR;
TR tr[MAXN * (1 << 5)];
int cnt_node = 0,rt[MAXN];
void insert(int &pos,int pre,int l,int r,int p,int flag){
	pos = ++cnt_node;
	tr[pos] = tr[pre];
	if(flag){
		tr[pos].sum++;
	}
	if(l == r){
		return;
	}
	int mid = (l + r) >> 1;
	if(p <= mid){
		insert(tr[pos].ls,tr[pre].ls,l,mid,p,flag);
	}
	else{
		insert(tr[pos].rs,tr[pre].rs,mid + 1,r,p,flag);
	}
}
int b[MAXN];
int query(int pos,int pre,int l,int r,int k){
	int x = tr[tr[pos].rs].sum - tr[tr[pre].rs].sum;
	if(l == r){
		//cout << l << endl;
		return b[l];
	}
	int mid = (l + r) >> 1;
	//cout << x << endl;
	if(k > x){
		return query(tr[pos].ls,tr[pre].ls,l,mid,k - x);
	}
	else{
		return query(tr[pos].rs,tr[pre].rs,mid + 1,r,k);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m >> q;
	node = n;
	for(int i = 1; i <= 2 * n; i++){
		f[i] = i;
	}
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		b[i] = a[i];
	}
	sort(b + 1,b + 1 + n);
	int n2 = unique(b + 1,b + 1 + n) - b - 1;
	for(int i = 1; i <= m; i++){
		int u,v,w;
		cin >> u >> v >> w;
		ed[++cnt].u = u;
		ed[cnt].v = v;
		ed[cnt].w = w;
	}
	ex_kurskal();
	for(int i = 1; i <= n; i++){
		lf[i] = 1;
	}
	for(int i = node; i >= 1; i--){
		if(!vis[i]){
			dfs(i,0);
		}
	}
	//dfs(node,0);
	for(int i = 1; i <= tim; i++){
		int pos = lower_bound(b + 1,b + 1 + n2,a[rdfn[i]]) - b;
		if(rdfn[i] > n){
			rt[i] = rt[i - 1];
		}
		else{
			insert(rt[i],rt[i - 1],1,n2,pos,1);
		}
	}
	int lastans = 0;
	while(q--){
		int u,x,k;
		cin >> u >> x >> k;
		u = (u ^ lastans) % n + 1;
		k = (k ^ lastans) % n + 1;
		x = (x ^ lastans);
		int temp = u;
		for(int i = 20; i >= 0; i--){
			if(fa[temp][i] && val[fa[temp][i]] <= x){
				temp = fa[temp][i];
			}
		}
		if(lf[temp] < k){
			cout << -1 << endl;
			lastans = 0;
			continue;
		}
		lastans = query(rt[dfn[temp] + sz[temp] - 1],rt[dfn[temp] - 1],1,n2,k);
		//return 0;
		cout << lastans << endl;
	}
}
2024/11/29 16:37
加载中...