Submission #835177

#TimeUsernameProblemLanguageResultExecution timeMemory
835177tolbiMeetings (IOI18_meetings)C++17
19 / 100
5525 ms12256 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define tol(bi) (1LL<<((ll)(bi))) #include "meetings.h" #define INF LONG_LONG_MAX struct SegTree{ vector<ll> segtree; vector<ll> lazy; SegTree(int n){ segtree.resize(tol(ceil(log2(n)+1))-1,0); lazy.resize(segtree.size(), 0ll); } void dallan(int node){ segtree[node]+=lazy[node]; if (node*2+1<segtree.size()){ lazy[node*2+1]+=lazy[node]; lazy[node*2+2]+=lazy[node]; } lazy[node]=0; } void update(int tarl, int tarr, ll val, int l = 0, int r = -1, int node = 0){ if (r==-1) r = segtree.size()/2; dallan(node); if (l>=tarl && r<=tarr){ lazy[node]+=val; dallan(node); return; } if (l>tarr || r<tarl) return; int mid = l+(r-l)/2; update(tarl, tarr, val, l, mid, node*2+1); update(tarl, tarr, val, mid+1, r, node*2+2); segtree[node]=min(segtree[node*2+1],segtree[node*2+2]); } ll query(int tarl, int tarr, int l = 0, int r = -1, int node = 0){ if (r==-1) r = segtree.size()/2; dallan(node); if (l>=tarl && r<=tarr) return segtree[node]; if (l>tarr || r<tarl) return INF; int mid = l+(r-l)/2; ll lnode = query(tarl, tarr, l, mid, node*2+1); ll rnode = query(tarl, tarr, mid+1, r, node*2+2); return min(lnode,rnode); } }; vector<long long> minimum_costs(vector<int> arr, vector<int> L, vector<int> R) { ll q = L.size(); ll n = arr.size(); vector<ll> ansarr(q,0); SegTree segtree(n); vector<ll> leftdp(n); vector<ll> rightdp(n); vector<ll> sonra(n,n); vector<ll> once(n,-1); vector<ll> stak; for (ll i = 0; i < n; i++){ while (stak.size() && arr[stak.back()]<=arr[i]){ stak.pop_back(); }; if (stak.size()==0){ leftdp[i]=(i+1)*arr[i]; } else { once[i]=stak.back(); leftdp[i]=leftdp[stak.back()]+arr[i]*(i-stak.back()); } stak.push_back(i); } stak.clear(); for (ll i = n-1; i >= 0; i--){ while (stak.size() && arr[stak.back()]<=arr[i]){ stak.pop_back(); } if (stak.size()==0){ rightdp[i]=(n-1-i+1)*arr[i]; } else { sonra[i]=stak.back(); rightdp[i]=rightdp[stak.back()]+arr[i]*(stak.back()-i); } stak.push_back(i); } for (ll i = 0; i < n; i++){ segtree.update(i,i,leftdp[i]+rightdp[i]-arr[i]); } cout<<endl; vector<array<int,3>> quarr(q); for (int i = 0; i < q; ++i) { quarr[i]={L[i],R[i],i}; } int BLOK = sqrt(n); sort(quarr.begin(), quarr.end(), [&](array<int,3> a, array<int,3> b){ if (a[0]/BLOK==b[0]/BLOK) return a[1]<b[1]; return a[0]<b[0]; }); int lastl = 0; int lastr = n-1; for (int i = 0; i < quarr.size(); i++){ int l = quarr[i][0]; int r = quarr[i][1]; while (lastl>l){ int node = lastl-1; while (node<n){ segtree.update(node,sonra[node]-1,arr[node]); node=sonra[node]; } lastl--; } while (lastr<r){ int node = lastr+1; while (node>=0){ segtree.update(once[node]+1,node,arr[node]); node=once[node]; } lastr++; } while (lastl<l){ int node = lastl; while (node<n){ segtree.update(node,sonra[node]-1,-arr[node]); node=sonra[node]; } lastl++; } while (lastr>r){ int node = lastr; while (node>=0){ segtree.update(once[node]+1,node,-arr[node]); node=once[node]; } lastr--; } ansarr[quarr[i][2]]=segtree.query(l,r); } return ansarr; }

Compilation message (stderr)

meetings.cpp: In member function 'void SegTree::dallan(int)':
meetings.cpp:16:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |   if (node*2+1<segtree.size()){
      |       ~~~~~~~~^~~~~~~~~~~~~~~
meetings.cpp: In function 'std::vector<long long int> minimum_costs(std::vector<int>, std::vector<int>, std::vector<int>)':
meetings.cpp:100:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 3> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |  for (int i = 0; i < quarr.size(); i++){
      |                  ~~^~~~~~~~~~~~~~
#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...