제출 #1209488

#제출 시각아이디문제언어결과실행 시간메모리
1209488Aviansh모임들 (IOI18_meetings)C++20
17 / 100
80 ms8676 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; struct segTree{ struct node{ int sum,pref,suf,best,len; }; node *st; node def; int n; node unite(node a, node b){ node ans; ans.sum=a.sum+b.sum; ans.len=a.len+b.len; ans.pref=a.pref; if(a.pref==a.len){ ans.pref+=b.pref; } ans.suf=b.suf; if(b.suf==b.len){ ans.suf+=a.suf; } ans.best=max({a.best,b.best,a.suf+b.pref}); return ans; } segTree(int siz){ int x = ceil(log2(siz)); x++; n=siz-1; st=new node[(1<<x)]; def.sum=0; def.pref=0; def.suf=0; def.best=0; def.len=0; fill(st,st+(1<<x),def); } void update(int l, int r, int ind, int i){ st[ind].len=r-l+1; if(i<l||i>r) return; if(l==r){ st[ind].best=1; st[ind].pref=1; st[ind].suf=1; st[ind].sum=1; return; } int mid = (l+r)/2; update(l,mid,ind*2+1,i); update(mid+1,r,ind*2+2,i); st[ind]=unite(st[ind*2+1],st[ind*2+2]); } node rquery(int l, int r, int s, int e, int ind){ st[ind].len=r-l+1; if(e<l||s>r){ return def; } if(s<=l&&r<=e){ return st[ind]; } int mid = (l+r)/2; node x = unite(rquery(l,mid,s,e,ind*2+1),rquery(mid+1,r,s,e,ind*2+2)); return x; } int query(int l, int r){ return rquery(0,n,l,r,0).best; } }; vector<long long> minimum_costs(vector<int> h, vector<int> L, vector<int> R) { int n = h.size(); int q = L.size(); vector<long long>ans(q); segTree st(n); for(int i = 0;i<n;i++){ if(h[i]==1){ st.update(0,n-1,0,i); } } for(int i = 0;i<q;i++){ int best = st.query(L[i],R[i]); int len = R[i]-L[i]+1; ans[i]=1LL*best+2LL*(len-best); } return ans; }
#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...