Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstdlib>
- #include <vector>
- #include <set>
- #include <map>
- #include <cassert>
- #include <ctime>
- #include <cmath>
- #include <string>
- #include <cstring>
- #include <queue>
- using namespace std;
- #define f first
- #define s second
- #define mp make_pair
- #define pb push_back
- #define pii pair<int, int>
- #define vi vector<int>
- #define all(v) (v).begin(), (v).end()
- #define forit(it,v) for (typeof(v.begin()) it = v.begin(); it != v.end(); ++it)
- #define f0(a) memset(a, 0, sizeof(a))
- #define ll long long
- #ifdef WIN32
- #define I64 "%I64d"
- #else
- #define I64 "%lld"
- #endif
- int n, k;
- pair<pii, int> a[10000];
- bool dp[105][2][5000], fr[105][52][5000];
- int size[1000], from[1000];
- int main() {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- scanf("%d%d", &n, &k);
- for (int i = 0; i < n; ++i) {
- int c, l;
- scanf("%d%d", &l, &c);
- a[i] = mp(mp(c, l), i);
- }
- sort(a, a + n);
- int needsum = 0;
- for (int l = 0; l < n; ++l) {
- int r = l;
- int type = a[l].f.f;
- while (r < n && type == a[r].f.f) ++r;
- int sum = 0;
- for (int i = l; i < r; ++i)
- sum += a[i].f.s;
- if (type == 1) needsum = sum;
- if (sum != needsum) {
- puts("NO");
- return 0;
- }
- size[type] = r - l;
- from[type] = l;
- dp[type][0][0] = true;
- for (int i = 0; i < r - l; ++i)
- {
- for (int j = 0; j <= sum; ++j) if (dp[type][0][j]) {
- if (j + a[i + l].f.s <= sum) {
- dp[type][1][j + a[i + l].f.s] = true;
- fr[type][i + 1][j + a[i + l].f.s] = true;
- }
- dp[type][1][j] = true;
- fr[type][i + 1][j] = false;
- }
- for (int j = 0; j <= sum; ++j) {
- dp[type][0][j] = dp[type][1][j];
- dp[type][1][j] = false;
- }
- }
- l = r - 1;
- }
- int weight = -1;
- for (int i = 1; i < needsum; ++i) {
- bool ok = true;
- for (int j = 1; ok && j <= k; ++j)
- if (!dp[j][0][i]) ok = false;
- if (ok) {
- puts("YES");
- weight = i;
- break;
- }
- }
- if (weight == -1) {
- puts("NO");
- return 0;
- }
- vi ansv;
- for (int type = 1; type <= k; ++type) {
- int j = weight;
- for (int i = size[type]; i > 0; --i) {
- if (fr[type][i][j]) {
- ansv.pb(a[from[type] + i - 1].s);
- j -= a[from[type] + i - 1].f.s;
- }
- }
- }
- sort(all(ansv));
- forit(it, ansv)
- printf("%d ", *it + 1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment