Submission #901637

#TimeUsernameProblemLanguageResultExecution timeMemory
901637alexander707070Reconstruction Project (JOI22_reconstruction)C++14
100 / 100
1460 ms68412 KiB
#include<bits/stdc++.h> #define MAXN 1000007 using namespace std; const int inf=1e9; struct edge{ int from,to,cost; }; int n,m,a,b,c,pt,q,pos,l,r,mid,lt,rt; int dsu[MAXN],sz[MAXN]; int mins[MAXN],maxs[MAXN]; long long incr[MAXN],sum,ans[MAXN],mult[MAXN],t,x[MAXN]; edge e[MAXN]; bool cmp(edge fr,edge sc){ return fr.cost<sc.cost; } void reset_dsu(){ for(int i=1;i<=n;i++){ dsu[i]=i; sz[i]=1; } } int root(int x){ if(dsu[x]==x)return x; dsu[x]=root(dsu[x]); return dsu[x]; } void mergev(int x,int y){ int rootx=root(x); int rooty=root(y); if(rootx==rooty)return; if(sz[rootx]<sz[rooty])swap(rootx,rooty); dsu[rooty]=rootx; sz[rootx]+=sz[rooty]; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i=1;i<=m;i++){ cin>>a>>b>>c; e[i]={a,b,c}; } cin>>q; for(int i=1;i<=q;i++){ cin>>x[i]; } sort(e+1,e+m+1,cmp); for(int i=1;i<=m;i++){ reset_dsu(); pos=0; mins[i]=0; for(int f=i-1;f>=1;f--){ mergev(e[f].from,e[f].to); if(root(e[i].from)==root(e[i].to)){ pos=f; break; } } if(pos!=0){ mins[i]=(e[pos].cost+e[i].cost)/2; if((e[pos].cost+e[i].cost)%2==1){ mins[i]++; } } reset_dsu(); pos=m+1; maxs[i]=inf; for(int f=i+1;f<=m;f++){ mergev(e[f].from,e[f].to); if(root(e[i].from)==root(e[i].to)){ pos=f; break; } } if(pos!=m+1){ maxs[i]=(e[pos].cost+e[i].cost)/2; if((e[pos].cost+e[i].cost)%2==0){ maxs[i]--; } } } for(int i=1;i<=m;i++){ l=0; r=q+1; while(l+1<r){ mid=(l+r)/2; if(x[mid]>=mins[i]){ r=mid; }else{ l=mid; } } lt=r; l=0; r=q+1; while(l+1<r){ mid=(l+r)/2; if(x[mid]<=maxs[i]){ l=mid; }else{ r=mid; } } rt=l; l=0; r=q+1; while(l+1<r){ mid=(l+r)/2; if(x[mid]<=e[i].cost){ l=mid; }else{ r=mid; } } if(lt>rt)continue; incr[lt]+=e[i].cost; mult[lt]--; incr[l+1]+=-2*e[i].cost; mult[l+1]+=2; incr[rt+1]+=e[i].cost; mult[rt+1]--; } for(int i=1;i<=q;i++){ sum+=incr[i]; t+=mult[i]; ans[i]=sum+t*x[i]; } for(int i=1;i<=q;i++){ cout<<ans[i]<<"\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...