제출 #915815

#제출 시각아이디문제언어결과실행 시간메모리
915815biank모임들 (IOI18_meetings)C++14
19 / 100
415 ms758496 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; #define SIZE(x) int(x.size()) #define forn(i,n) for(int i=0;i<int(n);i++) #define forsn(i,s,n) for(int i=int(s);i<int(n);i++) #define dforn(i,n) for(int i=int(n)-1;i>=0;i--) typedef long long ll; typedef vector<ll> vll; typedef vector<int> vi; const ll INF = 1e18; const int MAXN = 1e5; const int MAXH = 21; struct Node { ll pref[MAXH], suff[MAXH], cost[MAXH][MAXH]; int maxH; Node() { forn(i,MAXH) { pref[i]=suff[i]=INF; forn(j,MAXH) cost[i][j]=INF; } maxH=0; } Node(int val) { forn(i,MAXH) { pref[i]=suff[i]=INF; forn(j,MAXH) cost[i][j]=INF; } cost[val][val]=maxH=val; forn(i,MAXH) pref[i]=suff[i]=max(i,val); } }; Node op(Node left, Node right) { Node res; forn(i,MAXH) forn(j,MAXH) { ll &curr = res.cost[i][max(j,right.maxH)]; curr = min(curr, left.cost[i][j] + right.pref[j]); } forn(i,MAXH) forn(j,MAXH) { ll &curr = res.cost[max(i,left.maxH)][j]; curr = min(curr, left.suff[i] + right.cost[i][j]); } forn(i,MAXH) { res.suff[i] = min(res.suff[i], left.pref[max(i,right.maxH)] + right.pref[i]); res.pref[i] = min(res.pref[i], left.suff[i] + right.suff[max(i,left.maxH)]); } res.maxH = max(left.maxH, right.maxH); return res; } Node st[2*MAXN]; int n; ll query(int l, int r) { Node ansL, ansR; for(l+=n, r+=n; l<r; l/=2, r/=2) { if(l&1) ansL = op(ansL, st[l++]); if(r&1) ansR = op(st[--r], ansR); } Node ans = op(ansL, ansR); ll res=INF; forn(i,MAXH) forn(j,MAXH) { res=min(res,ans.cost[i][j]); } return res; } vll subtask4(vi h, vi l, vi r) { //no anda n=SIZE(h); forn(i,n) st[i+n]=Node(h[i]); dforn(i,n) st[i]=op(st[2*i],st[2*i+1]); int q=SIZE(l); vll ans(q); forn(i,q) ans[i]=query(l[i],r[i]+1); return ans; } vll minimum_costs(vi h, vi l, vi r) { int q=SIZE(l), n=SIZE(h); bool s4=q<=MAXN&&n<=MAXN; forn(i,n) s4&=h[i]<MAXH; if(s4) return subtask4(h,l,r); vll ans(q,INF); forn(i,n) { vi c(n); c[i]=h[i]; dforn(j,i) c[j]=max(c[j+1],h[j]); forsn(j,i+1,n) c[j]=max(c[j-1],h[j]); vll p(n+1); p[0]=0; forn(j,n) p[j+1]=p[j]+c[j]; forn(j,q) ans[j]=min(ans[j],p[r[j]+1]-p[l[j]]); } 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...