Submission #406088

# Submission time Handle Problem Language Result Execution time Memory
406088 2021-05-17T08:22:36 Z maomao90 The short shank; Redemption (BOI21_prison) C++17
20 / 100
1494 ms 100296 KB
#include <bits/stdc++.h> 
using namespace std;

#define mnto(x, y) x = min(x, (__typeof__(x)) y)
#define mxto(x, y) x = max(x, (__typeof__(x)) y)
#define REP(i, s, e) for (int i = s; i < e; i++)
#define RREP(i, s, e) for (int i = s; i >= e; i--)
typedef long long ll;
typedef long double ld;
#define MP make_pair
#define FI first
#define SE second
typedef pair<int, int> ii;
typedef pair<ll, ll> pll;
#define MT make_tuple
typedef tuple<int, int, int> iii;
#define ALL(_a) _a.begin(), _a.end()
#define pb emplace_back
typedef vector<int> vi;
typedef vector<ii> vii;

#define INF 1000000005
#define LINF 1000000000000000005
#define MOD 1000000007
#define MAXN 2000005
#define MAXL 22

int n, d, t;
int ti[MAXN];
ll dp[2][MAXN];
int lst[MAXN];
ii p[MAXL][MAXN];

int fw[MAXN];
void incre(int p, int v) {
	for (; p <= n; p += p & -p) mxto(fw[p], v);
}
int query(int p) {
	int res = 0;
	for (; p > 0; p -= p & -p) mxto(res, fw[p]);
	return res;
}

ll cost(int l, int r) {
	ll res = 0;
	int cur = l;
	RREP (k, MAXL - 1, 0) {
		if (p[k][cur].FI != -1 && p[k][cur].FI <= r) {
			res += p[k][cur].SE;
			cur = p[k][cur].FI;
		}
	}
	//assert(p[0][cur].FI > r || p[0][cur].FI == -1);
	if (p[0][cur].SE > 0) {
		res += r - cur + 1;
	}
	return res;
}

void dnc(int i, int lo, int hi, int optl, int optr) {
	if (lo > hi) return;
	int j = lo + hi >> 1;
	int opt = -1;
	dp[i % 2][j] = LINF;
	REP (k, max(1, optl), min(optr + 1, j)) {
		if (dp[i % 2][j] > dp[(i - 1) % 2][k] + cost(k + 1, j)) {
			dp[i % 2][j] = dp[(i - 1) % 2][k] + cost(k + 1, j);
			opt = k;
		}
	}
	dnc(i, lo, j - 1, optl, opt);
	dnc(i, j + 1, hi, opt, optr);
}

int main() {
	scanf("%d%d%d", &n, &d, &t);
	REP (i, 1, n + 1) {
		scanf("%d", &ti[i]);
		fw[i] = -1;
	}
	RREP (i, n, 1) {
		int r = min(n, t - ti[i] + i);
		if (ti[i] > t) r = -1;
		if (r != -1) {
			mxto(r, query(r));
		}
		incre(i, r);
		lst[i] = r;
	}
	REP (i, 1, n + 1) {
		if (lst[i] != -1) {
			p[0][i] = MP(lst[i], lst[i] - i + 1);
		} else {
			p[0][i] = MP(i + 1, 0);
		}
		if (i == n) {
			p[0][i] = MP(-1, 0);
		}
	}
	REP (k, 1, MAXL) {
		REP (i, 1, n + 1) {
			if (p[k - 1][i].FI == -1) {
			   	p[k][i] = p[k - 1][i];
			} else {
				p[k][i] = p[k - 1][p[k - 1][i].FI];
				p[k][i].SE += p[k - 1][i].SE;
			}
		}
	}
	REP (i, 1, n + 1) {
		dp[0][i] = cost(1, i);
	}
	REP (i, 1, d + 1) {
		dnc(i, 1, n, 1, n);
	}
	printf("%lld\n", dp[d % 2][n]);
	return 0;
}

/*
5 1 42                          
13 37 47 11 42

5 2 5 
1 9 4 6 7
*/

Compilation message

prison.cpp: In function 'void dnc(int, int, int, int, int)':
prison.cpp:62:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   62 |  int j = lo + hi >> 1;
      |          ~~~^~~~
prison.cpp: In function 'int main()':
prison.cpp:76:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |  scanf("%d%d%d", &n, &d, &t);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
prison.cpp:78:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |   scanf("%d", &ti[i]);
      |   ~~~~~^~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 464 KB Output is correct
2 Correct 3 ms 588 KB Output is correct
3 Correct 6 ms 588 KB Output is correct
4 Correct 14 ms 608 KB Output is correct
5 Incorrect 20 ms 604 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 460 KB Output is correct
2 Correct 633 ms 100272 KB Output is correct
3 Correct 631 ms 100176 KB Output is correct
4 Correct 653 ms 100284 KB Output is correct
5 Correct 745 ms 100284 KB Output is correct
6 Correct 842 ms 100232 KB Output is correct
7 Correct 894 ms 100288 KB Output is correct
8 Correct 800 ms 100296 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 464 KB Output is correct
2 Correct 3 ms 588 KB Output is correct
3 Correct 6 ms 588 KB Output is correct
4 Correct 14 ms 608 KB Output is correct
5 Incorrect 20 ms 604 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 460 KB Output is correct
2 Correct 948 ms 15464 KB Output is correct
3 Correct 844 ms 15460 KB Output is correct
4 Correct 1069 ms 15468 KB Output is correct
5 Correct 1159 ms 15464 KB Output is correct
6 Correct 1156 ms 15556 KB Output is correct
7 Correct 1241 ms 15460 KB Output is correct
8 Correct 1270 ms 15464 KB Output is correct
9 Correct 1468 ms 15460 KB Output is correct
10 Correct 1494 ms 15460 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 464 KB Output is correct
2 Correct 3 ms 588 KB Output is correct
3 Correct 6 ms 588 KB Output is correct
4 Correct 14 ms 608 KB Output is correct
5 Incorrect 20 ms 604 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 464 KB Output is correct
2 Correct 3 ms 588 KB Output is correct
3 Correct 6 ms 588 KB Output is correct
4 Correct 14 ms 608 KB Output is correct
5 Incorrect 20 ms 604 KB Output isn't correct
6 Halted 0 ms 0 KB -