55pts求调
查看原帖
55pts求调
907536
one_zero_two_zero楼主2024/10/5 16:31

写了一个下午,寄

#include<bits/stdc++.h>
using namespace std;

struct edge{
	int nxt, u, v;
	long long l, a;
	bool operator < (const edge &e) const{
		return a > e.a;
	}
};

int T;
int N, M, P = 1, Q, K, tot;
int u, v;
int lastans = 0, s, p;
long long l, a, S;
int head[400005];
long long dis[4000005];
bool vis[400005];
edge E[2000006];
int F[400005], fastfa[400005];
long long high[400005] = {-1};
int st[35][400005];
vector<int> son[400005];
int h[400005];

void addedge(int u, int v, long long l, long long a){
	E[++ P] = {head[u], u, v, l, a};
	head[u] = P;
}

int find(int x){
	if (fastfa[x] == x) return x;
	fastfa[x] = find(fastfa[x]);
	return fastfa[x];
}

void merge(int x, int y, int z){
	int fx = find(x), fy = find(y), fz = find(z);
	if (fx == fy) return;
	F[fx] = F[fy] = fz;
	fastfa[fx] = fastfa[fy] = fz;
	dis[fz] = min(dis[fx], dis[fy]);
}

void dijkstra(int s){
	dis[s] = 0;
	priority_queue<pair<long long, int>, vector<pair<long long, int> >, greater<pair<long long, int> > > q;
	q.push({0, s});
	while (q.size()){
		int u = q.top().second;
		q.pop();
		if (vis[u]) continue;
		vis[u] = 1;
		for (int i = head[u]; i; i = E[i].nxt){
			int v = E[i].v, w = E[i].l;
			if (dis[v] <= dis[u] + w) continue;
			dis[v] = dis[u] + w;
			q.push({dis[v], v});
		}
	}
}

void erg(int u, int dep){
	h[u] = dep;
	st[0][u] = F[u];
	for (int i = 1; i <= __lg(dep); i ++){
		st[i][u] = st[i - 1][st[i - 1][u]];
	}
	for (auto && v : son[u]){
		erg(v, dep + 1);
	}
}

long long operate(int x){
	for (int i = __lg(h[x]); i >= 0; i --){
		if (high[st[i][x]] <= p) continue;
		x = st[i][x];
	}
	return dis[x];
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("../data.in", "r", stdin);
    freopen("../data.out", "w", stdout);
#endif
	
	scanf("%d", &T);
	while (T --){
		scanf("%d %d", &N, &M);
		tot = N, P = 1;
		for (int i = 1; i <= N; i ++){
			dis[i] = 0x3f3f3f3f3f3f3f3fLL;
			vis[i] = 0;
			high[i] = 0x3f3f3f3f3f3f3f3fLL;
			head[i] = 0;
		}
		for (int i = 1; i <= 2 * N; i ++){
			fastfa[i] = F[i] = i;
		}
		
		for (int i = 0; i < M; i ++){
			scanf("%d %d %lld %lld", &u, &v, &l, &a);
			addedge(u, v, l, a);
			addedge(v, u, l, a);
		}
		scanf("%d %d %lld", &Q, &K, &S);
		
		dijkstra(1);
		sort(E + 2, E + P + 1);
		
		for (int i = 2; i <= P; i ++){
			int u = E[i].u, v = E[i].v;
			if (find(u) == find(v)) continue;
			merge(u, v, ++ tot);
			high[tot] = E[i].a;
		}
		F[tot] = 0;
		for (int i = 0; i <= tot; i ++) son[i].clear();
		for (int i = 1; i < tot; i ++){
			son[F[i]].push_back(i);
		}
		erg(tot, 1);
			
		for (int i = 1; i <= Q; i ++){
			scanf("%d %d", &s, &p);
			s = (s + K * lastans - 1) % N + 1;
			p = (p + K * lastans) % (S + 1);
			
			//cout << s << " " << p << ":::\n";
			long long ans = operate(s);
			/*
			while(1){
				ans = dis[s];
				if (F[s] == 0) break;
				s = F[s];
				if (high[s] <= p) break;
			}
			*/
			lastans = ans;
			printf("%lld\n", ans);
		}
	}

    return 0;
}

WA 7 9 10 1115 16 17 18 19

2024/10/5 16:31
加载中...