답안 #797965

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
797965 2023-07-30T08:03:19 Z Sam_a17 Zalmoxis (BOI18_zalmoxis) C++17
100 / 100
134 ms 20424 KB
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
// #include <atcoder/all>
#include <cstdio>
using namespace std;
 
#ifndef ONLINE_JUDGE
#define dbg(x) cerr << #x <<" "; print(x); cerr << endl;
#else
#define dbg(x)
#endif
 
#define sz(x) (int((x).size()))
#define len(x) (int)x.length()
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define clr(x) (x).clear()
#define blt(x) __builtin_popcount(x)
#define uniq(x) x.resize(unique(all(x)) - x.begin());
 
#define pb push_back
#define popf pop_front
#define popb pop_back
#define ld long double
#define ll long long
 
void print(long long t) {cerr << t;}
void print(int t) {cerr << t;}
void print(string t) {cerr << t;}
void print(char t) {cerr << t;}
void print(double t) {cerr << t;}
void print(unsigned long long t) {cerr << t;}
void print(long double t) {cerr << t;}
 
template <class T, class V> void print(pair <T, V> p);
template <class T> void print(vector <T> v);
template <class T> void print(set <T> v);
template <class T, class V> void print(map <T, V> v);
template <class T> void print(multiset <T> v);
template <class T> void print(T v[],T n) {cerr << "["; for(int i = 0; i < n; i++) {cerr << v[i] << " ";} cerr << "]";}
template <class T, class V> void print(pair <T, V> p) {cerr << "{"; print(p.first); cerr << ","; print(p.second); cerr << "}";}
template <class T> void print(vector <T> v) {cerr << "[ "; for (T i : v) {print(i); cerr << " ";} cerr << "]";}
template <class T> void print(deque <T> v) {cerr << "[ "; for (T i : v) {print(i); cerr << " ";} cerr << "]";}
template <class T> void print(set <T> v) {cerr << "[ "; for (T i : v) {print(i); cerr << " ";} cerr << "]";}
template <class T> void print(multiset <T> v) {cerr << "[ "; for (T i : v) {print(i); cerr << " ";} cerr << "]";}
template <class T, class V> void print(map <T, V> v) {cerr << "[ "; for (auto i : v) {print(i); cerr << " ";} cerr << "]";}
 
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
#define nl '\n'
 
// for random generations
mt19937 myrand(chrono::steady_clock::now().time_since_epoch().count());
// mt19937 myrand(131);
 
// for grid problems
int dx[8] = {1,0,-1,0,1,-1,1,-1};
int dy[8] = {0,1,0,-1,1,1,-1,-1};
char ch[4] = {'v', '>', '^', '<'};
 
long long ka() {
    long long x = 0;
    bool z = false;
    while (1)
    {
        char y = getchar();
        if (y == '-')
            z = true;
        else if ('0' <= y && y <= '9')
            x = x * 10 + y - '0';
        else
        {
            if (z)
                x *= -1;
            return x;
        }
    }
}
 
// lowest / (1 << 17) >= 1e5 / (1 << 18) >= 2e5 / (1 << 21) >= 1e6
void fastIO() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr); cout.tie(nullptr);
}
// file in/out
void setIO(string str = "") {
  fastIO();
 
  if (str != "") {
    freopen((str + ".in").c_str(), "r", stdin);
    freopen((str + ".out").c_str(), "w", stdout);
  } else if(str == "input") {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
  }
}
 
// Indexed Set
template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

const int N = 1e6 + 10;
int a[N], ind;
int n, k;
vector<int> ans, can_del;

void dfs(int node) {
  if(node == a[ind]) {
    ans.push_back(a[ind]);
    can_del.push_back(0);
    ind++;
    return;
  }

  if(node - 1 < a[ind]) {
    ans.push_back(node);
    can_del.push_back(1);
    return;
  }

  dfs(node - 1);
  dfs(node - 1);
}

void solve_() {
  cin >> n >> k;

  for(int i = 0; i < n; i++) {
    cin >> a[i];
  }

  a[n] = 100;

  dfs(30);

  assert(sz(ans) <= (n + k));

  int need = (n + k) - sz(ans);

  vector<int> new_ans;
  for(int i = 0; i < sz(ans); i++) {
    if(!can_del[i]) {
      new_ans.push_back(ans[i]);
      continue;
    }
    if(!need) {
      new_ans.push_back(ans[i]);
      continue;
    }
    int cur = ans[i], pw = 1;

    while(cur >= 1 && need >= 2 * pw - 1) {
      pw *= 2;
      cur--;
    }

    need -= pw - 1;
    if(cur >= 1) {
      for(int j = 0; j < pw; j++) {
        if(need) {
          new_ans.push_back(cur - 1);
          new_ans.push_back(cur - 1);
          need--;
        } else {
          new_ans.push_back(cur);
        }
      }
    } else {
      for(int j = 0; j < pw; j++) {
        new_ans.push_back(cur);
      }
    }
  }

  assert(sz(new_ans) == (n + k));
  for(auto i: new_ans) {
    cout << i << " ";
  }
  cout << '\n';
}
 
int main() {
  setIO();
 
  auto solve = [&](int test_case)-> void {
    while(test_case--) {
      solve_();
    }
  };
 
  int test_cases = 1; 
  // cin >> test_cases;
  solve(test_cases);
 
  return 0;
}

Compilation message

zalmoxis.cpp: In function 'void setIO(std::string)':
zalmoxis.cpp:90:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   90 |     freopen((str + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
zalmoxis.cpp:91:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   91 |     freopen((str + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
zalmoxis.cpp:93:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |     freopen("input.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
zalmoxis.cpp:94:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |     freopen("output.txt", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 111 ms 20424 KB Output is correct
2 Correct 106 ms 20188 KB Output is correct
3 Correct 105 ms 20264 KB Output is correct
4 Correct 106 ms 20224 KB Output is correct
5 Correct 105 ms 20292 KB Output is correct
6 Correct 110 ms 20368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 105 ms 20276 KB Output is correct
2 Correct 104 ms 20232 KB Output is correct
3 Correct 104 ms 20240 KB Output is correct
4 Correct 105 ms 20196 KB Output is correct
5 Correct 134 ms 20244 KB Output is correct
6 Correct 104 ms 20228 KB Output is correct
7 Correct 106 ms 20276 KB Output is correct
8 Correct 106 ms 20320 KB Output is correct
9 Correct 104 ms 18528 KB Output is correct
10 Correct 69 ms 11524 KB Output is correct
11 Correct 82 ms 14632 KB Output is correct
12 Correct 48 ms 6292 KB Output is correct
13 Correct 47 ms 6376 KB Output is correct
14 Correct 46 ms 6324 KB Output is correct