# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
716766 | Abrar_Al_Samit | Meetings (IOI18_meetings) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits\stdc++.h>
#include "meetings.h"
using namespace std;
const int nax = 1e5 + 3;
const int lg = 18;
const long long INF = 1e18;
int n;
int q;
int sp[nax][lg], an[nax][lg], aux[nax];
vector<int>h;
int get(int l, int r) {
int msb = 31 - __builtin_clz(r-l+1);
if(h[sp[l][msb]]>=h[sp[r-(1<<msb)+1][msb]])
return sp[l][msb];
return sp[r-(1<<msb)+1][msb];
}
int get2(int l, int r) {
int msb = 31 - __builtin_clz(r-l+1);
if(aux[an[l][msb]]>=aux[an[r-(1<<msb)+1][msb]])
return an[l][msb];
return an[r-(1<<msb)+1][msb];
}
vector<long long>minimum_costs(vector<int>H, vector<int>L, vector<int>R) {
n = H.size();
q = L.size();
h = H;
for(int i=0; i<n; ++i) {
sp[i][0] = i;
}
for(int j=1; j<lg; ++j) {
for(int i=0; i+(1<<j)-1<n; ++i) {
if(H[sp[i][j-1]]>=H[sp[i+(1<<(j-1))][j-1]])
sp[i][j] = sp[i][j-1];
else
sp[i][j] = sp[i+(1<<(j-1))][j-1];
}
}
for(int i=n-1; i>=0; --i) {
if(H[i]==1) aux[i] = 1 + aux[i+1];
an[i][0] = i;
}
for(int j=1; j<lg; ++j) {
for(int i=0; i+(1<<j)-1<n; ++i) {
if(aux[an[i][j-1]]>=aux[an[i+(1<<(j-1))][j-1]])
an[i][j] = an[i][j-1];
else
an[i][j] = an[i+(1<<(j-1))][j-1];
}
}
vector<long long>ret(q);
for(int i=0; i<q; ++i) {
int mxID = get2(L[i], R[i]);
int mxX = H[get(L[i], R[i])];
if(mxX==1) {
ret[i] = R[i] - L[i] + 1;
continue;
}
int cnt;
if(mxID+aux[mxID]-1>R[i]) {
cnt = R[i] - mxID + 1;
if(mxID!=L[i]) {
mxID = get2(L[i], mxID-1);
cnt = max(cnt, aux[mxID]);
}
} else {
cnt = aux[mxID];
}
ret[i] = (R[i] - L[i] + 1 - cnt) * 1LL * mxX + cnt;
}
return ret;
}