제출 #1210307

#제출 시각아이디문제언어결과실행 시간메모리
1210307loiiii12358모임들 (IOI18_meetings)C++20
17 / 100
78 ms16828 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; #define int long long struct Segment{ int l,r,m; bool full; Segment(){ l=r=m=0; full=false; } Segment(int a,int b,int c,bool d){ l=a;r=b;m=c; full=d; } }; vector<int> h={0}; vector<Segment> seg; void build(int id,int l,int r){ // cout << id << ' ' << l << ' ' << r << endl; if(l==r){ if(h[l]==1){ seg[id]=Segment(1,1,1,true); }else{ seg[id]=Segment(0,0,0,false); } return; } int m=l+(r-l)/2; build(id*2,l,m); build(id*2+1,m+1,r); seg[id]=Segment(); if(seg[id*2].full){ seg[id].l=seg[id*2].l+seg[id*2+1].l; }else{ seg[id].l=seg[id*2].l; } if(seg[id*2+1].full){ seg[id].r=seg[id*2+1].r+seg[id*2].r; }else{ seg[id].r=seg[id*2+1].r; } seg[id].m=max(seg[id*2].r+seg[id*2+1].l,max(seg[id*2].m,seg[id*2+1].m)); seg[id].full=seg[id*2].full&&seg[id*2+1].full; } Segment query(int id,int l,int r,int L,int R){ if(r<L||l>R){ return Segment(0,0,0,false); }else if(l>=L&&r<=R){ return seg[id]; } int m=l+(r-l)/2; Segment a=query(id*2,l,m,L,R),b=query(id*2+1,m+1,r,L,R),ans; if(a.full){ ans.l=a.l+b.l; }else{ ans.l=a.l; } if(b.full){ ans.r=a.r+b.r; }else{ ans.r=b.r; } ans.m=max(a.r+b.l,max(a.m,b.m)); ans.full=a.full&&b.full; return ans; } std::vector<long long> minimum_costs(std::vector<int32_t> H, std::vector<int32_t> L, std::vector<int32_t> R) { int N=H.size(),Q = L.size(),cnt; Segment tmp; vector<long long> C(Q); for(int i=0;i<N;i++){ h.push_back(H[i]); } seg.resize(4*N); build(1,1,N); for(int i=0;i<Q;i++){ tmp=query(1,1,N,L[i]+1,R[i]+1); cnt=max(tmp.m,max(tmp.l,tmp.r)); C[i]=(R[i]-L[i]+1)*2-cnt; } return C; }
#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...