| 记录编号 |
539498 |
评测结果 |
AAAAATAAATTTTTAATTTT |
| 题目名称 |
3164.[NOI 2018]归程 |
最终得分 |
50 |
| 用户昵称 |
瑆の時間~無盡輪迴·林蔭 |
是否通过 |
未通过 |
| 代码语言 |
C++ |
运行时间 |
41.425 s |
| 提交时间 |
2019-08-07 15:55:22 |
内存使用 |
267.72 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
struct P
{
int x,y,a;
};
P t[800001];
vector<pair<int,long long int> >ls[800001];
vector<long long int> nt[800001];
long long int val[800001];
bool vis[800001];
long long int dis[800001];
long long int fat[800001];
long long int T,n,m,a1,a2,a3,a4,cnt,Q,K,S;
priority_queue<pair<long long int,long long int> > q;
int FIND(long long int x)
{
if(x==fat[x])
{
return x;
}
return fat[x]=FIND(fat[x]);
}
void DIJ()
{
memset(vis,0,sizeof(vis));
memset(dis,0x3f3f3f3f,sizeof(dis));
dis[1]=0;
q.push(make_pair(0,1));
while(!q.empty())
{
long long int u=q.top().second;
q.pop();
if(vis[u])
continue;
vis[u]=1;
for(int i=0;i<ls[u].size();i++)
{
long long int v=ls[u][i].first;
if(dis[u]+ls[u][i].second<dis[v])
{
dis[v]=dis[u]+ls[u][i].second;
q.push(make_pair(-dis[v],v));
}
}
}
}
bool Function(P a,P b)
{
return a.a>b.a;
}
long long int far[800001];
long long int gra[800001][30];
void DFS(int x)
{
far[x]=dis[x];
for(int i=0;i<nt[x].size();i++)
{
gra[nt[x][i]][0]=x;
DFS(nt[x][i]);
far[x]=min(far[x],far[nt[x][i]]);
}
}
long long int read()
{
long long int f=1,x=0;
char ss=getchar();
while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}
while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}
return f*x;
}
int main()
{
freopen("return.in","r",stdin);
freopen("return.out","w",stdout);
T=read();
while(T--)
{
memset(gra,0,sizeof(gra));
for(int i=0;i<=40000;i++)
{
ls[i].clear();
nt[i].clear();
}
memset(far,0,sizeof(far));
memset(val,0,sizeof(val));
cnt=0;
n=read();
m=read();
for(int i=1;i<=m;i++)
{
a1=read();
a2=read();
a3=read();
a4=read();
t[i].x=a1;
t[i].y=a2;
t[i].a=a4;
ls[a1].push_back(make_pair(a2,a3));
ls[a2].push_back(make_pair(a1,a3));
}
for(int i=1;i<=n;i++)
{
fat[i]=i;
}
DIJ();
sort(t+1,t+1+m,Function);
cnt=n;
for(int i=1;i<=m;i++)
{
int xl=t[i].x;
int yl=t[i].y;
xl=FIND(xl);
yl=FIND(yl);
if(xl!=yl)
{
++cnt;
fat[xl]=fat[yl]=fat[cnt]=cnt;
val[cnt]=t[i].a;
nt[cnt].push_back(xl);
nt[cnt].push_back(yl);
}
}
DFS(cnt);
for(int i=1;(1<<i)<=cnt;i++)
{
for(int j=1;j<=cnt;j++)
{
gra[j][i]=gra[gra[j][i-1]][i-1];
}
}
Q=read();
K=read();
S=read();
long long int lastans=0;
while(Q--)
{
a1=read();
a2=read();
a1=(a1+K*lastans-1)%n+1;
a2=(a2+K*lastans)%(S+1);
for(int j=22;j>=0;--j)
{
if(gra[a1][j]&&val[gra[a1][j]]>a2)
{
a1=gra[a1][j];
}
}
printf("%lld\n",lastans=far[a1]);
}
}
return 0;
}