下发的5个样例都能过,但是45pts求调
查看原帖
下发的5个样例都能过,但是45pts求调
477821
toolong114514楼主2024/8/12 21:28

rt,WA on #5~#6,#15~16,TLE on #12~14,#17~20

#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define int long long
const int INF=0x7fffffff;
const int N=5e6+10;
struct node{
	int to,nxt,val;
}edge[N];
int head[N];
int cnt1;
void add(int u,int v,int w){
	edge[++cnt1]={v,head[u],w};
	head[u]=cnt1;
}
struct ccf{
	int pos,val;
	friend bool operator<(ccf pre,ccf nxt){
		return pre.val>nxt.val;
	}
};
int n,m,k,ss,cnt2,lst,Q;
priority_queue<ccf> q;
int dis[N];
void dij(){
	for(int i=1;i<=n;i++){
		dis[i]=INF;
	}
	q.push({1,0});
	while(!q.empty()){
		ccf now=q.top();
		q.pop();
		//cout<<"pos:"<<now.pos<<endl;
		if(now.val>=dis[now.pos]) continue;
		dis[now.pos]=now.val;
		for(int i=head[now.pos];i!=-1;i=edge[i].nxt){
			if(dis[edge[i].to]>now.val+edge[i].val){
				q.push({edge[i].to,now.val+edge[i].val});
			}
		}
	}
}
int fa[N];
int find(int x){
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
}
void connect(int x,int y){
	fa[find(x)]=find(y);
}
struct zyhlqr{
	int ls,rs,fa,minn,val;
}p[N];
int pfind(int x){
	if(p[x].fa==x) return x;
	else return p[x].fa=pfind(p[x].fa); 
}
int st[N][20];
void dfs(int x){
	if(!p[x].ls&&!p[x].rs) return;
	dfs(p[x].ls),dfs(p[x].rs);
	p[x].minn=min(p[p[x].ls].minn,p[p[x].rs].minn);
}
void build_st(){
	for(int j=1;j<19;j++){
		for(int i=1;i<=cnt2;i++){
			st[i][j]=st[st[i][j-1]][j-1];
		}
	}
}
struct xld{
	int p1,p2,val;
}ipt[N];
bool cmp(xld pre,xld nxt){
	return pre.val>nxt.val;
}
int t;
int ask(int x,int y){
	for(int j=18;j>=0;j--){
		if(p[st[x][j]].val>y) x=st[x][j];
	}
	return p[x].minn;
}
signed main(){
//	freopen("return5.in","r",stdin);
//	freopen("return5.out","w",stdout);
	ios::sync_with_stdio(false);
	cin>>t;
	while(t--){
		memset(head,-1,sizeof(head));
		cnt1=0;
		cin>>n>>m;
		cnt2=n;
		for(int i=1;i<=m;i++){
			int uu,vv,ww1,ww2;
			cin>>uu>>vv>>ww1>>ww2;
			add(uu,vv,ww1);add(vv,uu,ww1);
			ipt[i]={uu,vv,ww2};
		}
		sort(ipt+1,ipt+m+1,cmp);
		dij();
//		cout<<"dis:\n";
		for(int i=1;i<=n;i++){
			fa[i]=i;p[i].fa=i;
			p[i].minn=dis[i];
//			cout<<dis[i]<<" ";
		}
//		cout<<endl;
		for(int i=1;i<=m;i++){
			if(find(ipt[i].p1)!=find(ipt[i].p2)){
				int uu=pfind(ipt[i].p1),vv=pfind(ipt[i].p2);
				cnt2++;
				p[cnt2].fa=cnt2;
				p[cnt2].minn=INF;
				p[cnt2].ls=uu,p[cnt2].rs=vv;
				p[uu].fa=p[vv].fa=st[uu][0]=st[vv][0]=cnt2;
				p[cnt2].val=ipt[i].val;
				connect(ipt[i].p1,ipt[i].p2);
			}
		}
//		for(int i=1;i<=cnt2;i++){
//			cout<<i<<":"<<p[i].ls<<" "<<p[i].rs<<endl;
//		}
		dfs(cnt2); 
		build_st();
		cin>>Q>>k>>ss;
		lst=0;
		while(Q--){
			int vv,pp;
			cin>>vv>>pp;
			vv=(vv+k*lst-1)%n+1;
			pp=(pp+k*lst)%(ss+1);
			//cout<<"ask:"<<vv<<" "<<pp<<endl;
			lst=ask(vv,pp);
			cout<<lst<<'\n';
		}
	}
	return 0;
}
2024/8/12 21:28
加载中...