55pts 求助
查看原帖
55pts 求助
515129
TLEWA楼主2023/12/6 22:53
#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=400005,M=800005;

int T;
int n,m,q,k,s;

struct Node {int u,v,l,a;}arr[M];
bool cmp(Node a,Node b) {return a.a>b.a;}

int fa[2*N],len[2*N],f[N][20],dis[2*N],vis[2*N];
vector<int> vec[2*N];
vector<pair<int,int> > dijvec[N];

priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > que;
void dij() {
	memset(dis,127,sizeof(dis));
	memset(vis,0,sizeof(vis));
	que.push(make_pair(0,1));
	dis[1]=0;
	while(!que.empty()) {
		auto top=que.top();
		int u=top.second;
		que.pop();
		if(vis[u]) continue;
		vis[u]=1;
		int v,w;
		for(auto v_w:dijvec[u]) {
			v=v_w.first,w=v_w.second;
			if(dis[u]+w<dis[v]) {
				dis[v]=dis[u]+w;
				que.push(make_pair(dis[v],v));
			}
		}
	}
}

int find(int u) {
	if(fa[u]==u) return u;
	return fa[u]=find(fa[u]);
}

int p;
void add(Node node) {
	int u=node.u,v=node.v,w=node.a;
	int fu=find(u),fv=find(v);
	if(fu==fv) return;
	++p;
	fa[fu]=fa[fv]=p;
	vec[fu].push_back(p);
	vec[fv].push_back(p);
	vec[p].push_back(fu);
	vec[p].push_back(fv);
	len[p]=w;
}

void dfs(int u,int father) {
	f[u][0]=father;
	for(int i=1;i<=19;++i) f[u][i]=f[f[u][i-1]][i-1];
	for(auto v:vec[u]) {
		if(v==father) continue;
		dfs(v,u);
		dis[u]=min(dis[u],dis[v]);
	}
//	cout << u << ' ' << dis[u] << ' ' << len[u] << endl;
}

int get(int u,int h) {
	for(int i=19;i>=0;--i) {
//		cout << f[u][i] << ' ' << len[f[u][i]] << endl;
		if(f[u][i]&&len[f[u][i]]>h) u=f[u][i];
	}
	return dis[u];
}

signed main() {
	cin >> T;
	while(T--) {
		p=0;
		cin >> n >> m;
		int u,v,l,a;
		
		for(int i=1;i<=n;++i) dijvec[i].clear();
		
		for(int i=1;i<=m;++i) {
			cin >> u >> v >> l >> a;
			dijvec[u].push_back(make_pair(v,l));
			dijvec[v].push_back(make_pair(u,l));
			arr[i]={u,v,l,a};
		}
		
		sort(arr+1,arr+1+n,cmp);
		memset(len,127,sizeof(len));
		memset(f,0,sizeof(f));
		
		p=n;
		for(int i=1;i<=2*n;++i) fa[i]=i,vec[i].clear();
		for(int i=1;i<=m;++i) add(arr[i]);
		
		dij();
		dfs(p,0);
		
		cin >> q >> k >> s;
		
		int start,height,lastans=0;
		while(q--) {
			cin >> start >> height;
			start=(start+k*(lastans)-1)%n+1;
			height=(height+k*lastans)%(s+1);
			cout << (lastans=get(start,height)) << endl;
		}
	}
	return 0;
}

是写的正解,求求看看哪里实现炸了,悬二关

2023/12/6 22:53
加载中...