Submission #465308

# Submission time Handle Problem Language Result Execution time Memory
465308 2021-08-15T14:41:00 Z dattranxxx Stove (JOI18_stove) C++11
0 / 100
1 ms 332 KB
/*
 * Author :  shora
 */
#include <bits/stdc++.h>
#define print(_v) for (auto &_ : _v) {cerr << _ << ' ';} cerr << endl;
using namespace std;
using ll = long long;
const int oo = 1e9;
const int N = 1e5;
int n, k;
int a[N+1], spt[N+1][20], log_2[N+1];
int get(int l, int r) {
	int e = log_2[r - l + 1];
	// [0, 10] = [0, 7], [3, 10]
	int x = a[spt[l][e]] - a[spt[l][e] + 1];
	int y = a[spt[r - (1 << e) + 1][e]] - a[spt[r - (1 << e) + 1][e] + 1];
	if (x < y)
		return spt[l][k];
	else
		return spt[r - (1 << e) + 1][e];
}
int h(int l, int r) {
	if (l == r) 
		return oo;
  int m = get(l, r-1);
  return a[m] - a[l] + 1 + a[r] - a[m+1] + 1 - (a[r] - a[l] + 1);
}
struct S {
	int l, r;
	S(int l, int r): l(l), r(r) {}
	friend bool operator < (const S& u, const S& v) {
		return h(u.l, u.r) > h(v.l, v.r);
	}
	friend ostream& operator << (ostream& os, const S& s) {
		os << '[' << s.l << ", " << s.r << ']';
	}
};
void build() {
	for (int i = 2; i <= n; ++i)
		log_2[i] = log_2[i / 2] + 1;
	for (int i = 1; i < n; ++i)
		spt[i][0] = i;
	for (int j = 1; j <= log_2[n]; ++j) {
		for (int i = 1; i + (1 << j) - 1 < n; ++i) {
			// [0, 7] = [0, 3] [4, 7]
			int x = a[spt[i][j-1]] - a[spt[i][j-1] + 1];
			int y = a[spt[i + (1 << (j-1))][j-1]] - a[spt[i + (1 << (j-1))][j-1] + 1];
			if (x < y) 
				spt[i][j] = spt[i][j-1];
			else 
				spt[i][j] = spt[i + (1 << (j-1))][j-1];
		}
	}
}
int main() {
  cin.tie(0)->sync_with_stdio(0); cout.tie(0);
  cin >> n >> k;
  for (int i = 1; i <= n; ++i)
  	cin >> a[i];
  build();
  priority_queue<S> q;
  q.push(S(1, n));
  int cur = a[n] - a[1] + 1, res = cur;
  for (int i = 2; i <= k; ++i) {
  	S s = q.top(); q.pop();
  	res = min(res, cur);
  	int l = s.l, r = s.r;
  	cur -= a[r] - a[l] + 1;
  	// tim m thuoc [l, r-1] minimize a[m]-a[l]+1 + a[r] - a[m+1]+1
  	// <> minimize a[m]-a[m+1]
  	int m = get(l, r-1);
  	cur += a[m] - a[l] + 1;
  	cur += a[r] - a[m+1] + 1;
  	q.push(S(l, m));
  	q.push(S(m+1, r));
	}
	cout << res;
  
  return 0;
}

Compilation message

stove.cpp: In function 'std::ostream& operator<<(std::ostream&, const S&)':
stove.cpp:36:2: warning: no return statement in function returning non-void [-Wreturn-type]
   36 |  }
      |  ^
# Verdict Execution time Memory Grader output
1 Correct 0 ms 332 KB Output is correct
2 Incorrect 1 ms 332 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 332 KB Output is correct
2 Incorrect 1 ms 332 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 332 KB Output is correct
2 Incorrect 1 ms 332 KB Output isn't correct
3 Halted 0 ms 0 KB -