Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <array>
- #include <list>
- #include <stack>
- #include <queue>
- #include <deque>
- #include <map>
- #include <set>
- #include <unordered_map>
- #include <unordered_set>
- #include <algorithm>
- #include <functional>
- #include <random>
- #include <limits>
- #include <string>
- #include <sstream>
- #include <numeric>
- #include <cassert>
- #include <cmath>
- #include <ctime>
- using namespace std;
- #pragma comment(linker, "/STACK:200000000")
- const int param = 17, siz = 1000, len = 400;
- int ask (int a, int b)
- {
- if (b < a)
- return ask (b + 1, a + 1);
- static vector<vector<int>> dp (siz + 1, vector<int> (siz + 1, -1));
- if (dp[a][b] == -1)
- {
- cout << "? " << a + 1 << ' ' << b << endl;
- cout.flush ();
- cin >> dp[a][b];
- }
- return dp[a][b];
- }
- void solve (istream &cin = std::cin, ostream &cout = std::cout)
- {
- string str (siz, '0');
- for (int i = 0; i < str.size (); i++)
- {
- int one = 0, zer = 0;
- const int ev = 4;
- for (int j = 0; one < ev && zer < ev; j++)
- {
- int big, small;
- if (i < siz / 2)
- {
- big = ask (i, i + len + j);
- small = ask (i + 1, i + len + j);
- }
- else
- {
- big = ask (i - len - j, i + 1);
- small = ask (i - len - j, i);
- }
- if (big == small + 1)
- one++;
- else if (big == small)
- zer++;
- }
- if (one > zer)
- str[i] = '1';
- }
- cout << "! " << str << endl;
- }
- int main ()
- {
- #ifdef LOCAL
- solve ();
- cout << "clock: " << clock () / (double)CLOCKS_PER_SEC << endl;
- #else
- solve ();
- #endif
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement