제출 #1190864

#제출 시각아이디문제언어결과실행 시간메모리
1190864boclobanchatPalembang Bridges (APIO15_bridge)C++20
78 / 100
120 ms9032 KiB
#include<bits/stdc++.h> using namespace std; #define ii pair<int,int> #define fi first #define se second const int MAXN=2e5+5; long long A[MAXN],B[MAXN],val[MAXN],fen[MAXN],ff[MAXN],ct[MAXN]; ii P[MAXN]; int getlog(long long n) { return 63-__builtin_clzll(n); } bool comp(ii a,ii b) { return a.fi+a.se<b.fi+b.se; } void update(int i,int n,int val) { for(;i<=n;i+=i&-i) fen[i]+=val; } int get(int i) { int ans=0;for(;i;i-=i&-i) ans+=fen[i];return ans; } int walk(int n,int val) { int ans=0;for(int i=getlog(n);i+1;i--) if(ans+(1<<i)<=n&&val>fen[ans+(1<<i)]) val-=fen[ans+=(1<<i)];return ans+1; } void updf(int i,int n,long long val) { for(;i<=n;i+=i&-i) ff[i]+=val; } long long getf(int i) { long long ans=0;for(;i;i-=i&-i) ans+=ff[i];return ans; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int k,n,cnt=0,cc=0; cin>>k>>n; long long ans=0; for(int i=1;i<=n;i++) { char x,y; int u,v; cin>>x>>u>>y>>v; if(u>v) swap(u,v); if(x==y) ans+=v-u; else ans++,P[++cnt]={u,v},val[++cc]=u,val[++cc]=v; } sort(val+1,val+cc+1); sort(P+1,P+cnt+1,comp); if(k==1) { for(int i=1;i<=cc;i++) ans+=abs(val[cc+1]/2-val[i]); cout<<ans; } else { long long aa=1e18; for(int i=1;i<=cnt;i++) { int x=lower_bound(val+1,val+cc+1,P[i].fi)-val; int y=lower_bound(val+1,val+cc+1,P[i].se)-val; x+=ct[x]++,y+=ct[y]++; update(x,cc,1),updf(x,cc,P[i].fi); update(y,cc,1),updf(y,cc,P[i].se); int med=walk(cc,i); A[i]=getf(cc)-getf(med)*2; } for(int i=1;i<=cc;i++) fen[i]=ff[i]=ct[i]=0; for(int i=cnt;i;i--) { int x=lower_bound(val+1,val+cc+1,P[i].fi)-val; int y=lower_bound(val+1,val+cc+1,P[i].se)-val; x+=ct[x]++,y+=ct[y]++; update(x,cc,1),updf(x,cc,val[x]); update(y,cc,1),updf(y,cc,val[y]); int med=walk(cc,cnt-i+1); B[i]=getf(cc)-getf(med)*2; } for(int i=0;i<=cnt;i++) aa=min(aa,A[i]+B[i+1]); cout<<ans+aa; } }
#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...