답안 #553716

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
553716 2022-04-26T16:37:06 Z amunduzbaev Super Dango Maker (JOI22_dango3) C++17
100 / 100
1354 ms 736 KB
#include "dango3.h"
#ifndef EVAL
#include "grader.cpp"
#endif
#include "bits/stdc++.h"
using namespace std;

void Solve(int n, int m) {
	vector<int> a(n * m);
	iota(a.begin(), a.end(), 0);
	for(int i=m;i>1;i--){
		int cnt = 0;
		int j=n*i-1;
		vector<int> tmp;
		
		auto ask = [&](int j){
			vector<int> tt;
			for(int i=0;i<=j;i++) tt.push_back(a[i] + 1);
			for(auto x : tmp) tt.push_back(a[x] + 1);
			cnt++;
			return Query(tt);
		};
		int cc = 0;
		while(~j){
			cc++;
			if(ask(j)){
				if(!j) { 
					tmp.push_back(j);
					break;
				}
				j = max(j - i, 0);
			} else {
				int l = j, r = min(j + i, tmp.empty() ? n * m : tmp.back() - 1);
				while(l < r){
					int m = (l + r) >> 1;
					if(ask(m)) r = m;
					else l = m + 1;
				}
				assert(l == r);
				tmp.push_back(l);
				j = max(l - i, 0);
			}
		}
		
		assert(cc <= 2 * n);
		// cout<<cnt<<" "<<n * max(1., ceil(log(i)))<<" "<<2 * n<<"\n";
		// assert(cnt <= n * max(1., ceil(log(i))) + 2 * n);
		auto give = [&](vector<int>& tt){
			reverse(tt.begin(), tt.end());
			/* for(auto x : tt) cout<<x<<" ";
			cout<<"\n";
			for(auto x : a) cout<<x<<" ";
			cout<<"\n"; */
			vector<int> tmp, qq;
			for(int j=0, l=0;j<n*i;j++){
				if(l<n && tt[l] == j) {
					qq.push_back(a[j] + 1);
					l++; 
					continue;
				}
				
				tmp.push_back(a[j]);
			}
			swap(tmp, a);
			Answer(qq);
			assert(qq.size() == n);
		};
		
		assert(tmp.size() == n);
		give(tmp);
	}
	
	for(auto& x : a) x++;
	Answer(a);
}

/*

3 2
3 3 1 2 1 2

*/

Compilation message

In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from dango3.cpp:5:
dango3.cpp: In lambda function:
dango3.cpp:66:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   66 |    assert(qq.size() == n);
      |           ~~~~~~~~~~^~~~
dango3.cpp: In function 'void Solve(int, int)':
dango3.cpp:69:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   69 |   assert(tmp.size() == n);
      |          ~~~~~~~~~~~^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 368 KB Output is correct
2 Correct 9 ms 340 KB Output is correct
3 Correct 15 ms 340 KB Output is correct
4 Correct 15 ms 340 KB Output is correct
5 Correct 7 ms 340 KB Output is correct
6 Correct 6 ms 380 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 141 ms 484 KB Output is correct
2 Correct 138 ms 484 KB Output is correct
3 Correct 360 ms 464 KB Output is correct
4 Correct 336 ms 464 KB Output is correct
5 Correct 113 ms 468 KB Output is correct
6 Correct 110 ms 468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 534 ms 532 KB Output is correct
2 Correct 519 ms 588 KB Output is correct
3 Correct 1314 ms 736 KB Output is correct
4 Correct 1354 ms 612 KB Output is correct
5 Correct 385 ms 636 KB Output is correct
6 Correct 413 ms 564 KB Output is correct