为什么这么卡?
查看原帖
为什么这么卡?
622711
ax_by_c楼主2024/3/25 17:30

前向星+fread+fwrite+特判+多次提交才卡过

为什么?

#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ll;
typedef pair<ll,int> pii;
const int N=2e5+5;
const int M=4e5+5;
namespace BIO {
	char buf[1<<20],*p1,*p2;
	inline char bgetc() {
		if(p1==p2) {
			p2=(p1=buf)+fread(buf,1,1<<20,stdin);
		}
		return (p1==p2)?EOF:*p1++;
	}
	inline ll Read() {
		register ll n=0;
		register char c=bgetc();
		while(c<'0'||'9'<c) {
			c=bgetc();
		}
		while('0'<=c&&c<='9') {
			n=n*10+c-48,c=bgetc();
		}
		return n;
	}
	short wrstk[100],wrtop;
	inline void wr(ll x) {
		if(x<0) {
			putchar('-');
			x=-x;
		}
		wrtop=0;
		do {
			wrstk[++wrtop]=x%10;
			x/=10;
		} while(x);
		while(wrtop) {
			putchar(wrstk[wrtop--]+48);
		}
	}
};
int n,m;
struct edge{
	int u,v;
	ll w;
};
edge E[M];
struct ED{
	int v;
	ll w;
	int nxt;
}e[2*M];
int ec,hd[N];
inline void add(int u,int v,ll w){
	e[++ec]={v,w,hd[u]};
	hd[u]=ec;
}
inline bool cmp(edge x,edge y){
	return x.w>y.w;
}
int u,v;
ll c,w;
int q;
ll K,S;
ll dis[N];
bool vis[N];
priority_queue<pii,vector<pii>,greater<pii>>pq;
inline void dij(int stt){
	for(int i=1;i<=n;i++){
		vis[i]=0;
		dis[i]=4e9;
	}
	pq.push({0,stt});
	dis[stt]=0;
	int u;
	while(!pq.empty()){
		u=pq.top().second;
		pq.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(int i=hd[u];i;i=e[i].nxt){
			if(dis[e[i].v]>dis[u]+e[i].w){
				dis[e[i].v]=dis[u]+e[i].w;
				pq.push({dis[e[i].v],e[i].v});
			}
		}
	}
}
int idx;
int fa[2*N];
int find(int x){
	if(fa[x]==0)return x;
	return fa[x]=find(fa[x]);
}
int tr[2*N][2];
int p[2*N];
ll res[2*N];
void dfs(int u){
	if(u<=n){
		res[u]=dis[u];
	}
	else{
		res[u]=4e9;
	}
	for(int i=0;i<=1;i++){
		if(tr[u][i]){
			dfs(tr[u][i]);
			res[u]=min(res[u],res[tr[u][i]]);
		}
	}
}
int lt[2*N][22];
inline int Qp(int u,int w){
	for(int i=20;i>=0;i--){
		if(lt[u][i]&&p[lt[u][i]]>w){
			u=lt[u][i];
		}
	}
	return u;
}
inline void slove(){
	n=BIO::Read();
	m=BIO::Read();
	ec=0;
	for(int i=1;i<=n;i++){
		hd[i]=0;
		dis[i]=0;
		vis[i]=0;
	}
	for(int i=1;i<=2*n;i++){
		res[i]=0;
		p[i]=0;
		fa[i]=0;
		tr[i][0]=0;
		tr[i][1]=0;
	}
	idx=n;
	bool sub=1;
	for(int i=1;i<=m;i++){
		u=BIO::Read();
		v=BIO::Read();
		c=BIO::Read();
		w=BIO::Read();
		E[i]={u,v,w};
		add(u,v,c);
		add(v,u,c);
		if(w!=1){
			sub=0;
		}
	}
	q=BIO::Read();
	K=BIO::Read();
	S=BIO::Read();
	dij(1);
	if(sub){
		ll lastans=0;
		for(int i=1;i<=q;i++){
			v=BIO::Read();
			w=BIO::Read();
			v=(v+K*lastans-1)%n+1;
			w=(w+K*lastans)%(S+1);
			if(w<1){
				lastans=0;
			}
			else{
				lastans=dis[v];
			}
			BIO::wr(lastans);
			putchar('\n');
		}
		return ;
	}
	sort(E+1,E+1+m,cmp);
	int fx,fy;
	for(int i=1;i<=m;i++){
		fx=find(E[i].u);
		fy=find(E[i].v);
		if(fx!=fy){
			idx++;
			tr[idx][0]=fx;
			tr[idx][1]=fy;
			fa[fx]=fa[fy]=idx;
			p[idx]=E[i].w;
		}
	}
	for(int i=1;i<=idx;i++){
		fa[i]=0;
	}
	for(int i=1;i<=idx;i++){
		for(int v=0;v<=1;v++){
			fa[tr[i][v]]=i;
		}
	}
	for(int i=idx;i>=1;i--){
		if(!res[i]){
			dfs(i);
		}
	}
	for(int i=1;i<=idx;i++){
		lt[i][0]=fa[i];
	}
	for(int j=1;j<=19;j++){
		for(int i=1;i<=idx;i++){
			lt[i][j]=lt[lt[i][j-1]][j-1];
		}
	}
	if(K==0){
		for(int i=1;i<=q;i++){
			v=BIO::Read();
			w=BIO::Read();
			BIO::wr(res[Qp(v,w)]);
			putchar('\n');
		}
	}
	else{
		ll lastans=0;
		for(int i=1;i<=q;i++){
			v=BIO::Read();
			w=BIO::Read();
			v=(v+K*lastans-1)%n+1;
			w=(w+K*lastans)%(S+1);
			lastans=res[Qp(v,w)];
			BIO::wr(lastans);
			putchar('\n');
		}
	}
}
int main(){
	int T;
	T=BIO::Read();
	while(T--){
		slove();
	}
	return 0;
}
2024/3/25 17:30
加载中...