Advertisement
Kevin_Zhang

Untitled

May 31st, 2020
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement