Submission #1281469

#TimeUsernameProblemLanguageResultExecution timeMemory
1281469StefanSebezPalembang Bridges (APIO15_bridge)C++20
31 / 100
83 ms1564 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define ll long long #define ld long double #define mp make_pair void chmn(ll &x,ll y){x=min(x,y);} void chmx(ll &x,ll y){x=max(x,y);} void Unique(vector<ll>&a){sort(a.begin(),a.end());a.resize(unique(a.begin(),a.end())-a.begin());} const int N=2000,lg=31; const ll INF=1e18,inf=1e9; void Solve1(){ int n;scanf("%i",&n); vector<int>vals; ll ans=0; for(int i=1;i<=n;i++){ char p,q;int s,t; cin>>p>>s>>q>>t; if(p==q) ans+=abs(s-t); else{ ans++; vals.pb(s);vals.pb(t); } } sort(vals.begin(),vals.end()); int m=vals.size()/2; for(auto i:vals) ans+=abs(i-vals[m]); printf("%lld\n",ans); } /*struct SegTree{ int root,nc,lc[N*lg],rc[N*lg];ll sum[N*lg]; void Update(ll ss,ll se,ll qind,ll x){Update(root,ss,se,qind,x);} void Update(int &c,ll ss,ll se,ll qind,ll x){ if(!c)c=++nc; if(ss==se){sum[c]+=x;return;} ll mid=ss+se>>1; if(qind<=mid) Update(lc[c],ss,mid,qind,x); else Update(rc[c],mid+1,se,qind,x); sum[c]=sum[lc[c]]+sum[rc[c]]; } ll Get(ll ss,ll se,ll qs,ll qe){return Get(root,ss,se,qs,qe);} ll Get(int c,ll ss,ll se,ll qs,ll qe){ if(qs>qe||qe<ss||se<qs)return 0; if(qs<=ss&&se<=qe)return sum[c]; ll mid=ss+se>>1;return Get(lc[c],ss,mid,qs,qe)+Get(rc[c],mid+1,se,qs,qe); } void Clear(){for(int i=0;i<=nc;i++){lc[i]=rc[i]=sum[i]=root=0;}nc=0;} }STM[2];*/ struct BIT{ vector<ll>T,vals; void Init(){T.clear();vals.pb(-INF);Unique(vals);T.resize(vals.size());} void Ubaci(ll i){vals.pb(i);} void Update(ll i,ll x){for(ll j=upper_bound(vals.begin(),vals.end(),i)-vals.begin()-1;j<T.size();j+=j&-j)T[j]+=x;} ll Get(ll i){ll x=0;for(ll j=upper_bound(vals.begin(),vals.end(),i)-vals.begin()-1;j>=1;j-=j&-j)x+=T[j];return x;} ll Get(ll l,ll r){if(l>r)return 0;return Get(r)-Get(l-1);} void Clear(){T.clear();vals.clear();} }bt[2]; void Solve2(){ ll n;scanf("%lld",&n); vector<ll>vals; vector<pair<ll,ll>>a; ll ans=0; for(ll i=1;i<=n;i++){ char p,q;ll s,t; cin>>p>>s>>q>>t; ans+=abs(s-t); if(p!=q){ ans++; vals.pb(s);vals.pb(t); if(s>t)swap(s,t); a.pb({s,t}); } } sort(a.begin(),a.end()); Unique(vals); vector<ll>ev[vals.size()+5]; vector<ll>STL={-INF},prefL={0},STR={-INF},prefR={0}; for(auto [l,r]:a){ STL.pb(r); STR.pb(l); /*STL[0].Update(0,inf,r,1); STL[1].Update(0,inf,r,r); STR[0].Update(0,inf,l,1); STR[1].Update(0,inf,l,l);*/ ev[lower_bound(vals.begin(),vals.end(),r)-vals.begin()].pb(l); } sort(STL.begin(),STL.end()); for(ll i=1;i<STL.size();i++) prefL.pb(prefL.back()+STL[i]); sort(STR.begin(),STR.end()); for(ll i=1;i<STR.size();i++) prefR.pb(prefR.back()+STR[i]); for(ll i=0;i<vals.size();i++){auto j=ev[i];sort(j.begin(),j.end()),reverse(j.begin(),j.end());} //for(auto [x,y]:a) printf("[%lld %lld] ",x,y);printf("\n"); //for(auto i:vals) printf("%lld ",i);printf("\n"); ll res=INF,valL[vals.size()+5]={0},valR[vals.size()+5]={0}; for(ll i=0;i<vals.size();i++){ ll x1=vals[i],x2=vals[i]; ll lb=upper_bound(STL.begin(),STL.end(),x1-1)-STL.begin()-1; valL[i]=2*(x1*lb-prefL[lb]); lb=lower_bound(STR.begin(),STR.end(),x2+1)-STR.begin(); valR[i]=2*(prefR.back()-prefR[lb-1]-x2*(prefR.size()-lb)); } for(ll i=0;i<vals.size();i++){ ll mns=0;//STM[0].Clear();STM[1].Clear(); for(ll k=0;k<=1;k++){ bt[k].Clear(); for(ll j=i;j<vals.size();j++){ for(auto l:ev[j]){ if(l<vals[i]) break; bt[k].Ubaci(l+vals[j]); } } bt[k].Init(); } for(ll j=i;j<vals.size();j++){ ll x1=vals[i],x2=vals[j]; /*int lb=upper_bound(STL.begin(),STL.end(),x1-1)-STL.begin()-1; //for(auto k:STL) printf("%lld ",k);printf("\n"); //printf("%lld: %i\n",x1-1,lb); ll sum=2*(x1*lb-prefL[lb]); lb=lower_bound(STR.begin(),STR.end(),x2+1)-STR.begin(); //for(auto k:STR) printf("%lld ",k);printf("\n"); //printf("%lld: %i\n",x2+1,lb); sum+=2*(prefR.back()-prefR[lb-1]-x2*(prefR.size()-lb)); //ll sum=2*(x1*STL[0].Get(0,inf,0,x1-1)-STL[1].Get(0,inf,0,x1-1)); //sum+=2*(STR[1].Get(0,inf,x2+1,inf)-x2*STR[0].Get(0,inf,x2+1,inf));*/ ll sum=valL[i]+valR[j]; for(auto l:ev[j]){ if(l<x1) break; mns+=x2-l; bt[0].Update(l+x2,1); bt[1].Update(l+x2,l+x2); //STM[0].Update(0,2*inf,l+x2,1); //STM[1].Update(0,2*inf,l+x2,l+x2); } sum-=mns; sum+=bt[1].Get(2*x1,x1+x2)-2*x1*bt[0].Get(2*x1,x1+x2); sum+=2*x2*bt[0].Get(x1+x2+1,2*x2)-bt[1].Get(x1+x2+1,2*x2); //sum+=STM[1].Get(0,2*inf,2*x1,x1+x2)-2*x1*STM[0].Get(0,2*inf,2*x1,x1+x2); //sum+=2*x2*STM[0].Get(0,2*inf,x1+x2+1,2*x2)-STM[1].Get(0,2*inf,x1+x2+1,2*x2); chmn(res,sum); } } //printf("%lld\n",res); /*for(int i=0;i<a.size();i++){ ll sum=0; vector<ll>temp; for(int j=0;j<=i;j++) temp.pb(a[j].fi),temp.pb(a[j].se); sort(temp.begin(),temp.end()); ll v=temp[temp.size()/2]; for(auto j:temp) sum+=abs(j-v); temp.clear(); for(int j=i+1;j<a.size();j++) temp.pb(a[j].fi),temp.pb(a[j].se); sort(temp.begin(),temp.end()); v=temp[temp.size()/2]; for(auto j:temp) sum+=abs(j-v); chmn(res,sum); }*/ /*for(auto i:vals){ for(auto j:vals){ ll sum=0; for(auto [x,y]:a){ sum+=min(abs(x-i)+abs(y-i),abs(x-j)+abs(y-j)); } //if(res>sum) printf("%lld %lld\n",i,j); chmn(res,sum); } }*/ if(vals.empty()) res=0; ans+=res; printf("%lld\n",ans); } int main(){ int KK;scanf("%i",&KK); if(KK==1) Solve1(); else Solve2(); return 0; }

Compilation message (stderr)

bridge.cpp: In function 'void Solve1()':
bridge.cpp:15:16: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   15 |     int n;scanf("%i",&n);
      |           ~~~~~^~~~~~~~~
bridge.cpp: In function 'void Solve2()':
bridge.cpp:62:15: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |     ll n;scanf("%lld",&n);
      |          ~~~~~^~~~~~~~~~~
bridge.cpp: In function 'int main()':
bridge.cpp:178:17: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  178 |     int KK;scanf("%i",&KK);
      |            ~~~~~^~~~~~~~~~
#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...