蒟蒻求助
查看原帖
蒟蒻求助
101042
zhz小蒟蒻楼主2020/8/15 09:37

不知道为什么第 66 个点 WA 和 121213131414 MLEMLE

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define N 200011
#define M 400011
#define inf 1<<30
#define ll long long
using namespace std;
struct Tool
{
	int x;
	int y;
	int z;
}tool[N+M];
struct Que
{
	int data;
	int rank;
	friend bool operator <(const Que x,const Que y)
	{
		return x.data>y.data;
	}
};
struct Node
{
	int t;
	int val;
	int next;
}node[M];
priority_queue<Que>q;
int head[N+M],d[N+M],mi[N+M],book[N+M],f[N+M],fa[N+M][23],val[N+M],dep[N+M],tot=0,sz=0,n,m;
inline int read()
{
	char ch=getchar();
	int f=0;
	while(ch<'0' || ch>'9') ch=getchar();
	while(ch>='0' && ch<='9')
	{
		f=f*10+ch-'0';
		ch=getchar();
	}
	return f;
}
bool cmp1(Tool x,Tool y)
{
	return x.z>y.z;
}
void init()
{
	for(int i=1;i<=n;++i) f[i]=i;
	return;
}
int getf(int v){return f[v]==v?v:f[v]=getf(f[v]);}
void add(int x,int y,int z)
{
	node[++tot].t=y;
	node[tot].val=z;
	node[tot].next=head[x];
	head[x]=tot;
	return;
}
void dfs(int u,int fath)
{
	mi[u]=d[u]; dep[u]=dep[fath]+1;
	fa[u][0]=fath;
	for(int i=1;(1<<i)<=dep[u];++i) fa[u][i]=fa[fa[u][i-1]][i-1];
	for(int i=head[u];i;i=node[i].next)
	{
		int v=node[i].t;
		if(v==fath) continue;
		dfs(v,u);
		mi[u]=min(mi[u],mi[v]);
	}
}
int LCA(int x,int y)
{
	for(int i=22;i>=0;--i)
		if(val[fa[x][i]]>y)
			x=fa[x][i];
	return x;
}
int main()
{
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
	int T,ans=0;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d %d",&n,&m);
		tot=0;
		sz=n; ans=0;
		memset(d,0x3f,sizeof(d));
		memset(mi,0x3f,sizeof(mi));
		for(int i=1;i<=n+m+10;++i)
		{
			dep[i]=head[i]=book[i]=tool[i].x=tool[i].y=tool[i].z=0;
		}
		for(int i=1;i<=m;++i)
		{
			int u,v,l,axx;
			scanf("%d %d %d %d",&u,&v,&l,&axx);
			tool[i].x=u;tool[i].y=v;tool[i].z=axx;
			add(u,v,l);add(v,u,l);
		}
		d[1]=d[0]=0;book[1]=1;
		q.push((Que){0,1});
		while(!q.empty())
		{
			Que qs=q.top();
			q.pop();
			book[qs.rank]=1;
			int u=qs.rank;
			for(int i=head[u];i;i=node[i].next)
			{
				int v=node[i].t;
				if(d[v]>d[u]+node[i].val)
				{
					d[v]=d[u]+node[i].val;
					if(!book[v]) q.push((Que){d[v],v});
				}
			}
		}
		/*for(int i=1;i<=n;++i) printf("%d ",d[i]);
		cout<<endl;*/
		int Q,K,S;
		scanf("%d %d %d",&Q,&K,&S);
		sort(tool+1,tool+m+1,cmp1);
		init();
		memset(head,0,sizeof(head));
		memset(fa,0,sizeof(fa));
		tot=0;
		for(int i=1;i<=m;++i)
		{
			int x=tool[i].x,y=tool[i].y;
			int t1=getf(x),t2=getf(y);
			if(t2!=t1)
			{
				++sz;
				f[t1]=f[t2]=f[sz]=sz;
				add(sz,t1,0); add(sz,t2,0);
				val[sz]=tool[i].z; d[sz]=inf;
			}
		}
		dfs(sz,0);
		for(int i=1;i<=Q;++i)
		{
			int V,P;
			scanf("%d %d",&V,&P);
			V=(V+K*ans-1)%n+1;
			P=(P+K*ans)%(S+1);
			ll ans_step=LCA(V,P);
			ans=mi[ans_step];
			printf("%lld\n",ans);
		}
	}
	return 0;
}
2020/8/15 09:37
加载中...