Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define N 1000
- static int ranki[N];
- static int isused[N];
- #define MAXQUERY 1000000
- static bool okay;
- static int querycount;
- void play(int mRank[N]);
- int query(int K, int mSub[], int mOpt) {
- if(!okay || K < 5 || K > N || (mOpt != 0 && mOpt != 1) || querycount >= MAXQUERY) {
- okay = false;
- return -1;
- }
- ++querycount;
- if(mOpt == 0) {
- int ret = N - 1;
- for(int k = 0; k < K; ++k) {
- if(mSub[k] < 0 || mSub[k] >= N || isused[mSub[k]] == querycount) {
- okay = false;
- return -1;
- }
- isused[mSub[k]] = querycount;
- if(ret > ranki[mSub[k]]) {
- ret = ranki[mSub[k]];
- }
- }
- return ret;
- } else {
- int ret = 0;
- for(int k = 0; k < K; ++k) {
- if(mSub[k] < 0 || mSub[k] >= N || isused[mSub[k]] == querycount) {
- okay = false;
- return -1;
- }
- isused[mSub[k]] = querycount;
- if(ret < ranki[mSub[k]]) {
- ret = ranki[mSub[k]];
- }
- }
- return ret;
- }
- }
- static int callout;
- static bool run() {
- int mLimit;
- int mRank[N];
- okay = true;
- for(int c = 0; c < 10; c++) {
- mLimit = 1200;
- for(int i = 0; i < N; i++) {
- scanf("%d", &ranki[i]);
- }
- querycount = 0;
- for(int i = 0; i < N; i++) {
- isused[i] = 0;
- }
- if(okay) {
- play(mRank);
- }
- if(mLimit < querycount) {
- okay = false;
- }
- if(okay) {
- for(int i = 0; i < N; i++) {
- if(ranki[i] != mRank[i]) {
- okay = false;
- }
- }
- }
- callout += querycount;
- }
- return okay;
- }
- int main()
- {
- int T, MARK;
- scanf("%d %d", &T, &MARK);
- int totalcount = 0;
- for(int tc = 1; tc <= T; tc++) {
- int score;
- callout = 0;
- score = run() ? MARK : 0;
- printf("%d %d %d\n", tc, score, callout);
- totalcount += callout;
- }
- printf("totalcount = %d, average = %.3f\n", totalcount, (totalcount / (T * 10.0)));
- return 0;
- }
- // main code
- int ask_query(vector<int>& arr, int type) {
- int b[arr.size()];
- for(int i = 0; i < arr.size(); i++) {
- b[i] = arr[i];
- }
- return query(arr.size(), b, type);
- }
- int doit(int num, set<int>& st) {
- int l = 0, r = N - 1, mid, out;
- while(l <= r) {
- mid = (l + r) / 2;
- vector<int> arr;
- for(int i = l; i <= mid; i++) {
- if(st.find(i) == st.end()) {
- arr.push_back(i);
- }
- }
- if(arr.size() < 5) {
- break;
- }
- out = ask_query(arr, 0);
- if(out == num) {
- r = mid;
- } else {
- l = mid + 1;
- }
- }
- vector<int> ext;
- for(int i = 0; i < N && ext.size() < 4; i++) {
- if(st.find(i) != st.end() || (i <= r && i >= l)) {
- continue;
- }
- ext.push_back(i);
- }
- for(int i = l; i <= r; i++) {
- ext.push_back(i);
- out = ask_query(ext, 0);
- if(out == num) {
- return i;
- }
- ext.pop_back();
- }
- assert(false);
- }
- void play(int mRank[N]) {
- set<int> st;
- vector<int> ini;
- int ret;
- for(int i = 0; i < 4; i++) {
- ret = doit(i, st);
- ini.push_back(ret);
- st.insert(ret);
- mRank[ret] = i;
- }
- vector<int> ext;
- for(auto i: st) {
- ext.push_back(i);
- }
- for(int i = 0; i < N; i++) {
- if(st.find(i) != st.end()) {
- continue;
- }
- ext.push_back(i);
- mRank[i] = ask_query(ext, 1);
- ext.pop_back();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment