Submission #1105808

#TimeUsernameProblemLanguageResultExecution timeMemory
1105808_rain_Palembang Bridges (APIO15_bridge)C++14
100 / 100
144 ms12576 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define name "main" #define int long long typedef pair<int,int> ii; #define fi first #define se second const int N=(int)1e5; bool print=false; vector<ii>sett; vector<ll>nen; int n,k,cnt=0; ll f[N+2]; bool used[N*2+2]; bool cmp(ii a,ii b){ return a.fi+a.se<b.fi+b.se; } class BIT{ public: vector<ll>tot; vector<int> cnt,one; int n; void init(int _n){ n=_n; tot.assign(_n+2,0); cnt.assign(_n+2,0); one.assign(_n+2,0); return; } void upd_tot(int id,int val){ for(;id<=n;id+=(id&(-id))) tot[id]+=val; return; } void upd_cnt(int id,int val){ for(;id<=n;id+=(id&(-id))) cnt[id]+=val; return; } void upd_one(int id,int val){ for(;id<=n;id+=(id&(-id))) one[id]+=val; } int Get_tot(int id){ ll sum=0; for(;id;id-=(id&(-id))) sum+=tot[id]; return sum; } ll Get_cnt(int id){ ll sum=0; for(;id;id-=(id&(-id))) sum+=cnt[id]; return sum; } ll Get_one(int id){ ll sum=0; for(;id;id-=(id&(-id))) sum+=one[id]; return sum; } ll sum_range(int t,int l,int r){ if (t==1){ return Get_tot(r)-Get_tot(l-1); } if (t==2){ return Get_cnt(r)-Get_cnt(l-1); } if (t==3){ return Get_one(r)-Get_one(l-1); } } }; BIT tree; ll F(int i){ int l=1,r=nen.size(),p=1; while(l<=r){ int m=(l+r)>>1; if (tree.sum_range(2,1,m)<=(cnt+1)/2){ l=m+1,p=m; } else r=m-1; } return nen[p]*tree.sum_range(2,1,p)-tree.sum_range(1,1,p)+tree.sum_range(1,p+1,nen.size())-nen[p]*tree.sum_range(2,p+1,nen.size())+(ll)i; } int32_t main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>k>>n; ll ans=0; nen.push_back(-1); for (int i=1;i<=n;++i){ char c1,c2; int a,b; cin>>c1>>a>>c2>>b; if (c1==c2) ans+=abs(a-b); else { nen.push_back(a); nen.push_back(b); sett.push_back({a,b}); } } sort(nen.begin(),nen.end()); nen.resize(unique(nen.begin(),nen.end())-nen.begin()); sort(sett.begin(),sett.end(),cmp); tree.init(nen.size()); for (int i=1;i<=sett.size();++i){ int a=sett[i-1].fi,b=sett[i-1].se; a=upper_bound(nen.begin(),nen.end(),a)-nen.begin(); b=upper_bound(nen.begin(),nen.end(),b)-nen.begin(); tree.upd_cnt(a,1),tree.upd_cnt(b,1); tree.upd_tot(a,nen[a-1]),tree.upd_tot(b,nen[b-1]); cnt+=2; f[i]=F(i); } if (k==1) ans=ans+f[sett.size()]; else{ tree.init(nen.size()); cnt=0; ll add=(ll)1e18; for (int i=sett.size();i>=1;--i){ int a=sett[i-1].fi,b=sett[i-1].se; a=upper_bound(nen.begin(),nen.end(),a)-nen.begin(); b=upper_bound(nen.begin(),nen.end(),b)-nen.begin(); tree.upd_cnt(a,1),tree.upd_cnt(b,1); tree.upd_tot(a,nen[a-1]),tree.upd_tot(b,nen[b-1]); cnt+=2; add=min(add,F(sett.size()-i+1)+f[i-1]); } ans=min(ans+f[sett.size()],ans+add); } cout<<ans; exit(0); }

Compilation message (stderr)

bridge.cpp: In function 'int32_t main()':
bridge.cpp:112:16: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |  for (int i=1;i<=sett.size();++i){
      |               ~^~~~~~~~~~~~~
bridge.cpp: In member function 'll BIT::sum_range(long long int, long long int, long long int)':
bridge.cpp:77:2: warning: control reaches end of non-void function [-Wreturn-type]
   77 |  }
      |  ^
#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...