提交记录 4105


用户 题目 状态 得分 用时 内存 语言 代码长度
zhaimingshuzms noi18a. 【NOI2018】归程 Runtime Error 60 4 s 145108 KB C++ 4.33 KB
提交时间 评测时间
2018-07-18 20:56:35 2020-07-31 22:27:41
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <cassert>
using namespace std;
const int N=200010,M=400010;
int ne[M<<1],k,fi[N],b[M<<1],c[M<<1],hei[M<<1];
int n,m,q,s,f[N];
void add(int x,int y,int l,int a){
	ne[++k]=fi[x]; b[fi[x]=k]=y; c[k]=l; hei[k]=a;
}
void Dijkstra(int s){
	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > pq;
	for (int i=1; i<=n; ++i) f[i]=2147483647;
	f[s]=0; pq.push(make_pair(f[s],s));
	while (!pq.empty()){
		int x=pq.top().second,y=pq.top().first; pq.pop();
		if (f[x]<y) continue;
		for (int j=fi[x]; j; j=ne[j])
		if (f[b[j]]>f[x]+c[j]){
			f[b[j]]=f[x]+c[j];
			pq.push(make_pair(f[b[j]],b[j]));
		}
	}
}
namespace Subtask1{
	bool in[N];
	int v,p;
	int bfs(int v,int p){
		for (int i=1; i<=n; ++i) in[i]=0;
		queue<int> q; q.push(v); in[v]=1;
		while (!q.empty()){
			int x=q.front(); q.pop();
			for (int j=fi[x]; j; j=ne[j])
			if (hei[j]>p&&!in[b[j]]){
				in[b[j]]=1;
				q.push(b[j]);
			}
		}
		int ret=f[v];
		for (int i=1; i<=n; ++i) if (in[i]) ret=min(ret,f[i]);
		return ret; 
	}
	void solve(){
		int lastans=0;
		for (int i=1; i<=q; ++i){
			scanf("%d%d",&v,&p);
			v=((long long)v+lastans-1)%n+1;
			p=((long long)p+lastans)%(s+1);
			printf("%d\n",(lastans=bfs(v,p)));
		}
	}
}
namespace Subtask2{
	int v[N],p[N],ans[N],id[N],id2[M],fa[N];
	bool cmp(int x,int y){
		return p[x]>p[y];
	}
	bool cmp2(int x,int y){
		return hei[x]>hei[y];
	}
	int ask(int x){
		return x==fa[x]?x:fa[x]=ask(fa[x]);
	}
	void unite(int x,int y){
		x=ask(x); y=ask(y);
		if (x==y) return;
		if (f[x]<f[y]) fa[y]=x;
		else fa[x]=y;
	}
	void solve(){
		for (int i=1; i<=q; ++i){
			scanf("%d%d",&v[i],&p[i]);
			id[i]=i;
		}
		sort(id+1,id+q+1,cmp);
		for (int i=2; i<=k; i+=2) id2[i>>1]=i;
		sort(id2+1,id2+(k>>1)+1,cmp2);
		int ne=1;
		for (int i=1; i<=n; ++i) fa[i]=i;
		for (int i=1; i<=q; ++i){
			while (ne<=k>>1&&hei[id2[ne]]>p[id[i]]){
				unite(b[id2[ne]],b[id2[ne]-1]);
				++ne;
			}
			ans[id[i]]=f[ask(v[id[i]])];
		}
		for (int i=1; i<=q; ++i) printf("%d\n",ans[i]);
	}
}
namespace Subtask3{
	#define M int mid=(l+r)>>1;
	#define L (st[ind].l,l,mid)
	#define R (st[ind].r,mid+1,r)
	int fa[N],sz[N],id[N],root[N],pos,now,v,p,tot,cp;
	struct node{
		int f,l,r;
	}st[N*100];//care
	bool cmp(int x,int y){
		return hei[x]>hei[y];
	}
	bool cmp2(int x,int y){
		return x>y;
	}
	int ask(int ind,int l,int r){
		if (l==r) return st[ind].f;
		M;
		return pos<=mid?ask L:ask R;
	}
	int finds(int x){
		pos=x;
		int t=ask(root[now],1,n);
//		cerr<<"fins"<<t<<endl;
		return t<=0?-t:finds(t);
	}
	int df(int v,int p){
		now=lower_bound(id+1,id+(k>>1)+1,p,cmp2)-id-1;
//		cerr<<"now"<<now<<endl;
		return finds(v);
	}
	void modify(int &ind,int l,int r){
		if (tot+1==N*100) assert(0);
		st[ind=++tot]=st[cp];
//		cerr<<"modify"<<ind<<" "<<cp<<" "<<l<<" "<<r<<endl;
		if (l==r){
			st[ind].f=v;
			return;
		}
		M;
		pos<=mid?(cp=st[cp].l,modify L):(cp=st[cp].r,modify R);
	}
	int find(int x){
		return fa[x]<=0?x:find(fa[x]);
	}
	void fake(int x,int y,int i){
		x=find(x); y=find(y);
		if (x==y){
			root[i]=root[i-1];
			return;
		} 
		if (sz[x]<sz[y]) swap(x,y);
		fa[x]=max(fa[x],fa[y]);
		fa[y]=x;
		v=fa[y]; pos=y; cp=root[i-1];
		modify(root[i],1,n);
		v=fa[x]; pos=x; cp=root[i];
		modify(root[i],1,n);
		sz[x]+=sz[y];
//		for (int i=1; i<=n;++i) cerr<<fa[i]<<" ";
	}
	void prework(){
		for (int i=1; i<=tot; ++i) st[i].f=st[i].l=st[i].r=0;
		tot=0;
		for (int i=1; i<=n; ++i){
			fa[i]=-f[i]; 
			v=fa[i]; pos=i; cp=root[0];
			modify(root[0],1,n);
			sz[i]=1;
		}
		for (int i=2; i<=k; i+=2) id[i>>1]=i;
		sort(id+1,id+(k>>1)+1,cmp);
		for (int i=1; i<=(k>>1); ++i) fake(b[id[i]],b[id[i]-1],i);
		for (int i=1; i<=(k>>1); ++i) id[i]=hei[id[i]];
	}
	void solve(int k){
		prework();
		int lastans=0;
		for (int i=1; i<=q; ++i){
			scanf("%d%d",&v,&p);
			v=((long long)v+k*lastans-1)%n+1;
			p=((long long)p+k*lastans)%(s+1);
			printf("%d\n",(lastans=df(v,p)));
		}
	}
}
int main(){
	freopen("return.in","r",stdin); 
	freopen("return.out","w",stdout);
	int t;
	scanf("%d",&t);
	while (t--){
		scanf("%d%d",&n,&m);
		for (int i=1; i<=n; ++i) fi[i]=0; k=0;
		for (int i=1; i<=m; ++i){
			int x,y,l,a;
			scanf("%d%d%d%d",&x,&y,&l,&a);
			add(x,y,l,a); add(y,x,l,a);
		}
		Dijkstra(1);
		int k;
		scanf("%d%d%d",&q,&k,&s);
		
		/*if (k==1&&n>1500) Subtask3::solve();
		else*/ 
		//if (k==1) 
		Subtask3::solve(k);
		//else Subtask2::solve();
	}
} 

CompilationN/AN/ACompile OKScore: N/A

Testcase #115.77 us52 KBAcceptedScore: 5

Testcase #247.45 us68 KBAcceptedScore: 5

Testcase #3212.19 us96 KBAcceptedScore: 5

Testcase #4371.64 us120 KBAcceptedScore: 5

Testcase #55.001 ms896 KBAcceptedScore: 5

Testcase #62.486 s98 MB + 156 KBRuntime ErrorScore: 0

Testcase #74.204 ms804 KBAcceptedScore: 5

Testcase #84.157 ms808 KBAcceptedScore: 5

Testcase #94.175 ms804 KBAcceptedScore: 5

Testcase #101.078 s141 MB + 720 KBAcceptedScore: 5

Testcase #111.075 s141 MB + 724 KBAcceptedScore: 5

Testcase #124 s94 MB + 700 KBTime Limit ExceededScore: 0

Testcase #134 s94 MB + 712 KBTime Limit ExceededScore: 0

Testcase #144 s94 MB + 692 KBTime Limit ExceededScore: 0

Testcase #155.996 ms892 KBAcceptedScore: 5

Testcase #166.03 ms892 KBAcceptedScore: 5

Testcase #174 s94 MB + 896 KBTime Limit ExceededScore: 0

Testcase #184 s94 MB + 628 KBTime Limit ExceededScore: 0

Testcase #194 s94 MB + 852 KBTime Limit ExceededScore: 0

Testcase #204 s94 MB + 796 KBTime Limit ExceededScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-14 02:51:46 | Loaded in 2 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠