이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// #include "meetings.h"
#include <bits/stdc++.h>
#define pb push_back
#define ll long long
#define print(a) for(int i=0;i<a.size();i++)cout<<a[i]<<endl;
using namespace std;
struct item{
ll pre=0,suf=0,seg=0;
};
struct segtree{
int size=1;
vector<item>arr;
void init(int n){
while(size<n)size*=2;
arr.resize(2*size-1);
}
void update(int i,int v,int x,int lx,int rx){
if(rx-lx==1){
int val=1;
if(v==2)val=0;
arr[x].pre=val;
arr[x].suf=val;
arr[x].seg=val;
return;
}
int mid=(lx+rx)/2;
if(i<mid)update(i,v,2*x+1,lx,mid);
else update(i,v,2*x+2,mid,rx);
arr[x].seg=max({arr[2*x+1].seg,arr[2*x+2].seg,arr[2*x+1].suf+arr[2*x+2].pre});
if(arr[2*x+1].pre==(rx-lx)/2){
arr[x].pre=arr[2*x+1].pre+arr[2*x+2].pre;
}else{
arr[x].pre=arr[2*x+1].pre;
}
if(arr[2*x+2].suf==(rx-lx)/2){
arr[x].suf=arr[2*x+2].suf+arr[2*x+1].suf;
}else{
arr[x].suf=arr[2*x+2].suf;
}
}
void update(int i,int v){
update(i,v,0,0,size);
}
void get(int l,int r,int x,int lx,int rx,item& ans,int& vis){
if(lx>=r || rx<=l)return;
if(lx>=l && rx<=r){
if(ans.seg+ans.pre+ans.suf==-3){
ans=arr[x];
}else{
ans.seg=max({ans.seg,arr[x].seg,ans.suf+arr[x].pre});
if(ans.pre==vis){
ans.pre=ans.pre+arr[x].pre;
}
if(arr[x].suf==rx-lx){
ans.suf=arr[x].suf+ans.suf;
}else{
ans.suf=arr[x].suf;
}
}
vis=rx-lx;
return;
}
int mid=(lx+rx)/2;
get(l,r,2*x+1,lx,mid,ans,vis);
get(l,r,2*x+2,mid,rx,ans,vis);
}
void get(int l,int r,item& ans){
int vis=0;
get(l,r,0,0,size,ans,vis);
}
void st_print(){
for(int i=0;i<2*size-1;i++){
cout<<i<<": "<<arr[i].pre<<' '<<arr[i].seg<<' '<<arr[i].suf<<endl;
}
}
};
vector<long long> minimum_costs(vector<int> H, vector<int> L,vector<int> R) {
int q = L.size();
int n = H.size();
ll mx=0;
for(int i=0;i<n;i++)mx=max(mx,(ll)H[i]);
if(mx<=2){
segtree st;
st.init(n);
vector<ll>C(q);
for(int i=0;i<n;i++){
st.update(i,H[i]);
}
for(int i=0;i<q;i++){
item ans;
ans.pre=-1;ans.seg=-1;ans.suf=-1;
st.get(L[i],R[i]+1,ans);
C[i]=(R[i]-L[i]+1-ans.seg)*2+ans.seg;
}
// st.st_print();
return C;
}else{
vector<vector<ll>>suffix(n,vector<ll>(n+1,0));
vector<vector<ll>>prefix(n,vector<ll>(n+1,0));
vector<ll>C(q);
for(int i=0;i<n;i++){
ll mx=0;
for(int j=i;j<n;j++){
mx=max(mx,(ll)H[j]);
suffix[i][j+1]=suffix[i][j]+mx;
}
mx=0;
for(int j=i;j>=0;j--){
mx=max(mx,(ll)H[j]);
prefix[i][j]=prefix[i][j+1]+mx;
}
}
for(int i=0;i<q;i++){
ll mn=LONG_LONG_MAX;
for(int j=L[i];j<=R[i];j++){
ll sm=0;
sm+=H[j];
sm+=prefix[j][L[i]]-prefix[j][j];
sm+=suffix[j][R[i]+1]-suffix[j][j+1];
mn=min(mn,sm);
}
C[i]=mn;
}
return C;
}
}
// int main(){
// vector<ll>c;
// c=minimum_costs({2,1,2,1,1,1,2,1}, {2,0}, {6,3});
// print(c);
// }
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |