提交记录 4225


用户 题目 状态 得分 用时 内存 语言 代码长度
hekai noi18a. 【NOI2018】归程 Compile Error 0 0 ns 0 KB C++ 2.77 KB
提交时间 评测时间
2018-07-18 23:14:01 2020-07-31 22:41:07
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#define INF ((1LL<<31)-1)
using namespace std;
const int N=900000,M=1800000;
int n,m,tot,Next[M],head[N],tree[M],val[M],height[M],a[N],V[N],f[N],dis[N],Min[N],fa[N][26],F[N][26];
bool vis[N];
struct Edge{int u,v,l,x;}E[M];
vector<int>P[N];

struct Node
{
  int d, n;
} cur;
struct cmp
{
  bool operator()(Node a, Node b) { return a.d > b.d; }
};
priority_queue<Node, vector<Node>, cmp> Q;

void add(int x,int y,int l,int X)
{
	tot++;
	Next[tot]=head[x];
	head[x]=tot;
	tree[tot]=y;
	val[tot]=l;
	height[tot]=X;
}
void Dijkstra()
{
	for (int i=1;i<=n;i++) dis[i]=1<<30,vis[i]=0;
	cur.d = 0;
    cur.n = 1;
    Q.push(cur);
    dis[1] = 0;
    while (!Q.empty())
    {
        int u = Q.top().n;
        Q.pop();
        if (vis[u])
        continue;
        vis[u] = true;
        for (int i = head[u]; i; i = Next[i])
        {
            int v = tree[i];
            if (!vis[v] && dis[v] > (long long)(dis[u] + val[i]))
            {
                dis[v] = dis[u] + val[i];
                cur.d = dis[v];
                cur.n = v;
                Q.push(cur);
            }
        }
    }
}
bool cmp(Edge a,Edge b) { return a.x>b.x;}
int get(int x)
{
	if (f[x]==x) return x;else f[x]=get(f[x]);
	return f[x];
}
void dfs(int u,int father)
{
	Min[u]=dis[u];
	F[u][0]=V[father];
	fa[u][0]=father;
	for (int i=1;i<=25;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
	for (int i=1;i<=25;i++) F[u][i]=min(F[u][i-1],F[fa[u][i-1]][i-1]);
	for (int i=0;i<P[u].size();i++)
	{
		int v=P[u][i];
		if (v==father) continue;
		dfs(v,u);
		Min[u]=min(Min[u],Min[v]);
	}
}
int get_ans(int u,int X)
{
	for (int i=25;i>=0;i--)
		if (F[u][i]>=X) u=fa[u][i];
	return u;
}
int main()
{
	int T;
	scanf("%d",&T);
	while (T--)
	{
		scanf("%d%d",&n,&m);
        tot=0;
        memset(head,0,sizeof(head));
		for (int i=1;i<=m;i++)
		{
			int u,v,l,x;
			scanf("%d%d%d%d",&u,&v,&l,&x);
			add(u,v,l,x);add(v,u,l,x);
			E[i]=(Edge){u,v,l,x};
		}
		for (int i=1;i<=n;i++) V[i]=INF;
		Dijkstra();
		sort(E+1,E+m+1,cmp);
		for (int i=1;i<=n;i++) f[i]=i;
		int cnt=n;
		for (int i=1;i<=m;i++)
		{
			int u=E[i].u,v=E[i].v,u1=get(u),v1=get(v);
			if (u1!=v1)
			{
				V[++cnt]=E[i].x;
				f[cnt]=cnt;
				dis[cnt]=INF;
				P[cnt].push_back(u1);
				P[cnt].push_back(v1);
				f[u1]=f[v1]=cnt;
			}
		}
		int root=0;
		for (int i=1;i<=cnt;i++)
			if (get(i)==i) { root=i;break;}
		for (int i=0;i<=cnt;i++)
			for (int j=0;j<=25;j++) F[i][j]=INF,fa[i][j]=0;
		dfs(root,0);
		int Q,K,S;
		scanf("%d%d%d",&Q,&K,&S);
		int lastans=0;
		while (Q--)
		{
			int v0,p0;
			scanf("%d%d",&v0,&p0);
			v0=(v0+K*lastans-1)%n+1;
			p0=(p0+K*lastans)%(S+1);
			lastans=Min[get_ans(v0,p0+1)];
			printf("%d\n",lastans);
		}
        for (int i=1;i<=cnt;i++) P[i].clear();
	}
	return 0;
}

CompilationN/AN/ACompile ErrorScore: N/A


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-13 22:28:01 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠