Boss239

WTF

Jul 23rd, 2025
485
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4.  
  5. void solve() {
  6.     int n, m; cin >> n >> m;
  7.     vector<int> ifless(n, 1), ifmore(n, 1);
  8.     // ifless - если меньше остальных, ifmore - если больше остальных. Изначально все могут быть и теми, и теми.
  9.     for (int j = 0; j < m; ++j) {
  10.         int q; cin >> q;
  11.         vector<int> cnt(n, 0);
  12.         // считываем сколько раз он на левой чаше сравнения (отрицательное число значит, что он на противоположной), здесь также учитывается возможность того, что какой-то человек в сравнении участвует несколько раз
  13.         for (int i = 0; i < q; ++i) {
  14.             int a; cin >> a; a--;
  15.             cnt[a]++;
  16.         }
  17.         // сначала добавляем тех, что слева
  18.         for (int i = 0; i < q; ++i) {
  19.             int a; cin >> a; a--;
  20.             cnt[a]--;
  21.         }
  22.         // затем вычитаем тех что справа
  23.         char res; cin >> res;
  24.         // теперь считываем знак
  25.         if (res == '=') {
  26.             for (int i = 0; i < n; ++i) {
  27.                 if (cnt[i] != 0) {
  28.                     ifless[i] = 0; ifmore[i] = 0;
  29.                 }
  30.             }
  31.         }
  32.         // если равенство, то это значит, что все, у кого по итогу ненулевой вклад равны, а значит больше не могут быть особенными
  33.         else if (res == '>') {
  34.             for (int i = 0; i < n; ++i) {
  35.                 if (cnt[i] <= 0) { ifmore[i] = 0; }
  36.                 if (cnt[i] >= 0) { ifless[i] = 0; }
  37.             }
  38.         }
  39.         // если больше, то если у кого-то вклад не больше нуля, то его не может быть слева, а значит он не может весить больше, так как слева уже есть человек, который весит больше. По аналогии с меньше и правой частью
  40.         else {
  41.             for (int i = 0; i < n; ++i) {
  42.                 if (cnt[i] >= 0) { ifmore[i] = 0; }
  43.                 if (cnt[i] <= 0) { ifless[i] = 0; }
  44.             }
  45.         }
  46.         // точно также, но для случая с противоположным знаком просто меняются и знаки сравнения с нулем
  47.     }
  48.     int ans = 0;
  49.     // ищем ответ. Если у нас есть несколько вариантов того, что кто-то может весить больше остальных (или меньше), то ответ сразу 0, так как мы по итогу не сможем отличить эти варианты. Если же какой-то человек одновременно может весить и больше, и меньше, то это ок, ведь его могли просто ни разу не брать, а все остальные были равны.
  50.     for (int i = 0; i < n; ++i) {
  51.         if (ifless[i]) {
  52.             if (ans == 0) ans = i + 1;
  53.             else {
  54.                 cout << "0\n";
  55.                 return;
  56.             }
  57.         }
  58.         if (ifmore[i]) {
  59.             if (ans == 0 || ans == i + 1) ans = i + 1;
  60.             else {
  61.                 cout << "0\n";
  62.                 return;
  63.             }
  64.         }
  65.     }
  66.     cout << ans << endl;
  67. }
  68.  
  69. int main() {
  70.   ios::sync_with_stdio(false);
  71.   cin.tie(nullptr);
  72.  
  73.   solve();
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment