이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <chrono>
#include <random>
#include <cassert>
std::mt19937 rng((int) std::chrono::steady_clock::now().time_since_epoch().count());
const int ms = 1001000;
int n, k;
int a[ms], b[ms];
int main() {
std::ios_base::sync_with_stdio(false); std::cin.tie(NULL);
std::cin >> n >> k;
for(int i = 0; i < n; i++) {
std::cin >> a[i];
}
for(int p = 0; p < 30; p++) {
int j = 0;
for(int i = 0; i < n;) {
if(std::abs(a[i]) > p) {
b[j++] = a[i++];
} else {
int sum = 0;
//std::cout << "starting from " << i << std::endl;
while(i < n && std::abs(a[i]) <= p) {
b[j++] = a[i];
sum += 1 << std::abs(a[i++]);
}
//std::cout << "sum " << sum << ", ending at " << i << std::endl;
sum %= 1 << (p+1);
assert(sum == 0 || sum == (1 << p));
if(sum) {
b[j++] = -p;
k--;
}
}
}
n = j;
std::swap(a, b);
}
for(int i = 0; i < n; i++) {
if(a[i] >= 0) {
std::cout << a[i] << ' ';
continue;
}
std::vector<int> wtf(1, -a[i]);
while(!wtf.empty()) {
if(k == 0 || wtf.back() == 0) {
std::cout << wtf.back() << ' ';
wtf.pop_back();
continue;
} else {
int val = wtf.back();
wtf.pop_back();
wtf.push_back(val-1);
wtf.push_back(val-1);
k--;
}
}
}
std::cout << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |