답안 #247564

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
247564 2020-07-11T16:20:16 Z xiryss Collecting Stamps 3 (JOI20_ho_t3) C++17
100 / 100
779 ms 129656 KB
//#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("fast-math")
/*#pragma GCC optimize("section-anchors")
#pragma GCC optimize("profile-values,profile-reorder-functions,tracer")
#pragma GCC optimize("vpt")
#pragma GCC optimize("rename-registers")
#pragma GCC optimize("move-loop-invariants")
#pragma GCC optimize("unswitch-loops")
#pragma GCC optimize("function-sections")
#pragma GCC optimize("data-sections")
#pragma GCC optimize("branch-target-load-optimize")
#pragma GCC optimize("branch-target-load-optimize2")
#pragma GCC optimize("btr-bb-exclusive")*/
//#pragma comment(linker, "/STACK:367077216")
#define _CRT_SECURE_NO_WARNINGS
#include <chrono>
#include <set>
#include <map>
#include <deque>
#include <string>
#include <cstdint>
#include <cmath>
#include <queue>
#include <cassert>
#include <random>
#include <bitset>
#include <iomanip>
#include <numeric>
#include <time.h>//////////////
#include <ctime>
#include <string>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
//++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++
//#define endl '\n'
#define mp make_pair
#define pbc push_back
#define pob pop_back()
#define empb emplace_back
#define queuel queue<long long>
#define sqr(a) ((a) * (a))
#define sqrl(a) (ll(a)*ll(a))
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define pin(p) cin >> p.first >> p.second;
#define uniq(a) sort(all(a));(a).resize(unique(all(a)) - a.begin());
#define rev(v) reverse(v.begin(), v.end());
#define sout(s, c) for (auto i : s) cout << i << c;
#define pout(p) cout << p.first << " " << p.second;
#define er(v, l, r) erase(v.begin() + l, v.begin() + r);
#define vin(v) for (ll i = 0; i < v.size(); ++i) cin >> v[i];
#define vout(v, c) for (int i = 0; i < v.size(); ++i) cout << v[i] << c;
#define pushi(v, a) for (int i = 0; i < a.size(); ++i) v.push_back(a[i]);
#define fastio() ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); srand(time(NULL))
#define dab(v) for(auto i:v)cout<<i<<' ';
#define sp system("pause")
//++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++
using namespace std;
//++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
//++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++
mt19937 rnd(time(0) + 228 + 'k' + 'e' + 'k' + 'e' + 'r' + 'o' + 'f' + 'e' + 'y');
vector<int> genvec(int sz, int minelem, int maxelem)
{
	++maxelem;
	vector<int> ans(sz);
	for (int i = 0; i < sz; ++i)
	{
		ans[i] = minelem + rnd() % (maxelem - minelem);
	}
	return ans;
}
const ld EPS = 1e-5;//(cos,-sin), (sin, cos)
bool checkprime(int x)
{
	for (int i = 2; i * i <= x; ++i) if (x % i == 0) return 0;
	return 1;
}
const ld PI = acos(-1);
const int MOD7 = 1000000007;
const int MOD9 = 1000000009;
const ll INF = 1e18;
int mod = MOD9;
const int inf = 1e9;
const int MAXN = 202;
int n, l;
vector<int> x(MAXN);
vector<int> t(MAXN);
inline int dist(int i, int j)
{
	return min(abs(x[i] - x[j]), l - abs(x[i] - x[j]));
}
ll dp[MAXN][MAXN][MAXN][2];
ll calc(int l, int r, int am, int flag)
{
	if (l < r && 0 < l) return 1e18;
	if (l == 0 && r == 0 && am == 0) return 0;
	if (l == r) return 1e18;
	if (am == -1) return 1e18;
	if (!am && l == 0 && flag)
	{
		dp[l][r][am][1] = dist(0, r);
		return dp[l][r][am][1];
	}
	if (dp[l][r][am][flag] != -1) return dp[l][r][am][flag];
	
	bool flg = 0;
	ll ansos = 1e18;
	if (l < r)
	{
		if (!flag && calc(l + 1, r, am - 1, 0) + dist(l + 1, l) <= t[l])
		{
			ansos = min(ansos, calc(l + 1, r, am - 1, 0) + dist(l, l + 1));
		}
		if (!flag && calc(l + 1, r, am - 1, 1) + dist(r, l) <= t[l])
		{
			ansos = min(ansos, calc(l + 1, r, am - 1, 1) + dist(r, l));
		}
		if (flag && calc(l, r - 1, am - 1, 0) + dist(l, r) <= t[r])
		{
			ansos = min(ansos, calc(l, r - 1, am - 1, 0) + dist(l, r));
		}
		if (flag && calc(l, r - 1, am - 1, 1) + dist(r, r - 1) <= t[r])
		{
			ansos = min(ansos, calc(l, r - 1, am - 1, 1) + dist(r, r - 1));
		}
		if (!flag)
			ansos = min({ ansos, calc(l + 1,r,am,0) + dist(l,l + 1), calc(l + 1,r,am,1) + dist(r,l) });
		else
			ansos = min({ ansos, calc(l, r - 1, am, 0) + dist(r, l), calc(l, r - 1, am, 1) + dist(r - 1, r) });
	}
	if (l > r)
	{
		if (!flag)ansos = min({ ansos, calc((l + 1) % (n + 1),r,am,0) + dist(l,(l + 1) % (n + 1)), calc((l + 1) % (n + 1),r,am,1) + dist(r,l) });
		else ansos = min({ ansos, calc(l, (r + n) % (n + 1), am, 0) + dist(l, r), calc(l, (r + n) % (n + 1), am, 1) + dist((r + n) % (n + 1), r) });
		if (!flag && calc((l + 1) % (n + 1), r, am - 1, 0) + dist(l, (l + 1) % (n + 1)) <= t[l])
		{
			ansos = min(ansos, calc((l + 1) % (n + 1), r, am - 1, 0) + dist(l, (l + 1) % (n + 1)));
		}
		if (!flag && calc((l + 1) % (n + 1), r, am - 1, 1) + dist(r, l) <= t[l])
		{
			ansos = min(ansos, calc((l + 1) % (n + 1), r, am - 1, 1) + dist(r, l));
		}
		if (flag && calc(l, (r + n) % (n + 1), am - 1, 0) + dist(l, r) <= t[r])
		{
			ansos = min(ansos, calc(l, (r + n) % (n + 1), am - 1, 0) + dist(l, r));
		}
		if (flag && calc(l, (r + n) % (n + 1), am - 1, 1) + dist(r, (r + n) % (n + 1)) <= t[r])
		{
			ansos = min(ansos, calc(l, (r + n) % (n + 1), am - 1, 1) + dist(r, (r + n) % (n + 1)));
		}
	}
	dp[l][r][am][flag] = ansos;
	return ansos;
}

int solve(vector<int> xx, vector<int> tt)
{
	vector<int> perm(xx.size() - 1);
	x = xx, t = tt;
	iota(all(perm), 1);
	int ans = 0;
	do {
		if (perm[0] != 1) break;

		int cnt = 0;
		ll tm = 0;
		int lt = 0;
		for (int i = 0; i < tt.size() - 1; ++i)
		{
			tm += dist(perm[i], lt);
			lt = perm[i];
			cnt += (tm <= tt[perm[i]]);
		}
		ans = max(ans, cnt);
	} while (next_permutation(all(perm)));
	iota(all(perm), 1);
	rev(perm);
	do {
		if (perm[0] != n) break;
		int cnt = 0;
		ll tm = 0;
		int lt = 0;
		for (	int i = 0; i < tt.size() - 1; ++i)
		{
			tm += dist(perm[i], lt);
			lt = perm[i];
			cnt += (tm <= tt[perm[i]]);
		}
		ans = max(ans, cnt);
	} while (prev_permutation(all(perm)));
	return ans;
}
int smart()
{
	for (int i = 0; i < MAXN; ++i) for (int j = 0; j < MAXN; ++j) for (int k = 0; k < MAXN; ++k) for (int kek = 0; kek < 2; ++kek) dp[i][j][k][kek] = -1;
	dp[0][0][0][0] = dp[0][0][0][1] = 0;
	for (int i = 0; i <= n; ++i) for (int j = 0; j <=n ; ++j) for (int k = 0; k <=n; ++k) for (int kek = 0; kek < 2; ++kek) calc(i, j, k, kek);
	for (int am = n; am >= 0; --am)
	{
		if (calc(0, n, am, 0) < 1e17)
		{
			return am;
		}
		if (calc(0, n, am, 1) < 1e17)
		{
			return am;
		}
//		cout << dp[0][1][1][1] << ' ' << dp[0][1][0][1] << ' ' << dp[0][2][1][1] << endl;
	//	cout << calc(0, 1, 0, 1);
		for (int l = n; l >= 1; --l)
		{
			if (calc(l, l - 1, am, 0) < 1e17 || calc(l, l - 1, am, 1) < 1e17)
			{
				return am;
			}
		}
	}
	return 0;
}
signed main()
{
	fastio();
//	int n, l;
	cin >> n >> l;
	x.resize(n + 1);
	t.resize(n + 1);
	for (int i = 1; i <= n; ++i) cin >> x[i];
	for (int i = 1; i <= n; ++i) cin >> t[i];
	cout << smart(); return 0;
	int tt;
	cin >> tt;
	for (int kek = 0; kek < tt; ++tt)
	{
		int sz = rnd() % 5 + 2;
		int lnn = rnd() % 100 + 3;
		auto tt = genvec(sz,0,100);
		auto xx = genvec(sz, 1, lnn - 1);
		rev(tt);
		tt.pbc(0);
		rev(tt);
		rev(xx);
		xx.pbc(0);
		rev(xx);
		sort(all(xx));
		n = sz;
		l = lnn;
		x = xx;
		t = tt;
		if (solve(xx, tt) != smart())
		{
			cout << sz << ' ' << lnn << endl;
			vout(xx, ' ');
			cout << endl;
			vout(tt, ' ');
			cout << endl;
			cout << solve(xx, tt) << endl;
			cout << smart() << endl;
			sp;
		}
 		//cout << solve(xx, tt) << ' ' <<smart()<<endl;

	}
	sp;
}
/*
5 64
4 10 11 40 47
1 14 39 78 30

*/

Compilation message

ho_t3.cpp: In function 'll calc(int, int, int, int)':
ho_t3.cpp:116:7: warning: unused variable 'flg' [-Wunused-variable]
  bool flg = 0;
       ^~~
ho_t3.cpp: In function 'int solve(std::vector<int>, std::vector<int>)':
ho_t3.cpp:178:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < tt.size() - 1; ++i)
                   ~~^~~~~~~~~~~~~~~
ho_t3.cpp:193:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for ( int i = 0; i < tt.size() - 1; ++i)
                    ~~^~~~~~~~~~~~~~~
ho_t3.cpp: In function 'int main()':
ho_t3.cpp:59:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define vout(v, c) for (int i = 0; i < v.size(); ++i) cout << v[i] << c;
                                    ~~^~~~~~~~~~
ho_t3.cpp:262:4: note: in expansion of macro 'vout'
    vout(xx, ' ');
    ^~~~
ho_t3.cpp:59:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define vout(v, c) for (int i = 0; i < v.size(); ++i) cout << v[i] << c;
                                    ~~^~~~~~~~~~
ho_t3.cpp:264:4: note: in expansion of macro 'vout'
    vout(tt, ' ');
    ^~~~
ho_t3.cpp:63:18: warning: ignoring return value of 'int system(const char*)', declared with attribute warn_unused_result [-Wunused-result]
 #define sp system("pause")
            ~~~~~~^~~~~~~~~
ho_t3.cpp:268:4: note: in expansion of macro 'sp'
    sp;
    ^~
ho_t3.cpp:63:18: warning: ignoring return value of 'int system(const char*)', declared with attribute warn_unused_result [-Wunused-result]
 #define sp system("pause")
            ~~~~~~^~~~~~~~~
ho_t3.cpp:273:2: note: in expansion of macro 'sp'
  sp;
  ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 67 ms 129400 KB Output is correct
2 Correct 73 ms 129400 KB Output is correct
3 Correct 70 ms 129400 KB Output is correct
4 Correct 70 ms 129400 KB Output is correct
5 Correct 84 ms 129400 KB Output is correct
6 Correct 73 ms 129400 KB Output is correct
7 Correct 70 ms 129400 KB Output is correct
8 Correct 73 ms 129400 KB Output is correct
9 Correct 69 ms 129400 KB Output is correct
10 Correct 68 ms 129380 KB Output is correct
11 Correct 74 ms 129400 KB Output is correct
12 Correct 68 ms 129400 KB Output is correct
13 Correct 74 ms 129400 KB Output is correct
14 Correct 70 ms 129400 KB Output is correct
15 Correct 72 ms 129528 KB Output is correct
16 Correct 71 ms 129400 KB Output is correct
17 Correct 69 ms 129400 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 67 ms 129400 KB Output is correct
2 Correct 73 ms 129400 KB Output is correct
3 Correct 70 ms 129400 KB Output is correct
4 Correct 70 ms 129400 KB Output is correct
5 Correct 84 ms 129400 KB Output is correct
6 Correct 73 ms 129400 KB Output is correct
7 Correct 70 ms 129400 KB Output is correct
8 Correct 73 ms 129400 KB Output is correct
9 Correct 69 ms 129400 KB Output is correct
10 Correct 68 ms 129380 KB Output is correct
11 Correct 74 ms 129400 KB Output is correct
12 Correct 68 ms 129400 KB Output is correct
13 Correct 74 ms 129400 KB Output is correct
14 Correct 70 ms 129400 KB Output is correct
15 Correct 72 ms 129528 KB Output is correct
16 Correct 71 ms 129400 KB Output is correct
17 Correct 69 ms 129400 KB Output is correct
18 Correct 80 ms 129404 KB Output is correct
19 Correct 77 ms 129400 KB Output is correct
20 Correct 68 ms 129400 KB Output is correct
21 Correct 86 ms 129400 KB Output is correct
22 Correct 158 ms 129424 KB Output is correct
23 Correct 189 ms 129400 KB Output is correct
24 Correct 69 ms 129400 KB Output is correct
25 Correct 97 ms 129400 KB Output is correct
26 Correct 71 ms 129400 KB Output is correct
27 Correct 70 ms 129400 KB Output is correct
28 Correct 68 ms 129400 KB Output is correct
29 Correct 70 ms 129400 KB Output is correct
30 Correct 116 ms 129400 KB Output is correct
31 Correct 71 ms 129400 KB Output is correct
32 Correct 80 ms 129400 KB Output is correct
33 Correct 95 ms 129400 KB Output is correct
34 Correct 70 ms 129400 KB Output is correct
35 Correct 80 ms 129360 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 67 ms 129400 KB Output is correct
2 Correct 73 ms 129400 KB Output is correct
3 Correct 70 ms 129400 KB Output is correct
4 Correct 70 ms 129400 KB Output is correct
5 Correct 84 ms 129400 KB Output is correct
6 Correct 73 ms 129400 KB Output is correct
7 Correct 70 ms 129400 KB Output is correct
8 Correct 73 ms 129400 KB Output is correct
9 Correct 69 ms 129400 KB Output is correct
10 Correct 68 ms 129380 KB Output is correct
11 Correct 74 ms 129400 KB Output is correct
12 Correct 68 ms 129400 KB Output is correct
13 Correct 74 ms 129400 KB Output is correct
14 Correct 70 ms 129400 KB Output is correct
15 Correct 72 ms 129528 KB Output is correct
16 Correct 71 ms 129400 KB Output is correct
17 Correct 69 ms 129400 KB Output is correct
18 Correct 394 ms 129400 KB Output is correct
19 Correct 219 ms 129400 KB Output is correct
20 Correct 137 ms 129400 KB Output is correct
21 Correct 211 ms 129452 KB Output is correct
22 Correct 264 ms 129400 KB Output is correct
23 Correct 128 ms 129400 KB Output is correct
24 Correct 101 ms 129400 KB Output is correct
25 Correct 129 ms 129344 KB Output is correct
26 Correct 81 ms 129432 KB Output is correct
27 Correct 126 ms 129400 KB Output is correct
28 Correct 96 ms 129404 KB Output is correct
29 Correct 124 ms 129444 KB Output is correct
30 Correct 101 ms 129400 KB Output is correct
31 Correct 117 ms 129400 KB Output is correct
32 Correct 85 ms 129400 KB Output is correct
33 Correct 117 ms 129400 KB Output is correct
34 Correct 207 ms 129400 KB Output is correct
35 Correct 125 ms 129400 KB Output is correct
36 Correct 82 ms 129400 KB Output is correct
37 Correct 113 ms 129436 KB Output is correct
38 Correct 90 ms 129400 KB Output is correct
39 Correct 120 ms 129400 KB Output is correct
40 Correct 92 ms 129400 KB Output is correct
41 Correct 534 ms 129512 KB Output is correct
42 Correct 342 ms 129400 KB Output is correct
43 Correct 523 ms 129400 KB Output is correct
44 Correct 324 ms 129400 KB Output is correct
45 Correct 548 ms 129404 KB Output is correct
46 Correct 305 ms 129400 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 67 ms 129400 KB Output is correct
2 Correct 73 ms 129400 KB Output is correct
3 Correct 70 ms 129400 KB Output is correct
4 Correct 70 ms 129400 KB Output is correct
5 Correct 84 ms 129400 KB Output is correct
6 Correct 73 ms 129400 KB Output is correct
7 Correct 70 ms 129400 KB Output is correct
8 Correct 73 ms 129400 KB Output is correct
9 Correct 69 ms 129400 KB Output is correct
10 Correct 68 ms 129380 KB Output is correct
11 Correct 74 ms 129400 KB Output is correct
12 Correct 68 ms 129400 KB Output is correct
13 Correct 74 ms 129400 KB Output is correct
14 Correct 70 ms 129400 KB Output is correct
15 Correct 72 ms 129528 KB Output is correct
16 Correct 71 ms 129400 KB Output is correct
17 Correct 69 ms 129400 KB Output is correct
18 Correct 80 ms 129404 KB Output is correct
19 Correct 77 ms 129400 KB Output is correct
20 Correct 68 ms 129400 KB Output is correct
21 Correct 86 ms 129400 KB Output is correct
22 Correct 158 ms 129424 KB Output is correct
23 Correct 189 ms 129400 KB Output is correct
24 Correct 69 ms 129400 KB Output is correct
25 Correct 97 ms 129400 KB Output is correct
26 Correct 71 ms 129400 KB Output is correct
27 Correct 70 ms 129400 KB Output is correct
28 Correct 68 ms 129400 KB Output is correct
29 Correct 70 ms 129400 KB Output is correct
30 Correct 116 ms 129400 KB Output is correct
31 Correct 71 ms 129400 KB Output is correct
32 Correct 80 ms 129400 KB Output is correct
33 Correct 95 ms 129400 KB Output is correct
34 Correct 70 ms 129400 KB Output is correct
35 Correct 80 ms 129360 KB Output is correct
36 Correct 394 ms 129400 KB Output is correct
37 Correct 219 ms 129400 KB Output is correct
38 Correct 137 ms 129400 KB Output is correct
39 Correct 211 ms 129452 KB Output is correct
40 Correct 264 ms 129400 KB Output is correct
41 Correct 128 ms 129400 KB Output is correct
42 Correct 101 ms 129400 KB Output is correct
43 Correct 129 ms 129344 KB Output is correct
44 Correct 81 ms 129432 KB Output is correct
45 Correct 126 ms 129400 KB Output is correct
46 Correct 96 ms 129404 KB Output is correct
47 Correct 124 ms 129444 KB Output is correct
48 Correct 101 ms 129400 KB Output is correct
49 Correct 117 ms 129400 KB Output is correct
50 Correct 85 ms 129400 KB Output is correct
51 Correct 117 ms 129400 KB Output is correct
52 Correct 207 ms 129400 KB Output is correct
53 Correct 125 ms 129400 KB Output is correct
54 Correct 82 ms 129400 KB Output is correct
55 Correct 113 ms 129436 KB Output is correct
56 Correct 90 ms 129400 KB Output is correct
57 Correct 120 ms 129400 KB Output is correct
58 Correct 92 ms 129400 KB Output is correct
59 Correct 534 ms 129512 KB Output is correct
60 Correct 342 ms 129400 KB Output is correct
61 Correct 523 ms 129400 KB Output is correct
62 Correct 324 ms 129400 KB Output is correct
63 Correct 548 ms 129404 KB Output is correct
64 Correct 305 ms 129400 KB Output is correct
65 Correct 434 ms 129400 KB Output is correct
66 Correct 400 ms 129528 KB Output is correct
67 Correct 372 ms 129400 KB Output is correct
68 Correct 365 ms 129528 KB Output is correct
69 Correct 423 ms 129528 KB Output is correct
70 Correct 471 ms 129528 KB Output is correct
71 Correct 390 ms 129484 KB Output is correct
72 Correct 526 ms 129528 KB Output is correct
73 Correct 386 ms 129528 KB Output is correct
74 Correct 409 ms 129452 KB Output is correct
75 Correct 779 ms 129400 KB Output is correct
76 Correct 538 ms 129400 KB Output is correct
77 Correct 470 ms 129528 KB Output is correct
78 Correct 383 ms 129528 KB Output is correct
79 Correct 357 ms 129528 KB Output is correct
80 Correct 513 ms 129400 KB Output is correct
81 Correct 358 ms 129400 KB Output is correct
82 Correct 403 ms 129528 KB Output is correct
83 Correct 500 ms 129656 KB Output is correct
84 Correct 424 ms 129544 KB Output is correct
85 Correct 471 ms 129400 KB Output is correct
86 Correct 427 ms 129528 KB Output is correct
87 Correct 388 ms 129448 KB Output is correct
88 Correct 514 ms 129528 KB Output is correct
89 Correct 510 ms 129492 KB Output is correct
90 Correct 380 ms 129456 KB Output is correct
91 Correct 546 ms 129452 KB Output is correct
92 Correct 516 ms 129504 KB Output is correct
93 Correct 711 ms 129492 KB Output is correct