比赛 |
CSP2023-S模拟赛 |
评测结果 |
TTTTTTTTTTTTTTTTTTTT |
题目名称 |
坡伊踹 |
最终得分 |
0 |
用户昵称 |
HXF |
运行时间 |
60.000 s |
代码语言 |
C++ |
内存使用 |
23.47 MiB |
提交时间 |
2023-10-17 20:07:51 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,xun,idx,bsz,bcnt,idxx;
int head[N],nxt[2*N],ver[2*N],fa[N],daone[N],bl[N],br[N],bel[N],xiao[N];
bool dabiao1,dabiao2;
bool mk[N];
long long minn;
long long val[2*N],dis[2*N],a[N],sum[N];
struct node{
int dian,zhi;
};
priority_queue <node> q;
bool operator < (const node &x,const node &y){
return x.zhi>y.zhi;
}
inline int read(){
int t=0,f=1;
register char c=getchar();
while(c<48||c>57) f=(c=='-')?(-1):(f),c=getchar();
while(c>=48&&c<=57) t=(t<<3)+(t<<1)+(c^48),c=getchar();
return t*f;
}
inline long long readl(){
long long t=0,f=1;
register char c=getchar();
while(c<48||c>57) f=(c=='-')?(-1):(f),c=getchar();
while(c>=48&&c<=57) t=(t<<3)+(t<<1)+(c^48),c=getchar();
return t*f;
}
void add(int u,int v,long long w){
nxt[++idx]=head[u];
head[u]=idx;
ver[idx]=v;
val[idx]=w;
}
void dijkstra(int st){
memset(mk,0,sizeof(mk));
for(int i=1;i<=n;i++) dis[i]=(long long)(1e12);
dis[st]=0;
q.push((node){st,dis[st]});
while(q.size()){
node t=q.top();q.pop();
if(mk[t.dian]) continue;
mk[t.dian]=true;
// cout<<"dian:"<<t.dian<<endl;
for(int i=head[t.dian];i;i=nxt[i]){
int dao=ver[i];
if(dis[dao]>dis[t.dian]+val[i]){
// cout<<"dao:"<<dao<<" ";
dis[dao]=dis[t.dian]+val[i];
fa[dao]=t.dian;
q.push((node){dao,dis[dao]});
}
}
// cout<<endl;
}
}
long long minl(long long a,long long b){return (a>b)?(b):(a);}
long long maxl(long long a,long long b){return (a>b)?(a):(b);}
void init(){
bsz=sqrt(n),bcnt=ceil((double)(n)/(double)(bsz));
for(int i=1;i<=bcnt;i++){
bl[i]=(i-1)*bsz+1,br[i]=i*bsz,sum[i]=(long long)(1e12);
for(int j=bl[i];j<=br[i];j++){
sum[i]=minl(sum[i],a[j]);
bel[j]=i;
}
}
}
int erfen(int ll,int rr){
bool xiada=false;
if(ll>rr) {swap(ll,rr);xiada=true;}
// cout<<ll<<" "<<rr<<endl;
int l=1,r=idxx,mid;
while(l<r){
mid=(l+r+((xiada)?(1):(0)))/2;
if(xiao[mid]<ll) l=mid+1;
else if(xiao[mid]>rr) r=mid-1;
else if(xiada) l=mid;
else r=mid;
// cout<<mid<<endl;
}
if(xiao[l]>=ll&&xiao[l]<=rr) return xiao[l];
return 0;
}
int main(){
freopen("poitry.in.in","r",stdin);
freopen("poitry.in.out","w",stdout);
dabiao1=true,dabiao2=true;
n=read(),xun=read();
for(int i=1;i<=n;i++) a[i]=read();
init();
for(int i=1;i<n;i++){
int x=read(),y=read();
if(x!=1) dabiao1=false;
if(y!=x+1) dabiao2=false;
long long z=readl();
add(x,y,z),add(y,x,z);
}
if(dabiao1){
// cout<<"YES"<<endl;
for(int i=head[1];i;i=nxt[i]){
daone[ver[i]]=val[i];
}
// for(int i=1;i<=n;i++) cout<<daone[i]<<" ";
// cout<<endl;
while(xun--){
int x=read(),y=read();
printf("%lld\n",minl(maxl(a[1],daone[x]),minl(a[x],maxl((long long)(daone[x]+daone[y]),a[y]))));
}
return 0;
}
if(dabiao2){
// cout<<"Yess"<<endl;
dijkstra(1);
for(int i=1;i<=n;i++){
if(a[i]<=dis[i]) xiao[++idxx]=i;
}
while(xun--){
long long minn=(long long)(1e12);
int x=read(),y=read();
idxx=0;
for(int i=min(x,y);i<=max(x,y);i++){
if(a[i]<labs(dis[i]-dis[x])) xiao[++idxx]=i;
}
int zai=erfen(x,y);
// cout<<zai<<endl;
if(zai){
if(zai<x) x=zai+1,y=x;
else y=zai-1;
if(bel[x]!=bel[y]){
for(int i=x;i<=br[bel[x]];i++) minn=min(minn,a[i]);
for(int i=bel[x]+1;i<=bel[y]-1;i++) minn=min(minn,sum[i]);
for(int i=bl[bel[y]];i<=y;i++) minn=min(minn,a[i]);
}else{
for(int i=x;i<=y;i++) minn=min(minn,a[i]);
}
// cout<<minn<<" "<<dis[zai]<<endl;
long long dang=labs(dis[zai]-dis[x]);
if(minn<dang) printf("%lld\n",minn);
else printf("%lld\n",dang);
continue;
}
for(int i=x;i<=br[bel[x]];i++) minn=min(minn,a[i]);
for(int i=bel[x]+1;i<=bel[y]-1;i++) minn=min(minn,sum[i]);
for(int i=bl[bel[y]];i<=y;i++) minn=min(minn,a[i]);
printf("%lld\n",minn);
}
}
// for(int i=1;i<=n;i++){
// cout<<"i:"<<i<<endl;
// for(int j=head[i];j;j=nxt[j]){
// cout<<"dao:"<<ver[j]<<" val[j]"<<val[j]<<endl;
// }
// cout<<endl;
// }
while(xun--){
// cout<<"YES"<<endl;
int u=read(),v=read();
if(u==v) {printf("%lld\n",a[u]);continue;}
dijkstra(u);
// cout<<endl;
// for(int i=1;i<=n;i++) cout<<fa[i]<<" ";
// cout<<endl;
// for(int i=1;i<=n;i++) cout<<dis[i]<<" ";
minn=(long long)(1e12);
while(1){
minn=minl(minn,maxl(dis[v],a[v]));
if(v==u) break;
// if(a[v]<=dis[v]){minn=dis[v];break;}
v=fa[v];
}
printf("%lld\n",minn);
}
return 0;
}