제출 #549046

#제출 시각아이디문제언어결과실행 시간메모리
549046cig32사탕 분배 (IOI21_candies)C++17
3 / 100
5197 ms2097152 KiB
#include "candies.h" #include "bits/stdc++.h" using namespace std; #include <cassert> #include <cstdio> #include <vector> std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l, std::vector<int> r, std::vector<int> v) { int n = c.size(); std::vector<int> s(n); int q = l.size(); vector<long long> list[n]; for(int i=0; i<n; i++) { list[i].push_back(1e15); list[i].push_back(-1e15); } for(int i=0; i<q; i++) { for(int j=l[i]; j<=r[i]; j++) list[j].push_back(v[i]); } for(int i=0; i<n; i++) { int k = list[i].size(); long long ps[k]; ps[0] = list[i][0]; for(int j=1; j<k; j++) ps[j] = ps[j-1] + list[i][j]; long long smax[k], smin[k]; smax[k-1] = ps[k-1]; smin[k-1] = ps[k-1]; for(int j=k-2; j>=0; j--) { smax[j] = max(smax[j+1], ps[j]); smin[j] = min(smin[j+1], ps[j]); } int lb = 0, rb = k - 1; while(lb < rb) { int mid = (lb + rb + 1) >> 1; if(smax[mid] - smin[mid] >= c[i]) lb = mid; else rb = mid - 1; } if(smax[lb] - smin[lb] >= c[i]) { if(smax[lb] == ps[lb]) { s[i] = ps[k-1] - smin[lb]; } else { s[i] = ps[k-1] - (smax[lb] - c[i]); } } else { s[i] = ps[k-1]; } } return s; }
#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...