# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1112386 | thelegendary08 | 모임들 (IOI18_meetings) | C++14 | 73 ms | 2520 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "meetings.h"
#include<bits/stdc++.h>
#define vi vector<int>
#define vb vector<bool>
#define vpii vector<pair<int,int>>
#define pb push_back
#define vvi vector<vector<int>>
#define ll long long int
#define f0r(i,n) for(int i = 0; i<n; i++)
#define vout(v) for(auto u : v)cout<<u<<' '; cout<<'\n';
#define pii pair<int,int>
#define FOR(i,k,n) for(int i = k; i<n; i++)
using namespace std;
std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L,
std::vector<int> R) {
int q = L.size();
std::vector<long long> ans(q);
vi v = H;
int n = v.size();
//n <= 3000 && q <= 10
if(n <= 3000 && q <= 10){
f0r(i, q){
int l = L[i];
int r = R[i];
ll cur = 4e18;
for(int j = l; j <= r; j++){
ll s = 0;
int runmx = v[j];
for(int k = j; k >= l; k--){
runmx = max(runmx, v[k]);
s += runmx;
}
runmx = v[j];
for(int k = j+1; k<=r; k++){
runmx = max(runmx, v[k]);
s += runmx;
}
cur = min(cur,s);
//cout<<s<<'\n';
}
ans[i] = cur;
}
}
else{
vpii s;
int cnt = 0;
f0r(i, n){
if(v[i] == 1){
cnt++;
}
else{
if(cnt > 0){
s.pb({cnt, i - cnt});
cnt = 0;
}
}
}
if(cnt > 0){
s.pb({cnt, n - cnt});
}
vi dexes;
f0r(i, s.size())dexes.pb(s[i].second);
vi nums;
f0r(i,s.size())nums.pb(s[i].first);
//vout(dexes);
//vout(nums);
int spt[nums.size()][17];
f0r(i, nums.size()){
spt[i][0] = nums[i];
}
//cout<<nums.size()<<'\n';
FOR(i, 1, 17){
//if(i >2)cout<<(int)nums.size() - (1 << i) + 1<<'\n';
//else{
f0r(j, (int)nums.size() - (1 << i) + 1){
spt[j][i] = max(spt[j][i-1], spt[j + (1 << (i-1))][i-1]);
}
//}
}
f0r(i, q){
int l = L[i];
int r = R[i];
int fb = upper_bound(dexes.begin(), dexes.end(), l) - dexes.begin() - 1;
int mx = 0;
if(fb >= 0 && s[fb].first + s[fb].second - 1 >= l){
mx = max(mx, s[fb].first + s[fb].second - 1 - l + 1);
}
int lastone = upper_bound(dexes.begin(), dexes.end(), r) - dexes.begin() - 1;
if(lastone >= 0 && s[lastone].first + s[lastone].second - 1 > r){
mx = max(mx, r - s[lastone].second + 1);
int left = fb + 1;
int right = lastone - 1;
if(left <= right){
int msb = floor(log2(right - left + 1));
mx = max(mx, max(spt[left][msb], spt[right - (1 << msb) + 1][msb]));
}
}
else{
int left = fb + 1;
int right = lastone;
if(left <= right){
int msb = floor(log2(right - left + 1));
mx = max(mx, max(spt[left][msb], spt[right - (1 << msb) + 1][msb]));
}
}
if(lastone == fb){
ans[i] = r - l + 1;
}
else{
ans[i] = (2 * (r - l + 1) - mx);
}
}
}
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
# | 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... |