Kevin_Zhang

Untitled

May 31st, 2020
470
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.30 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define pb emplace_back
  3. using namespace std;
  4. using ll = long long;
  5. const int maxn = 100010;
  6. random_device seed;
  7. mt19937 rng(seed());
  8. int ra(int l, int r) { return uniform_int_distribution<int>(l, r)(rng); }
  9. int n, subtask, max_q, ans, method, cur_q;
  10. vector<pair<int,int>> allres;
  11. void ER(string m) {
  12.     cerr << 0 << '\n' << m << '\n';
  13.     cerr << "Maximum Query Can Used " << max_q << " N : " << n << '\n';
  14.     exit(0);
  15. }
  16. #define WA() ER("Wrong Answer")
  17. bool check_sing(int a) {
  18.     return a >= 1 && a <= n;
  19. }
  20. set<int> win[maxn];
  21. int lose[maxn], X;
  22. void check(int a, int b) {
  23.     if (!check_sing(a) || !check_sing(b)) ER("Query " + to_string(a) + " vs " + to_string(b) + " is Undefined");
  24.     if (a == b) ER("Query With Same a, b is Undefined");
  25. }
  26. int D0(int a, int b) {
  27.     int v;
  28.     if (a == X || b == X) return X;
  29.     if (ra(1, 10) > 6) return ra(0, 1) ? a : b;
  30.     if (lose[b])
  31.         v = a;
  32.     else if (lose[a])
  33.         v = b;
  34.     else if (win[a].size() < win[b].size())
  35.         v = a;
  36.     else v = b;
  37.     return v;
  38. }
  39. int D1(int a, int b) {
  40.     if (a == X || b == X) {
  41.         if (win[X].size() == n-2) return X;
  42.         return a ^ b ^ X;
  43.     }
  44.     int v;
  45.     if (lose[b])
  46.         v = a;
  47.     else if (lose[a])
  48.         v = b;
  49.     else if (win[a].size() > win[b].size())
  50.         v = a;
  51.     else v = b;
  52.     return v;
  53. }
  54. int D2(int a, int b) {
  55.     if (a == X || b == X) {
  56.         if (lose[X] < 1) return ra(0, 100) > 70 ? X : X ^ b ^ X;
  57.         if (win[X].size() > n / 3 * 2) return a ^ b ^ X;
  58.         return X;
  59.     }
  60.     return ra(0, 1) ? a : b;
  61. }
  62. int D3(int a, int b) {
  63.     return ra(0, 1) ? a : b;
  64. }
  65.  
  66. int D4(int a, int b) {
  67.     if (a == X || b == X) {
  68.         if (lose[X] < 1) return ra(0, 100) > 70 ? X : X ^ b ^ X;
  69.         if (win[X].size() > n / 3 * 2) return a ^ b ^ X;
  70.         return X;
  71.     }
  72.     if (lose[a]) return b;
  73.     if (lose[b]) return a;
  74.     return ra(0, 1) ? a : b;
  75. }
  76. int D5(int a, int b) {
  77.     if (a == X || b == X) {
  78.         if (!lose[X]) return a ^ b ^ X;
  79.         return X;
  80.     }
  81.     if (!lose[a]) return b;
  82.     if (!lose[b]) return a;
  83.     return ra(0, 1) ? a : b;
  84. }
  85.        
  86. int qwin(int a, int b, auto Decide) {
  87.     if (win[a].count(b)) return a;
  88.     if (win[b].count(a)) return b;
  89.     int v;
  90.     if (lose[a] > 1)
  91.         v = b;
  92.     else if (lose[b] > 1)
  93.         v = a;
  94.     else if (win[a].size() + win[b].size() + lose[a] + lose[b] == 0)
  95.         v = ra(0, 1) ? a : b;
  96.     else v = Decide(a, b);
  97.  
  98.     win[v].insert(a ^ b ^ v);
  99.     ++lose[a ^ b ^ v];
  100.     return v;
  101. }
  102. void check_ans() {
  103.     int len;
  104.     if (!(cin >> len)) ER("Query Not Received");
  105.     if (len > 3) ER("Answer Is Always Between 0 ~ 3");
  106.     vector<int> can, user(len);
  107.     can.reserve(n);
  108.     for (int i = 1;i <= n;++i) if (lose[i] <= 1)
  109.         can.pb(i);
  110.     for (int i = 0;i < len;++i)
  111.         if (!(cin >> user[i])) ER("Length of Answer shorter Than Said");
  112.  
  113.     sort(user.begin(), user.end());
  114.  
  115.     if (can.size() != len || user != can) {
  116.         cerr << "0\n";
  117.         if (can.size() < 10) {
  118.  
  119.         cerr << "Answer  Candidate : ";
  120.         for (int u : can) cerr << u << ' ';
  121.         cerr << '\n';
  122.  
  123.         }
  124.         if (user.size() < 10) {
  125.  
  126.         cerr << "User's submission : ";
  127.         for (int u : user) cerr << u << ' ';
  128.         cerr << '\n';
  129.  
  130.         }
  131.         exit(0);
  132.         ER("Answer Does Not Match");
  133.     }
  134.  
  135.     cerr << "1\n Accepted";
  136.     cerr << "User Answer : ";
  137.     for (int u : user) cerr << u << ' ';
  138.     if (user.empty()) cerr << "None";
  139.     cerr << '\n';
  140.    
  141.     exit(0);
  142. }
  143. void gen(auto Decide) {
  144.     string op;
  145.     int a, b, len;
  146.     while (cin >> op) {
  147.         if (op == "?") {
  148.             if (++cur_q > max_q)
  149.                 ER("Too Many Queries");
  150.             if (!(cin >> a >> b)) ER("Query Not Received");
  151.             check(a, b);
  152.             cout << qwin(a, b, Decide) << endl;
  153.         }
  154.         else if (op == "!")
  155.             check_ans();
  156.         else ER("The Operation Is not Defined With Symbol " + op);
  157.  
  158.         fflush(stdout);
  159.     }
  160.     ER("The Answer Is Not Given");
  161. }
  162. signed main(int argc, char **argv){
  163.     fstream input(argv[1]);
  164.  
  165.     // generator
  166.  
  167.     input >> n >> subtask;
  168. //  if (n >= 10) return cerr << 1 << '\n' << "Skipped", 0;
  169.  
  170.  
  171.     switch (subtask) {
  172.         case 1 : n = ra(6, 8);
  173.              break;
  174.         case 2 : n = ra(1000, 1116);
  175.             break;
  176.         case 3 :
  177.         case 4 :
  178.         case 5 :
  179.             n = ra(10000, 20000);
  180.     }
  181.  
  182.     max_q = (subtask == 3 ? 6 : subtask == 4 ? 5 : 4) * n;
  183.  
  184.     cout << n << endl;
  185.     fflush(stdout);
  186.  
  187.     method = ra(0, 5);
  188.  
  189.     X = ra(1, n);
  190.  
  191.  
  192.     switch (method) {
  193.         case 0 : gen(D0);
  194.             break;
  195.         case 1 : gen(D1);
  196.             break;
  197.         case 2 : gen(D2);
  198.             break;
  199.         case 3 : gen(D3);
  200.             break;
  201.         case 4 : gen(D4);
  202.             break;
  203.         case 5 : gen(D5);
  204.             break;
  205.     }
  206. }
Add Comment
Please, Sign In to add comment