cses

My solution for the coding challenges of cses.fi
git clone https://git.tronto.net/cses
Download | Log | Files | Refs | README

hidden_permutation_3139.cpp (910B)


      1 #include <iostream>
      2 #include <iterator>
      3 #include <string>
      4 #include <vector>
      5 
      6 void print_sol(const std::vector<size_t>& v) {
      7 	std::cout << "! ";
      8 	for (size_t i = 0; i < v.size(); i++) {
      9 		for (size_t j = 0; j < v.size(); j++) {
     10 			if (v[j] == i) {
     11 				std::cout << (j+1) << " ";
     12 				break;
     13 			}
     14 		}
     15 	}
     16 	std::cout << std::endl;
     17 }
     18 
     19 bool cmp(size_t i, size_t j) {
     20 	std::cout << "? " << (i+1) << " " << (j+1) << std::endl;
     21 	std::string s;
     22 	std::cin >> s;
     23 	return s == "YES";
     24 }
     25 
     26 size_t binsearch(size_t i, const std::vector<size_t>& v, size_t l, size_t r) {
     27 	if (r == l) return l;
     28 	size_t m = (l+r)/2;
     29 	return cmp(i, v[m]) ? binsearch(i, v, l, m) : binsearch(i, v, m+1, r);
     30 }
     31 
     32 int main() {
     33 	size_t n;
     34 	std::vector<size_t> v;
     35 	std::cin >> n;
     36 	v.reserve(n);
     37 
     38 	v.push_back(0);
     39 	for (size_t i = 1; i < n; i++) {
     40 		size_t pos = binsearch(i, v, 0, v.size());
     41 		v.insert(std::next(v.begin(), pos), i);
     42 	}
     43 
     44 	print_sol(v);
     45 }