danielvitor23

F. Fair Distribution

Jul 22nd, 2024 (edited)
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. #ifdef ENABLE_DEBUG
  3.   #define DEBUG(x) std::cout << x << std::endl
  4. #else
  5.   #define DEBUG(x)
  6. #endif
  7. #define fi first
  8. #define se second
  9. #define pb push_back
  10. #define all(x) x.begin(),x.end()
  11. #define rall(x) x.rbegin(),x.rend()
  12. using namespace std;
  13. using ii = pair<int, int>;
  14. using i64 = long long;
  15. const int INF = 0x3f3f3f3f;
  16. const i64 INFLL = 0x3f3f3f3f3f3f3f3f;
  17.  
  18. int n;
  19. int sz;
  20. vector<int> g, C;
  21. vector<int> freq(sz, 0);
  22. i64 gcd_r = 0;
  23. int MAXV = 0;
  24.  
  25. map<pair<ii, ii>, int> dp;
  26.  
  27. int solve(int idx, int value, bool p1, bool p2) {
  28.   if (dp.count({{idx, value}, {p1, p2}})) {
  29.     return dp[{{idx, value}, {p1, p2}}];
  30.   }
  31.  
  32.   if (idx == sz) {
  33.     // cout << value << ' ' << p1 << ' ' << p2 << '\n';
  34.     return dp[{{idx, value}, {p1, p2}}] = (value == 0 and p1 and p2);
  35.   }
  36.  
  37.   int ans = 0;
  38.  
  39.   for (int i = 0; i <= freq[idx]; ++i) {
  40.     int j = freq[idx] - i;
  41.     ans |= solve(idx + 1, value + i * C[idx] - j * C[idx], p1 | (i > 0), p2 | (j > 0));
  42.   }
  43.  
  44.   return dp[{{idx, value}, {p1, p2}}] = ans;
  45. }
  46.  
  47. int main() {
  48.   cin.tie(0)->sync_with_stdio(0);
  49.  
  50.   cin >> n;
  51.  
  52.   g = vector<int>(n);
  53.  
  54.   for (int i = 0; i < n; ++i) {
  55.     int r;
  56.     cin >> g[i] >> r;
  57.     MAXV += g[i];
  58.     C.pb(g[i]);
  59.     gcd_r = gcd(gcd_r, r);
  60.   }
  61.  
  62.   if (n == 1) {
  63.     cout << "N\n";
  64.     return 0;
  65.   }
  66.  
  67.   sort(all(g));
  68.  
  69.   sort(all(C));
  70.   C.erase(unique(all(C)), C.end());
  71.  
  72.   sz = C.size();
  73.  
  74.   freq = vector<int>(sz, 0);
  75.  
  76.   for (int i = 0; i < n; ++i) {
  77.     int p = (lower_bound(all(C), g[i]) - C.begin());
  78.     ++freq[p];
  79.   }
  80.  
  81.   for (int i = 0; i <= MAXV; ++i) {
  82.     int ans = solve(0, i, 0, 0);
  83.     // cout << i << ' ' << ans << '\n';
  84.     if (ans and (i % gcd_r == 0)) {
  85.       cout << "Y\n";
  86.       return 0;
  87.     }
  88.   }
  89.  
  90.   cout << "N\n";
  91. }
Advertisement
Add Comment
Please, Sign In to add comment