小糖人全RE求条
查看原帖
小糖人全RE求条
418233
ftjzg001楼主2025/8/3 19:01
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=1E6+10;
struct node
{
	int st,en,l,h;
	node(){st=en=l=h=0;}
	node(int x,int y,int a,int z){st=x;en=y;l=a;h=z;}
}a[N];
struct data
{
	int bh,net,l,h;
	data(){bh=net=l=h=0;}
	data(int x,int y,int a,int z){bh=x;net=y;l=a;h=z;}
}b[N],c[N],tr[N];
int cnt,h[N],deep[N],fa[N/10][20],h2[N],cntt;
int insert(int x,int y,int z,int p)
{
	b[++cnt]=data(y,h[x],z,p);
	h[x]=cnt;
}
int insert2(int x,int y,int z,int p)
{
	tr[++cntt]=data(y,h2[x],z,p);
	h2[x]=cntt;
}
int f[N],d[N];
int find(int x)
{
	if(f[x]!=x) f[x]=find(f[x]);
	return f[x];
}
bool vis[N];
int t,n,m,q,k,s,lastans=0,v,p,point;
void dij(int st)
{
	memset(d,0x3f3f3f3f,sizeof(d));
	memset(vis,0,sizeof(vis));
	d[st]=0;
	priority_queue<PII,vector<PII>,greater<PII> >he;
	he.push({0,st});
	while(!he.empty())
	{
		PII k=he.top();
		int dis=k.first,bh=k.second;
		he.pop();
		if(vis[bh]) continue;
		vis[bh]=1;
		for(int i=h2[bh];i!=0;i=tr[i].net)
		{
			int j=tr[i].bh;
			if(d[j]>dis+tr[i].l)
			{
				d[j]=dis+tr[i].l;
				he.push({d[j],j});
			}
		}
	}
	for(int i=1;i<=n;i++) c[i].l=d[i];
}
bool cmp(node a,node b) { return a.h>b.h; }
void EX_kruskal()
{
	for(int i=1;i<=m;i++)
	{
		int fx=find(a[i].st),fy=find(a[i].en);
		if(fx!=fy)
		{
			point++;
			f[fx]=f[fy]=point;
			insert(fx,point,0,a[i].h);
			insert(point,fx,0,a[i].h);
			insert(point,fy,0,a[i].h);
			insert(fy,point,0,a[i].h);
    		c[point].h=a[i].h;
			c[point].l=min(c[fx].l,c[fy].l);
			if(point==2*n-1) return;
		}
	}
}
void dfs(int now,int father)
{
	deep[now]=deep[father]+1;fa[now][0]=father;
	for(int i=1;i<=19;i++) fa[now][i]=fa[fa[now][i-1]][i-1];
	for(int i=h[now];i!=0;i=b[i].net)
	{
		int j=b[i].bh;
		if(j!=father)
		{
			dfs(j,now);
			if(now>n) c[now].l=min(c[j].l,c[now].l);
		}
	}
}
int query(int x,int y)
{
	for(int i=19;i>=0;i--) if(deep[x]-(1<<i)>0&&c[fa[x][i]].h>y) x=fa[x][i];
	return c[x].l;
}
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		memset(h,0,sizeof(h));
		memset(h2,0,sizeof(h2));
		for(int i=1;i<=2*n;i++) a[i]=node(0,0,0,0);
		for(int i=1;i<=cnt;i++) b[i]=data(0,0,0,0),c[i]=data(0,0,0,0);
		for(int i=1;i<=cntt;i++) c[i]=data(0,0,0,0),tr[i]=data(0,0,0,0);
		cnt=cntt=0;
		for(int i=1;i<=2*n;i++) f[i]=i;
		for(int i=1;i<=2*n;i++) c[i].l=0x3f3f3f3f; 
		point=n;
		for(int i=1;i<=m;i++)
		{
			cin>>a[i].st>>a[i].en>>a[i].l>>a[i].h;
			insert2(a[i].st,a[i].en,a[i].l,a[i].h);
			insert2(a[i].en,a[i].st,a[i].l,a[i].h);
		}
		sort(a+1,a+m+1,cmp);
		dij(1);
		EX_kruskal();
		dfs(point,0);
		cin>>q>>k>>s;
		for(int i=1;i<=q;i++)
		{
			cin>>v>>p;
			v=(v+k*lastans-1)%n+1;
			p=(p+k*lastans)%(s+1);
			lastans=query(v,p);
			cout<<lastans<<endl;
		}
	}
	return 0;
}
2025/8/3 19:01
加载中...