제출 #1130610

#제출 시각아이디문제언어결과실행 시간메모리
1130610I_FloPPed21나일강 (IOI24_nile)C++20
100 / 100
86 ms12216 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; const int N=2e5+1; int c[N],n,q; int ax[N],bx[N],cx[N]; struct query { int ind,val; } qr[N]; struct dsu { int val,best_par,best_impar,best_alb; } arb[N]; struct muchie { int a,b,c; }; int get(int x) { int nod1=x; while(arb[nod1].val>0) { nod1=arb[nod1].val; } while(arb[x].val>0) { int mid=arb[x].val; arb[x].val=nod1; x=mid; } return x; } long long ans=0; void merge(int x,int y) { x=get(x),y=get(y); //cout<<x<<" "<<y<<" "<<"deci"<<" "<<arb[x].val<<" "<<arb[y].val<<'\n'; int best_par=arb[x].best_par; int best_impar=arb[x].best_impar; int best_alb=arb[x].best_alb; if(abs(arb[x].val)%2==1) { ans-=min(best_impar,best_alb); } if(abs(arb[y].val)%2==1) { ans-=min(arb[y].best_impar,arb[y].best_alb); } if(abs(arb[x].val)%2==0) { best_par=min(arb[y].best_par,best_par); best_impar=min(arb[y].best_impar,best_impar); best_alb=min(arb[y].best_alb,best_alb); } else { best_par=min(best_par,arb[y].best_impar); best_impar=min(best_impar,arb[y].best_par); best_alb=min(best_alb,arb[y].best_alb); } if(arb[x].val<arb[y].val) { arb[x].val+=arb[y].val; arb[y].val=x; arb[x].best_par=best_par; arb[x].best_impar=best_impar; arb[x].best_alb=best_alb; } else { arb[y].val+=arb[x].val; arb[x].val=y; arb[y].best_par=best_par; arb[y].best_impar=best_impar; arb[y].best_alb=best_alb; } if(abs(arb[get(x)].val)%2==1) { ans+=min(arb[get(x)].best_impar,arb[get(x)].best_alb); } } struct schi { int w,a,b,c; } v[N]; long long rasp[N]; vector<long long> calculate_costs(vector<int> W,vector<int>A,vector<int>B,vector<int>E) { n=W.size(); vector<long long>buffer; for(int i=1; i<=n; i++) { v[i].w=W[i-1]; v[i].a=A[i-1]; v[i].b=B[i-1]; v[i].c=v[i].a-v[i].b; ans+=v[i].a; } sort(v+1,v+n+1,[](schi x,schi y){return x.w<y.w;}); for(int i=1; i<=n; i++) { arb[i].val=-1; arb[i].best_par=1e9+1; arb[i].best_alb=1e9+1; arb[i].best_impar=v[i].c; } q=E.size(); for(int i=1; i<=q; i++) { qr[i].ind=i; qr[i].val=E[i-1]; } sort(qr+1,qr+q+1,[](query x,query y) { return x.val<y.val; }); vector<muchie>muchii; for(int i=1; i<n; i++) { if(i+1<=n) muchii.push_back({i,i+1,v[i+1].w-v[i].w}); if(i+2<=n) muchii.push_back({i,i+2,v[i+2].w-v[i].w}); } sort(muchii.begin(),muchii.end(),[](muchie x,muchie y) { return x.c<y.c; }); int pointer=0; /*for(int i=1;i<=n;i++) { cout<<v[i].w<<" "; } cout<<'\n'; for(int i=0;i<muchii.size();i++) { cout<<muchii[i].a<<" "<<muchii[i].b<<" "<<muchii[i].c<<'\n'; }*/ for(int i=1; i<=q; i++) { while(pointer<muchii.size()&&muchii[pointer].c<=qr[i].val) { int a=muchii[pointer].a; int b=muchii[pointer].b; if(b-a==1) merge(a,b); else { int d=get(a); if(abs(arb[d].val)%2==1) { ans-=min(arb[d].best_impar,arb[d].best_alb); } arb[d].best_alb=min(arb[d].best_alb,v[a+1].c); if(abs(arb[d].val)%2==1) ans+=min(arb[d].best_impar,arb[d].best_alb); } pointer++; } rasp[qr[i].ind]=ans; } //merge(2,3); for(int i=1; i<=q; i++) buffer.push_back(rasp[i]); return buffer; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...