Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define pb emplace_back
- using namespace std;
- using ll = long long;
- const int maxn = 100010;
- random_device seed;
- mt19937 rng(seed());
- int ra(int l, int r) { return uniform_int_distribution<int>(l, r)(rng); }
- int n, subtask, max_q, ans, method, cur_q;
- vector<pair<int,int>> allres;
- void ER(string m) {
- cerr << 0 << '\n' << m << '\n';
- cerr << "Maximum Query Can Used " << max_q << " N : " << n << '\n';
- exit(0);
- }
- #define WA() ER("Wrong Answer")
- bool check_sing(int a) {
- return a >= 1 && a <= n;
- }
- set<int> win[maxn];
- int lose[maxn], X;
- void check(int a, int b) {
- if (!check_sing(a) || !check_sing(b)) ER("Query " + to_string(a) + " vs " + to_string(b) + " is Undefined");
- if (a == b) ER("Query With Same a, b is Undefined");
- }
- int D0(int a, int b) {
- int v;
- if (a == X || b == X) return X;
- if (ra(1, 10) > 6) return ra(0, 1) ? a : b;
- if (lose[b])
- v = a;
- else if (lose[a])
- v = b;
- else if (win[a].size() < win[b].size())
- v = a;
- else v = b;
- return v;
- }
- int D1(int a, int b) {
- if (a == X || b == X) {
- if (win[X].size() == n-2) return X;
- return a ^ b ^ X;
- }
- int v;
- if (lose[b])
- v = a;
- else if (lose[a])
- v = b;
- else if (win[a].size() > win[b].size())
- v = a;
- else v = b;
- return v;
- }
- int D2(int a, int b) {
- if (a == X || b == X) {
- if (lose[X] < 1) return ra(0, 100) > 70 ? X : X ^ b ^ X;
- if (win[X].size() > n / 3 * 2) return a ^ b ^ X;
- return X;
- }
- return ra(0, 1) ? a : b;
- }
- int D3(int a, int b) {
- return ra(0, 1) ? a : b;
- }
- int D4(int a, int b) {
- if (a == X || b == X) {
- if (lose[X] < 1) return ra(0, 100) > 70 ? X : X ^ b ^ X;
- if (win[X].size() > n / 3 * 2) return a ^ b ^ X;
- return X;
- }
- if (lose[a]) return b;
- if (lose[b]) return a;
- return ra(0, 1) ? a : b;
- }
- int D5(int a, int b) {
- if (a == X || b == X) {
- if (!lose[X]) return a ^ b ^ X;
- return X;
- }
- if (!lose[a]) return b;
- if (!lose[b]) return a;
- return ra(0, 1) ? a : b;
- }
- int qwin(int a, int b, auto Decide) {
- if (win[a].count(b)) return a;
- if (win[b].count(a)) return b;
- int v;
- if (lose[a] > 1)
- v = b;
- else if (lose[b] > 1)
- v = a;
- else if (win[a].size() + win[b].size() + lose[a] + lose[b] == 0)
- v = ra(0, 1) ? a : b;
- else v = Decide(a, b);
- win[v].insert(a ^ b ^ v);
- ++lose[a ^ b ^ v];
- return v;
- }
- void check_ans() {
- int len;
- if (!(cin >> len)) ER("Query Not Received");
- if (len > 3) ER("Answer Is Always Between 0 ~ 3");
- vector<int> can, user(len);
- can.reserve(n);
- for (int i = 1;i <= n;++i) if (lose[i] <= 1)
- can.pb(i);
- for (int i = 0;i < len;++i)
- if (!(cin >> user[i])) ER("Length of Answer shorter Than Said");
- sort(user.begin(), user.end());
- if (can.size() != len || user != can) {
- cerr << "0\n";
- if (can.size() < 10) {
- cerr << "Answer Candidate : ";
- for (int u : can) cerr << u << ' ';
- cerr << '\n';
- }
- if (user.size() < 10) {
- cerr << "User's submission : ";
- for (int u : user) cerr << u << ' ';
- cerr << '\n';
- }
- exit(0);
- ER("Answer Does Not Match");
- }
- cerr << "1\n Accepted";
- cerr << "User Answer : ";
- for (int u : user) cerr << u << ' ';
- if (user.empty()) cerr << "None";
- cerr << '\n';
- exit(0);
- }
- void gen(auto Decide) {
- string op;
- int a, b, len;
- while (cin >> op) {
- if (op == "?") {
- if (++cur_q > max_q)
- ER("Too Many Queries");
- if (!(cin >> a >> b)) ER("Query Not Received");
- check(a, b);
- cout << qwin(a, b, Decide) << endl;
- }
- else if (op == "!")
- check_ans();
- else ER("The Operation Is not Defined With Symbol " + op);
- fflush(stdout);
- }
- ER("The Answer Is Not Given");
- }
- signed main(int argc, char **argv){
- fstream input(argv[1]);
- // generator
- input >> n >> subtask;
- // if (n >= 10) return cerr << 1 << '\n' << "Skipped", 0;
- switch (subtask) {
- case 1 : n = ra(6, 8);
- break;
- case 2 : n = ra(1000, 1116);
- break;
- case 3 :
- case 4 :
- case 5 :
- n = ra(10000, 20000);
- }
- max_q = (subtask == 3 ? 6 : subtask == 4 ? 5 : 4) * n;
- cout << n << endl;
- fflush(stdout);
- method = ra(0, 5);
- X = ra(1, n);
- switch (method) {
- case 0 : gen(D0);
- break;
- case 1 : gen(D1);
- break;
- case 2 : gen(D2);
- break;
- case 3 : gen(D3);
- break;
- case 4 : gen(D4);
- break;
- case 5 : gen(D5);
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement