比赛 NOIP模拟赛by mzx Day1 评测结果 EEEEEEEEEE
题目名称 零食店 最终得分 0
用户昵称 FoolMike 运行时间 1.210 s
代码语言 C++ 内存使用 7.36 MiB
提交时间 2016-10-19 20:44:32
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int N=100010,maxl=1e+9+1;
struct edge{
	int f,t,l;
	edge(int F=0,int T=0,int L=0){f=F;t=T;l=L;}
}w[N];
int n,m,q,c[N],A[N],B[N],head[N],tail[N],next[N];
inline int read(){
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}
inline bool cmp(const int x,const int y){
	return c[x]<c[y];
}
inline void add(int f,int num){
	if (!head[f]) head[f]=tail[f]=num;
		else tail[f]=next[tail[f]]=num;
}
queue<int> Q;
int dis[N],dp[110][110][110];
void spfa(int s,int C){
	while (!Q.empty()){
		int v=Q.front();Q.pop();
		if (c[v]>C&&v!=s) continue;
		for (int i=head[v];i;i=next[i])
		if (dis[w[i].t]>dis[v]+w[i].l)
			dis[w[i].t]=dis[v]+w[i].l,Q.push(w[i].t);
	}
}
int find(int x,int *A,int l,int r){//找到对应的最大点权 
	while (l!=r){
		int mid=(l+r)>>1;
		if (A[mid+1]<=x) l=mid+1;else r=mid;
	}
	return l;
}
int main()
{
	freopen("snackstore.in","r",stdin);
	freopen("snackstore.out","w",stdout);
	n=read();m=read();q=read();
	for (int i=1;i<=n;i++) A[i]=c[i]=read();
	for (int i=1;i<=m;i++){
		w[i].f=read();w[i].t=read();w[i].l=read();
		w[i+m]=w[i];
		swap(w[i].f,w[i].t);
		add(w[i].f,i);add(w[i].t,i+m);
	}
	sort(A+1,A+n+1,cmp);
	for (int i=1;i<=n;i++) B[i]=c[A[i]];
	for (int s=1;s<=n;s++){//源点为i号点 
		for (int i=1;i<=n;i++) dis[i]=maxl;dis[s]=0;
		Q.push(s);//printf("S=%d\n",s);
		for (int j=1;j<=n;j++){//添加A[j]号点 
			Q.push(A[j]);spfa(s,c[A[j]]);
			for (int i=1;i<=n;i++) dp[s][j][i]=dis[i];
			//printf("C<=%d ",c[A[j]]);
			//for (int i=1;i<=n;i++) printf("%d ",dis[i]);puts("");
			sort(dp[s][j]+1,dp[s][j]+n+1);
		}
	}
	while (q--){
		int s=read(),c=read(),d=read();
		c=find(c,B,0,n);
		if (!c){puts("0");continue;}
		int ans=find(d,dp[s][c],0,n)-1;
		printf("%d\n",ans);
	}
	return 0;
}