比赛 |
NOIP模拟赛by mzx Day1 |
评测结果 |
AAAAAAAAAA |
题目名称 |
零食店 |
最终得分 |
100 |
用户昵称 |
前鬼后鬼的守护 |
运行时间 |
2.658 s |
代码语言 |
C++ |
内存使用 |
4.74 MiB |
提交时间 |
2016-10-21 10:09:03 |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#define FILE "snackstore"
namespace IO{
char buf[1<<15],*fs,*ft;
inline char gc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
inline int read(){
int x=0,ch=gc();
while(ch<'0'||ch>'9')ch=gc();
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=gc();
return x;
}
}using namespace IO;
const int MAXN(105);
int n,m,q,pow[MAXN],dis[MAXN][MAXN][MAXN];
struct vertex{
int x,p;
}v[MAXN];
inline bool operator<(const vertex& u,const vertex& v){
return u.p<v.p;
}
void init(){
n=read(),m=read(),q=read();
for(int i=1;i<=n;i++)
v[i].x=i,v[i].p=read();
std::sort(v+1,v+n+1);
for(int i=1;i<=n;i++)
pow[i]=v[i].p;
for(int k=0;k<=n+1;k++)
for(int i=1;i<=n+1;i++)
for(int j=1;j<=n+1;j++)
dis[k][i][j]=int(1e9)+1;
for(int i=1;i<=n;i++)
dis[0][i][i]=0;
for(int i=1;i<=m;i++){
int x=read(),y=read(),l=read();
if(l<dis[0][x][y])
dis[0][x][y]=dis[0][y][x]=l;
}
}
inline int rand32(){return ((rand()&1)<<30)|(rand()<<15)|rand();}
inline int rand(int l,int r){if(r<l)return l;return l+rand32()%(r-l+1);}
void floyd(){
for(int k=1;k<=n;k++){
memcpy(dis[k],dis[k-1],sizeof dis[k]);
#define d(x,y) dis[k][x][y]
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(d(i,v[k].x)+d(v[k].x,j)<d(i,j))
d(i,j)=d(i,v[k].x)+d(v[k].x,j);
}
for(int k=0;k<=n;k++)
for(int i=1;i<=n;i++)
std::sort(dis[k][i]+1,dis[k][i]+n+1);
}
int binary(int* a,int k){
int left=0,right=n;
while(left!=right){
int mid=left+right;
mid=(mid&1)+(mid>>1);
if(a[mid]>k)right=mid-1;
else left=mid;
}
return left;
}
void solve(){
for(int Case=1;Case<=q;Case++){
int i=read(),mxp=read(),mxd=read();
printf("%d\n",binary(dis[binary(pow,mxp)][i],mxd)-1);
}
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
init();
floyd();
solve();
return 0;
}