Submission #601881

#TimeUsernameProblemLanguageResultExecution timeMemory
601881Hanksburger모임들 (IOI18_meetings)C++17
36 / 100
538 ms313476 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; long long mx[5005][5005], sum[5005][5005]; vector<pair<int, int> > v; vector<long long> ans; int seg[3000005]; void build(int i, int l, int r) { if (l==r) { seg[i]=v[l].second-v[l].first+1; return; } int m=(l+r)/2; build(i*2, l, m); build(i*2+1, m+1, r); seg[i]=max(seg[i*2], seg[i*2+1]); } int query(int i, int l, int r, int ql, int qr) { if (ql<=l && r<=qr) return seg[i]; int m=(l+r)/2, res=0; if (l<=qr && ql<=m) res=max(res, query(i*2, l, m, ql, qr)); if (m+1<=qr && ql<=r) res=max(res, query(i*2+1, m+1, r, ql, qr)); return res; } vector<long long> minimum_costs(vector<int> a, vector<int> l, vector<int> r) { int n=a.size(), q=l.size(); if (n<=5000 && q<=5000) { for (int i=0; i<n; i++) { mx[i][i]=sum[i][i]=a[i]; for (int j=i+1; j<n; j++) { mx[i][j]=max(mx[i][j-1], (long long)a[j]); sum[i][j]=sum[i][j-1]+mx[i][j]; } for (int j=i-1; j>=0; j--) sum[i][j]=sum[i][j+1]+mx[j][i]; } for (int i=0; i<q; i++) { long long mn=1e18; for (int j=l[i]; j<=r[i]; j++) mn=min(mn, sum[j][l[i]]+sum[j][r[i]]-a[j]); ans.push_back(mn); } return ans; } int ind=0, sz; for (int i=1; i<n; i++) { if (a[i-1]==1 && a[i]==2) v.push_back({ind, i-1}); else if (a[i-1]==2 && a[i]==1) ind=i; } if (a[n-1]==1) v.push_back({ind, n-1}); sz=v.size(); if (!sz) { for (int i=0; i<q; i++) ans.push_back((r[i]-l[i]+1)*2); return ans; } build(1, 0, sz-1); for (int i=0; i<q; i++) { int res=0; if (l[i] && a[l[i]-1]==1 && a[l[i]]==1) { int x=lower_bound(v.begin(), v.end(), make_pair(l[i], 0))-v.begin()-1; res=max(res, min(r[i], v[x].second)-l[i]+1); } if (r[i]<=n-2 && a[r[i]]==1 && a[r[i]+1]==1) { int x=lower_bound(v.begin(), v.end(), make_pair(r[i]+1, 0))-v.begin()-1; res=max(res, r[i]-max(l[i], v[x].first)+1); } int x=lower_bound(v.begin(), v.end(), make_pair(l[i], 0))-v.begin(); int y=lower_bound(v.begin(), v.end(), make_pair(r[i]+1, 0))-v.begin()-1; if (y>=0 && v[y].second>r[i]) y--; if (x>=0 && x<=y) res=max(res, query(1, 0, sz-1, x, y)); ans.push_back((r[i]-l[i]+1)*2-res); } 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...