제출 #605091

#제출 시각아이디문제언어결과실행 시간메모리
605091Sam_a17버섯 세기 (IOI20_mushrooms)C++14
0 / 100
2 ms464 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define sz(x) (int((x).size()))
#define len(x) (int)x.length()
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define dbg(x) cout << #x << " " << x << endl;
#define uniq(x) x.resize(unique(all(x)) - x.begin());
 
#define pb push_back
#define ld long double
#define ll long long
 
// #include "mushrooms.h"
int use_machine(vector<int> m);
 
void pr(vector<int>& a) {
  cerr << "arr" << " ";
  for(auto i: a) {
    cerr << i << " "; 
  } cerr << endl;
}
 
 
// #include "mushrooms.h"
int use_machine(vector<int> m);


int count_mushrooms2(int n) {
	// std::vector<int> m;
	// for (int i = 0; i < n; i++)
		// m.push_back(i);
	// int c1 = use_machine(m);
	// m = {0, 1};
	// int c2 = use_machine(m);
	// return c1+c2;
 
  // int curr = 1;
  // vector<int> a{0}, b;
  // int s = 1;
  // for(int i = 1; i + 1 < n; i += 2) {
  //   vector<int> ask{i, 0, i + 1};
  //   int c1 = use_machine(ask);
  //   s += 2 - c1;
  // }
 
  // if(n % 2 == 0) {
  //   vector<int> ask{0, n - 1};
  //   int c1 = use_machine(ask);
  //   s += 1 - c1;
  // }
 
  set<int> st;
  for(int i = 0; i < n; i++) {
    st.insert(i);
  }
 
  int answ = 0;
  int kAx = 1, kBx = 0, cnt = 0, qn = 0;
  int lim = 120;
  vector<int> ones, zeroes{0};
  int start = -1;
  for(int i = 1; i < n; i++) {
    vector<int> aski{0, i};
    int s = use_machine(aski);
    if(s == 1) {
      ones.push_back(i);
      kBx++;
    } else {
      zeroes.push_back(i);
      kAx++;
    }
 
    if(kAx >= lim || kBx >= lim) {
      start = i + 1;
      break;
    }
  }
 
  if(start == -1) {
    return kAx;
  }
 
  if(kAx >= lim || !kBx) {
    int i = start;
    for(; i + kAx <= n; i += kAx) {
      vector<int> qry;
      for(int j = i, k = 0; j < i + kAx; j++, k++) {
        qry.push_back(zeroes[k]);
        qry.push_back(j);
      }
 
      int s = use_machine(qry);
 
      int ci = 0;
      if(s % 2 == 1) {
        s--, ci++;
      } 
      answ += (kAx - ci) - (s / 2);
    }
 
    vector<int> qry;
    int ki = 0;
    for(int j = i; j < n; j++, ki++) {
      qry.push_back(zeroes[ki]);
      qry.push_back(j);
    }
 
    if(!qry.empty()) {
      int s = use_machine(qry), ci = 0;
      if(s % 2 == 1) {
        s--, ci++;
      } 
      answ += (sz(qry) / 2 - ci) - (s / 2);
    }
    return answ + kAx;
  } else {
    int i = start;
    for(; i + kBx <= n; i += kBx) {
      vector<int> qry;
      for(int j = i, k = 0; j < i + kBx; j++, k++) {
        qry.push_back(ones[k]);
        qry.push_back(j);
      }
 
      // pr(qry);
      int s = use_machine(qry);
 
      if(s % 2 == 1) {
        s--, answ++;
      }
      answ += (s / 2);
      // dbg(answ)
    }
 
    vector<int> qry;
    int ki = 0;
    for(int j = i; j < n; j++, ki++) {
      qry.push_back(ones[ki]);
      qry.push_back(j);
    }
 
 
    if(!qry.empty()) {
      int s = use_machine(qry);
      if(s % 2 == 1) {
        s--, answ++;
      }
      answ += (s / 2);
    }
    return answ + kAx;
  }
}

int count_mushrooms(int n) {
	// std::vector<int> m;
	// for (int i = 0; i < n; i++)
		// m.push_back(i);
	// int c1 = use_machine(m);
	// m = {0, 1};
	// int c2 = use_machine(m);
	// return c1+c2;
 
  // int curr = 1;
  // vector<int> a{0}, b;
  // int s = 1;
  // for(int i = 1; i + 1 < n; i += 2) {
  //   vector<int> ask{i, 0, i + 1};
  //   int c1 = use_machine(ask);
  //   s += 2 - c1;
  // }
 
  // if(n % 2 == 0) {
  //   vector<int> ask{0, n - 1};
  //   int c1 = use_machine(ask);
  //   s += 1 - c1;
  // }
 
  set<int> st;
  for(int i = 0; i < n; i++) {
    st.insert(i);
  }
 
  int answ = 0;
  int kAx = 1, kBx = 0, cnt = 0, qn = 0;
  int lim = 120;
  vector<int> ones, zeroes{0};
  int start = -1;

  for(int i = 1; i < n; i++) {
    vector<int> aski{0, i};
    int s = use_machine(aski);
    if(s == 1) {
      ones.push_back(i);
      kBx++;
    } else {
      zeroes.push_back(i);
      kAx++;
    }
 
    if(kAx >= 2) {
      start = i + 1;
      break;
    }
  }
 
  if(start == -1) {
    return kAx;
  }

  if(kAx >= 2) {
    for(int i = start; i + 1 < n; i += 2) {
      vector<int> ask{0, i, zeroes.back(), i + 1};
      int s = use_machine(ask);
      
      if(s == 0) {
        zeroes.push_back(i);
        zeroes.push_back(i + 1);
      } else if(s == 1) {
        zeroes.push_back(i);
        ones.push_back(i + 1);
      } else if(s == 2) {
        ones.push_back(i);
        zeroes.push_back(i + 1);
      } else {
        ones.push_back(i);
        ones.push_back(i + 1);
      }
      
      //
      kAx = sz(zeroes), kBx = sz(ones);

      if(kAx >= lim || kBx >= lim) {
        start = i + 1;
        break;
      }

      start += 2;
    }
  } 
  
  assert(start >= n - 1);

  //else  {
  //   bool flag = false;
  //   int i = start;
  //   for(; i + 1 < n; i += 2) {
  //     vector<int> ask{ones.front(), i, ones.back(), i + 1};
  //     int s = use_machine(ask);
      
  //     if(s == 0) {
  //       ones.push_back(i);
  //       ones.push_back(i + 1);
  //     } else if(s == 1) {
  //       ones.push_back(i);
  //       zeroes.push_back(i + 1);
  //     } else if(s == 2) {
  //       zeroes.push_back(i);
  //       ones.push_back(i + 1);
  //     } else {
  //       zeroes.push_back(i);
  //       zeroes.push_back(i + 1);
  //     }
      
  //     //
  //     kAx = sz(zeroes), kBx = sz(ones);

  //     if(kAx >= lim || kBx >= lim) {
  //       start = i + 1;
  //       break;
  //     }
  //   }

  //   if(!flag) {
  //     start = i;
  //   }
  // }
 
  // pr(zeroes);
  // pr(ones);
  // dbg(start)
  // dbg(answ)
  // dbg(kAx)

  if(kAx >= lim || !kBx) {
    int i = start;
    for(; i + kAx <= n; i += kAx) {
      vector<int> qry;
      for(int j = i, k = 0; j < i + kAx; j++, k++) {
        qry.push_back(zeroes[k]);
        qry.push_back(j);
      }
 
      int s = use_machine(qry);
 
      int ci = 0;
      if(s % 2 == 1) {
        s--, ci++;
      } 
      answ += (kAx - ci) - (s / 2);
    }
 
    vector<int> qry;
    int ki = 0;
    for(int j = i; j < n; j++, ki++) {
      qry.push_back(zeroes[ki]);
      qry.push_back(j);
    }
 
    if(!qry.empty()) {
      int s = use_machine(qry), ci = 0;
      if(s % 2 == 1) {
        s--, ci++;
      } 
      answ += (sz(qry) / 2 - ci) - (s / 2);
    }
    return answ + kAx;
  } else {
    int i = start;
    for(; i + kBx <= n; i += kBx) {
      vector<int> qry;
      for(int j = i, k = 0; j < i + kBx; j++, k++) {
        qry.push_back(ones[k]);
        qry.push_back(j);
      }
 
      // pr(qry);
      int s = use_machine(qry);
 
      if(s % 2 == 1) {
        s--, answ++;
      }
      answ += (s / 2);
      // dbg(answ)
    }
 
    vector<int> qry;
    int ki = 0;
    for(int j = i; j < n; j++, ki++) {
      qry.push_back(ones[ki]);
      qry.push_back(j);
    }
 
 
    if(!qry.empty()) {
      int s = use_machine(qry);
      if(s % 2 == 1) {
        s--, answ++;
      }
      answ += (s / 2);
    }
    return answ + kAx;
  }
}

컴파일 시 표준 에러 (stderr) 메시지

mushrooms.cpp: In function 'int count_mushrooms2(int)':
mushrooms.cpp:60:25: warning: unused variable 'cnt' [-Wunused-variable]
   60 |   int kAx = 1, kBx = 0, cnt = 0, qn = 0;
      |                         ^~~
mushrooms.cpp:60:34: warning: unused variable 'qn' [-Wunused-variable]
   60 |   int kAx = 1, kBx = 0, cnt = 0, qn = 0;
      |                                  ^~
mushrooms.cpp: In function 'int count_mushrooms(int)':
mushrooms.cpp:186:25: warning: unused variable 'cnt' [-Wunused-variable]
  186 |   int kAx = 1, kBx = 0, cnt = 0, qn = 0;
      |                         ^~~
mushrooms.cpp:186:34: warning: unused variable 'qn' [-Wunused-variable]
  186 |   int kAx = 1, kBx = 0, cnt = 0, qn = 0;
      |                                  ^~
#Verdict Execution timeMemoryGrader output
Fetching results...