55pts求助,第五个大佯例过不了
查看原帖
55pts求助,第五个大佯例过不了
521283
wangif424楼主2023/10/1 10:14
#include <bits/stdc++.h>
#define R(x) x = read()
#define ENDL push('\n');
#define SPACE push(' ');
#define int long long
#define mp make_pair
using namespace std;
char pbuf[1<<20], *pp=pbuf;
inline void push(const char &c) {
	if(pp - pbuf == 1<<20)fwrite(pbuf, 1, 1<<20, stdout),pp = pbuf;
	*pp++ = c;
}
class io {public:~io() {fwrite(pbuf, 1, pp - pbuf, stdout);}} _;
inline void write(int x) {
	if (x<0)x=-x,push('-');
	int sta[35],top=0;
	do {
		sta[top++]=x%10,x/=10;
	} while (x);
	while(top)push(sta[--top]^'0');
}
#ifdef LOCAL
	inline int read() {
		int r=0,f=1;
		char c=getchar();
		while(c>'9'||c<'0') {
			if(c=='-')f=0;
			c=getchar();
		}
		while(c>='0'&&c<='9')r=(r<<3)+(r<<1)+(c^'0'),c=getchar();
		return f?r:(-r);
	}
#else
	char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
	#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
	inline int read() {
	    int x=0,f=1;char ch=getchar();
	    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	    while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
	    return x*f;
	}
#endif
int t,n,m,Q,k,s;
struct b{
	int u,v,l,a;
}e[800100];
struct edge{
	int to,nxt,l,a;
}v[1600100];
int len,fir[800100];
int a[800100];
void add(int x,int y,int l,int a){
	++len;
	v[len].to=y;
	v[len].nxt=fir[x];
	v[len].l=l;
	v[len].a=a;
	fir[x]=len;
}
int f[800100];
int find(int x){
	while(x^f[x])x=f[x]=f[f[x]];
	return x;
}
int mrg(int x,int y){
	x=find(x);
	y=find(y);
	if(x==y)return 0;
	f[x]=y;
	return 1;
}
int dis[800100],vis[800100];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
int lans,cnt;
int mi[800100],fa[800100][30];
void dfs(int u,int f){
	mi[u]=dis[u];
	for(int i=fir[u];i;i=v[i].nxt){
		if(v[i].to==f)continue;
		fa[v[i].to][0]=u;
		dfs(v[i].to,u);
		mi[u]=min(mi[u],mi[v[i].to]);
	}
}

void dij(){
	memset(vis,0,sizeof(vis));
	memset(dis,0x3f3f3f3f,sizeof(dis));
	int s=1;
	dis[1]=0;
	q.push(mp(0,1));
	while(!q.empty()){
		int s=q.top().second;
		q.pop();
		if(vis[s])continue;
		vis[s]=1;
		for(int i=fir[s];i;i=v[i].nxt){
			if(dis[v[i].to]>dis[s]+v[i].l){
				dis[v[i].to]=dis[s]+v[i].l;
				q.push(mp(dis[v[i].to],v[i].to));
			}
		}
	}
}
signed main(){
	freopen("return5.in","r",stdin);
	freopen("return3.out","w",stdout);
	R(t);
	while(t--){
		len=lans=0;
		memset(fir,0,sizeof(fir));
		R(cnt=n);R(m);
		for(int i=1;i<=m;i++){
			R(e[i].u);
			R(e[i].v);
			R(e[i].l);
			R(e[i].a);
			add(e[i].u,e[i].v,e[i].l,e[i].a);
			add(e[i].v,e[i].u,e[i].l,e[i].a);
		}
		dij();
		len=0;
		memset(fir,0,sizeof(fir));
		sort(e+1,e+1+n,[](b x,b y){
			return x.a>y.a;
		});
		for(int i=1;i<=n+n;i++)f[i]=i;
		for(int i=1;i<=m;i++){
			if(find(e[i].v)^find(e[i].u)){
				a[++cnt]=e[i].a;
				add(cnt,find(e[i].v),0,e[i].a);
				add(cnt,find(e[i].u),0,e[i].a);
				add(find(e[i].v),cnt,0,e[i].a);
				add(find(e[i].u),cnt,0,e[i].a);
				mrg(e[i].u,cnt);
				mrg(e[i].v,cnt);
			}
		}
		dfs(cnt,0);
		for(int j=1;j<=25;j++){
			for(int i=1;i<=cnt;i++){
				fa[i][j]=fa[fa[i][j-1]][j-1];
			}
		}
		R(Q);R(k);R(s);
		while(Q--){
			int v0,p0;
			R(v0);R(p0);
			v0=(v0+lans*k-1)%n+1;
			p0=(p0+lans*k)%(s+1);
			for(int i=25;i>=0;i--){
				if(fa[v0][i]&&a[fa[v0][i]]>p0){
					v0=fa[v0][i];
				}
			}
			lans=mi[v0];
			write(lans);
			ENDL
		}
	}
    return 0;
}

2023/10/1 10:14
加载中...