IanisBelu

Monkeys in the Emei Mountain

Oct 13th, 2023
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | Source Code | 0 0
  1. #pragma GCC optimize("Ofast,unroll-loops")
  2. #include <bits/stdc++.h>
  3.  
  4. #define sz(a) ((int)(a).size())
  5. #define all(a) (a).begin(), (a).end()
  6.  
  7. #define fi first
  8. #define se second
  9.  
  10. #define YES cout << "Yes" << endl
  11. #define NO  cout << "No" << endl
  12.  
  13. using namespace std;
  14.  
  15. #ifndef LOCAL
  16. #define endl '\n'
  17. #endif
  18.  
  19. typedef long long ll;
  20. typedef pair<int, int> pii;
  21.  
  22. const int NMAX = 105;
  23. const int VMAX = 5e4+5;
  24. const int INF = 2e9+5;
  25. const int SOURCE = 0;
  26. const int SINK = NMAX + VMAX - 1;
  27.  
  28. struct Edge {
  29.     int dest, flow, rev;
  30. };
  31.  
  32. struct Monkey {
  33.     int v, l, r;
  34. };
  35.  
  36. int n, m;
  37. vector<Edge> g[VMAX + NMAX];
  38. int d[VMAX + NMAX], last[VMAX + NMAX];
  39. Monkey a[NMAX];
  40. vector<pii> ans[NMAX];
  41.  
  42. void io() {
  43. #ifdef LOCAL
  44.     freopen("input.txt", "r", stdin);
  45. #else
  46.     ios_base::sync_with_stdio(false);
  47.     cin.tie(0);
  48.     cout.tie(0);
  49. #endif
  50. }
  51.  
  52. void read() {
  53.     cin >> n >> m;
  54.     if (n == 0) exit(0);
  55.     for (int i = 1; i <= n; i++) {
  56.         cin >> a[i].v >> a[i].l >> a[i].r;
  57.         a[i].l++;
  58.     }
  59. }
  60.  
  61. void add_edge(int x, int y, int c) {
  62.     g[x].push_back({ y, c, sz(g[y]) });
  63.     g[y].push_back({ x, 0, sz(g[x]) - 1 });
  64. }
  65.  
  66. bool bfs() {
  67.     memset(d, 0, sizeof(d));
  68.     memset(last, 0, sizeof(last));
  69.  
  70.     queue<int> q;
  71.     q.push(SOURCE);
  72.     d[SOURCE] = 1;
  73.  
  74.     while (!q.empty()) {
  75.         int u = q.front();
  76.         q.pop();
  77.         if (u == SINK) continue;
  78.         for (auto &it : g[u]) {
  79.             if (!d[it.dest] && it.flow > 0) {
  80.                 d[it.dest] = d[u] + 1;
  81.                 q.push(it.dest);
  82.             }
  83.         }
  84.     }
  85.  
  86.     return d[SINK];
  87. }
  88.  
  89. int dfs(int x = SOURCE, int flow = INF) {
  90.     if (x == SINK)
  91.         return flow;
  92.  
  93.     for (; last[x] < sz(g[x]); last[x]++) {
  94.         Edge &e = g[x][last[x]];
  95.         if (e.flow > 0 && d[e.dest] == d[x] + 1) {
  96.             if (int ret = dfs(e.dest, min(flow, e.flow))) {
  97.                 e.flow -= ret;
  98.                 g[e.dest][e.rev].flow += ret;
  99.                 return ret;
  100.             }
  101.         }
  102.     }
  103.  
  104.     return 0;
  105. }
  106.  
  107. int dinic() {
  108.     int max_flow = 0;
  109.     while (bfs()) {
  110.         while (int flow = dfs())
  111.             max_flow += flow;
  112.     }
  113.     return max_flow;
  114. }
  115.  
  116. void solve(int t) {
  117.     int s = 0;
  118.     for (int i = 0; i < NMAX + VMAX; i++)
  119.         g[i].clear();
  120.     for (int i = 1; i < VMAX; i++)
  121.         add_edge(n + i, SINK, m);
  122.     for (int i = 1; i <= n; i++) {
  123.         add_edge(SOURCE, i, a[i].v);
  124.         s += a[i].v;
  125.         for (int j = a[i].l; j <= a[i].r; j++)
  126.             add_edge(i, n + j, 1);
  127.     }
  128.     int max_flow = dinic();
  129.     cout << "Case " << t << ": ";
  130.     if (max_flow != s) NO;
  131.     else {
  132.         YES;
  133.         for (int i = 1; i <= n; i++) {
  134.             for (auto &it : g[i]) {
  135.                 if (it.dest == SOURCE || it.flow) continue;
  136.                 if (ans[i].empty() || ans[i].back().se != it.dest - n - 1)
  137.                     ans[i].push_back({it.dest - n, it.dest - n});
  138.                 else
  139.                     ans[i].back().se++;
  140.             }
  141.         }
  142.         for (int i = 1; i <= n; i++) {
  143.             cout << sz(ans[i]);
  144.             for (auto &it : ans[i])
  145.                 cout << " (" << it.fi - 1 << ',' << it.se << ')';
  146.             ans[i].clear();
  147.             cout << endl;
  148.         }
  149.     }
  150. }
  151.  
  152. signed main() {
  153.     io();
  154.     for (int t = 1; ; t++) {
  155.         read();
  156.         solve(t);
  157.     }
  158.     return 0;
  159. }
  160.  
Advertisement
Add Comment
Please, Sign In to add comment