社区讨论

TLE 10pts 求助

P4768[NOI2018] 归程参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo7kquht
此快照首次捕获于
2023/10/27 03:25
2 年前
此快照最后确认于
2023/10/27 03:25
2 年前
查看原帖
重构树的写法,不知道哪里出了问题,等一个大佬
CPP
#include <bits/stdc++.h>
#define N 400005
#define i64 long long int
int t, n, m;
struct edge {
	int v, l, a;
	edge(void) {
		return;
	}
	edge(int x, int y, int z) {
		v = x, l = y, a = z;
		return;
	}
};
struct dij {
	int p;
	i64 w;
	dij(void) {
		return;
	}
	dij(int x, i64 y) {
		p = x, w = y;
		return;
	}
	bool operator<(const dij &x) const {
		return w > x.w;
	}
};
struct eg {
	int u, v, a;
	eg(void) {
		return;
	}
	eg(int x, int y, int z) {
		u = x, v = y, a = z;
		return;
	}
	bool operator<(const eg &x) const {
		return a < x.a;
	}
};
std::vector<edge> graph[N];
i64 dis[N<<1];
int vis[N];
std::priority_queue<dij> heap;
std::priority_queue<eg> kus;
int fa[N<<1], val[N<<1], cnt;
std::vector<int> g[N<<1];
int tr[N][30];
int mval[N<<1];
void dijkstra(int rt) {
	dis[rt] = 0;
	heap.push(dij(rt, 0));
	while(!heap.empty()) {
		dij pr = heap.top();
		heap.pop();
		int u = pr.p;
		if(vis[u])
			continue;
		vis[u] = 1;
		for(edge e : graph[u]) {
			int v = e.v, w = e.l;
			if(dis[v] > dis[u] + w) {
				dis[v] = dis[u] + w;
				heap.push(dij(v, dis[v]));
			}
		}
	}
	return;
}
int find(int x) {
	if(fa[x] == x)
		return x;
	fa[x] = find(fa[x]);
	return fa[x];
}
void merge(int a, int b, int w) {
	int _a = find(a), _b = find(b);
	if(_a == _b)
		return;
	++ cnt;
	fa[_a] = fa[_b] = cnt;
	val[cnt] = w;
	g[cnt].push_back(_a);
	g[cnt].push_back(_b);
	return;
}
void kruskal(void) {
	while(cnt < (n<<1) - 1) {
		eg e = kus.top();
		kus.pop();
		merge(e.u, e.v, e.a);
	}
	return;
}
void dfs(int now) {
	for(int e : g[now]) {
		tr[e][0] = now;
		for(int i = 1; i <= 20; ++ i) {
			tr[e][i] = tr[tr[e][i - 1]][i - 1];
			if(e > n)
				dfs(e);
			dis[now] = std::min(dis[now], dis[e]);
		}
	}
	return;
}
i64 solve(int now, int lin) {
	for(int i = 20; i >= 0; -- i) {
		if(val[tr[now][i]] > lin)
			now = tr[now][i];
	}
	return dis[now];
}
void go(void) {
	scanf("%d%d", &n, &m);
	cnt = n;
	for(int i = 1; i <= n; ++ i)
		graph[i].clear();
	for(int i = 1; i <= n<<1; ++ i)
		fa[i] = i;
	while(!kus.empty())
		kus.pop();
	for(int i = 1, u, v, l, a; i <= m; ++ i) {
		scanf("%d%d%d%d", &u, &v, &l, &a);
		graph[u].push_back(edge(v, l, a));
		graph[v].push_back(edge(u, l, a));
		kus.push(eg(u, v, a));
	}
	memset(dis, 0x3f, sizeof(dis));
	memset(vis, 0, sizeof(vis));
	memset(tr, 0, sizeof(tr));
	while(!heap.empty())
		heap.pop();
	dijkstra(1);
	kruskal();
	dfs(cnt);
	int q, k, s, v, p;
	i64 ans, lastans = 0;
	scanf("%d%d%d", &q, &k, &s);
	while(q --) {
		scanf("%d%d", &v, &p);
		v = (v + k * lastans - 1) % n + 1;
		p = (p + k * lastans) % (s + 1);
		ans = solve(v, p);
		printf("%lld\n", ans);
		lastans = ans;
	}
	return;
}
int main(void) {
	scanf("%d", &t);
	while(t --) {
		go();
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...