k’th number
#include<cstdio>
#include<ALGORITHM>
using namespace std;
int n,m;long long k,ans;
int a[299999],b[299999];
long long check(long long x){
int j=m;long long s=0;
for(int i=1;i<=n;i++)
{
while(1ll*a[i]*b[j]>x&&j>=1) j--;
s+=j;
}
return s;
}
int main(){
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
scanf("%d%d%lld",&n,&m,&k);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++)scanf("%d",&b[i]);
sort(a+1,a+n+1);
sort(b+1,b+m+1);
long long l=1ll*a[1]*b[1],r=1ll*a[n]*b[m];
while(l<=r){
long long mid=(l+r)>>1;
long long w=check(mid);
if(w>=k) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%lld",l);
}
spfa
#include<cstdio>
#include<ALGORITHM>
#include<queue>
using namespace std;
int n,m;
int dis[299999],tot,nex[299999],head[299999],vis[299999],a[299999];
struct st{
int x,y;
}to[299999];
void add(int x,int b,int c){
tot++;
to[tot].x=b;
to[tot].y=c;
nex[tot]=head[x];
head[x]=tot;
}
queue <int> q;
int spfa(){
for(int i=1;i<=n;i++)
q.push(i),vis[i]=1;
while(!q.empty()){
int x=q.front();
q.pop();vis[x]=0;
for(int i=head[x];i;i=nex[i]){
int b=to[i].x;
int c=to[i].y;
if(dis[b]>=dis[x]+dis[c]){
dis[b]=dis[x]+dis[c];
if(!vis[b]){
q.push(b);
vis[b]=1;
}
}
}
}
}
int main(){
freopen("dwarf.in","r",stdin);
freopen("dwarf.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
dis[i]=a[i];
}
for(int i=1;i<=m;i++){
int f,b,c;
scanf("%d%d%d",&f,&b,&c);
add(b,f,c);
add(c,f,b);
}
spfa();
printf("%d ",dis[1]);
}