Submission #82589

# Submission time Handle Problem Language Result Execution time Memory
82589 2018-10-31T14:39:59 Z luciocf San (COCI17_san) C++14
120 / 120
251 ms 3192 KB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 45;

typedef long long ll;
typedef pair<int, int> pii;

int n;

pii num[maxn], b[maxn];

vector<ll> v[maxn];

void compress(void)
{
	map<int, int> M;
	vector<int> cc;

	for (int i = 0; i < n; i++)
		cc.push_back(num[i].first);

	sort(cc.begin(), cc.end());

	int ind = 0;
	for (auto x: cc)
		if (M.find(x) == M.end())
			M[x] = ++ind;

	for (int i = 0; i < n; i++)
		num[i].first = M[num[i].first];
}

int main(void)
{
	ios::sync_with_stdio(false); cin.tie(0);

	ll k;
	cin >> n >> k;

	for (int i = 0; i < n; i++)
		cin >> num[i].first >> num[i].second;

	compress();

	int m = n/2;

	for (int i = m; i < n; i++)
		b[i-m] = num[i];

	ll ans = 0LL;
	for (int mask = 1; mask < (1<<m); mask++)
	{
		int atual = 0;
		ll soma = 0LL;

		bool ok = 1;
		for (int i = 0; i < m; i++)
		{
			if (!(mask&(1<<i))) continue;

			if (num[i].first < atual)
			{
				ok = 0;
				break;
			}

			soma += (ll) num[i].second;
			atual = num[i].first;
		}

		if (ok)
		{
			if (soma >= k) ans++;

			v[atual].push_back(soma);
		}
	}

	for (int i = 1; i <= n; i++)
		sort(v[i].begin(), v[i].end());

	int mm = n-m;
	for (int mask = 1; mask < (1<<mm); mask++)
	{
		int atual = 0, first = -1;
		ll soma = 0LL;

		bool ok = 1;
		for (int i = 0; i < mm; i++)
		{
			if (!(mask&(1<<i))) continue;

			if (b[i].first < atual)
			{
				ok = 0;
				break;
			}

			if (first == -1) first = b[i].first;

			soma += (ll) b[i].second;
			atual = b[i].first;
		}

		if (ok)
		{
			if (soma >= k) ans++;

			for (int i = 1; i <= first; i++)
			{
				vector<ll>::iterator it = lower_bound(v[i].begin(), v[i].end(), k-soma);
				ans += (ll)((int)(v[i].end()-it));
			}
		}
	}

	cout << ans << "\n";
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 508 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 508 KB Output is correct
2 Correct 2 ms 508 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 21 ms 848 KB Output is correct
2 Correct 5 ms 848 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 49 ms 1396 KB Output is correct
2 Correct 22 ms 1396 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 251 ms 3192 KB Output is correct
2 Correct 134 ms 3192 KB Output is correct