比赛 NOIP模拟赛by mzx Day1 评测结果 EEEEEEEEEE
题目名称 零食店 最终得分 0
用户昵称 FoolMike 运行时间 1.210 s
代码语言 C++ 内存使用 7.36 MiB
提交时间 2016-10-19 20:44:32
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<queue>
  4. using namespace std;
  5. const int N=100010,maxl=1e+9+1;
  6. struct edge{
  7. int f,t,l;
  8. edge(int F=0,int T=0,int L=0){f=F;t=T;l=L;}
  9. }w[N];
  10. int n,m,q,c[N],A[N],B[N],head[N],tail[N],next[N];
  11. inline int read(){
  12. int x=0;char ch=getchar();
  13. while (ch>'9'||ch<'0') ch=getchar();
  14. while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
  15. return x;
  16. }
  17. inline bool cmp(const int x,const int y){
  18. return c[x]<c[y];
  19. }
  20. inline void add(int f,int num){
  21. if (!head[f]) head[f]=tail[f]=num;
  22. else tail[f]=next[tail[f]]=num;
  23. }
  24. queue<int> Q;
  25. int dis[N],dp[110][110][110];
  26. void spfa(int s,int C){
  27. while (!Q.empty()){
  28. int v=Q.front();Q.pop();
  29. if (c[v]>C&&v!=s) continue;
  30. for (int i=head[v];i;i=next[i])
  31. if (dis[w[i].t]>dis[v]+w[i].l)
  32. dis[w[i].t]=dis[v]+w[i].l,Q.push(w[i].t);
  33. }
  34. }
  35. int find(int x,int *A,int l,int r){//找到对应的最大点权
  36. while (l!=r){
  37. int mid=(l+r)>>1;
  38. if (A[mid+1]<=x) l=mid+1;else r=mid;
  39. }
  40. return l;
  41. }
  42. int main()
  43. {
  44. freopen("snackstore.in","r",stdin);
  45. freopen("snackstore.out","w",stdout);
  46. n=read();m=read();q=read();
  47. for (int i=1;i<=n;i++) A[i]=c[i]=read();
  48. for (int i=1;i<=m;i++){
  49. w[i].f=read();w[i].t=read();w[i].l=read();
  50. w[i+m]=w[i];
  51. swap(w[i].f,w[i].t);
  52. add(w[i].f,i);add(w[i].t,i+m);
  53. }
  54. sort(A+1,A+n+1,cmp);
  55. for (int i=1;i<=n;i++) B[i]=c[A[i]];
  56. for (int s=1;s<=n;s++){//源点为i号点
  57. for (int i=1;i<=n;i++) dis[i]=maxl;dis[s]=0;
  58. Q.push(s);//printf("S=%d\n",s);
  59. for (int j=1;j<=n;j++){//添加A[j]号点
  60. Q.push(A[j]);spfa(s,c[A[j]]);
  61. for (int i=1;i<=n;i++) dp[s][j][i]=dis[i];
  62. //printf("C<=%d ",c[A[j]]);
  63. //for (int i=1;i<=n;i++) printf("%d ",dis[i]);puts("");
  64. sort(dp[s][j]+1,dp[s][j]+n+1);
  65. }
  66. }
  67. while (q--){
  68. int s=read(),c=read(),d=read();
  69. c=find(c,B,0,n);
  70. if (!c){puts("0");continue;}
  71. int ans=find(d,dp[s][c],0,n)-1;
  72. printf("%d\n",ans);
  73. }
  74. return 0;
  75. }