30pts求助!!!
查看原帖
30pts求助!!!
520338
Luckies楼主2023/8/25 14:56

rt,第四个样例没过,#7~#20 WA,求调!!!

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 8e5 + 5;
int t, k, s, n, m, q, nn, h[N], fa[N], dp[N][21], dep[N], dis[N], ans[N], lastans;
bool vis[N];
struct Node
{
	int x, y, w, h;
	bool operator < (const Node &b) const
	{
		return h > b.h;
	}
}a[N];
struct node
{
	int y, w;
};
vector<node> e[N];
vector<int> g[N];
void dijkstra(int s)
{
	memset(dis, 0x3f, sizeof(dis));
    memset(vis, false, sizeof(vis));
	priority_queue< pair<int, int> > pq;
	pq.push(make_pair(0, s));
	dis[s] = 0;
	while(!pq.empty())
	{
		int x = pq.top().second;
		pq.pop();
		if(vis[x])
			continue;
		vis[x] = true;
		for(auto i : e[x])
		{
			int y = i.y, w = i.w;
			if(dis[x] + w < dis[y])
			{
				dis[y] = dis[x] + w;
				pq.push(make_pair(-dis[y], y));
			}
		}
	}
	return;
}
int find(int x)
{
	if(fa[x] == x)
		return x;
	return fa[x] = find(fa[x]);
}
void kruskal()
{
	sort(a + 1, a + 1 + m);
	for(int i = 1; i <= n; i++)
		fa[i] = i;
	for(int i = 1; i <= m; i++)
	{
		int fx = find(a[i].x), fy = find(a[i].y);
		if(fx != fy)
		{
            n++;
			fa[fx] = fa[fy] = fa[n] = n;
            h[n] = a[i].h;
			g[n].push_back(fx);
			g[n].push_back(fy);
		}
	}
	return;
}
void init_ans(int x)
{
    ans[x] = dis[x];
    for(auto y : g[x])
    {
        init_ans(y);
        ans[x] = min(ans[x], ans[y]);
    }
    return;
}
void pre_lca(int x, int f)
{
    dep[x] = dep[f] + 1;
    dp[x][0] = f;
    for(int i = 1; (1 << i) <= dep[x]; i++)
        dp[x][i] = dp[dp[x][i - 1]][i - 1];
    for(auto y : g[x])
        pre_lca(y, x);
    return;
}
int query(int x, int p)
{
	for(int i = 23; i >= 0; i--)
		if(dp[x][i] && h[dp[x][i]] > p)
			x = dp[x][i];
	return ans[x];
}
void init()
{
    for(int i = 1; i <= n + m; i++)
        e[i].clear(), g[i].clear();
    memset(ans, 0x3f, sizeof(ans));
    memset(dp, 0, sizeof(dp));
    memset(h, 0xcf, sizeof(h));
    lastans = 0;
    return;
}
void solve()
{
	cin >> n >> m;
    nn = n;
    init();
	for(int i = 1; i <= m; i++)
	{
		cin >> a[i].x >> a[i].y >> a[i].w >> a[i].h;
		e[a[i].x].push_back((node){a[i].y, a[i].w});
		e[a[i].y].push_back((node){a[i].x, a[i].w}); 
	}
	dijkstra(1);
	kruskal();
    init_ans(n);
    pre_lca(n, 0);
	cin >> q >> k >> s;
	for(int i = 1; i <= q; i++)
	{
		int v, p;
        cin >> v >> p;
        v = (v + k * lastans - 1) % nn + 1;
        p = (p + k * lastans) % (s + 1);
        lastans = query(v, p);
        cout << lastans << "\n";
	}
    return;
}
signed main()
{
	cin >> t;
	while(t--)
		solve();
	return 0;
}
2023/8/25 14:56
加载中...