Submission #391479

#TimeUsernameProblemLanguageResultExecution timeMemory
391479asbsfdsZagonetka (COI18_zagonetka)C++14
100 / 100
579 ms452 KiB
#include <bits/stdc++.h>
#define X first
#define Y second

using namespace std;
typedef long long llint;

const int maxn = 210;
const int base = 31337;
const int mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const int logo = 20;
const int off = 1 << logo;
const int treesiz = off << 1;

int n;
int niz[maxn];
int wh[maxn][maxn];
int sol[maxn];
int cnt[maxn];

vector< int > sorr() {
	queue< int > q;
	for (int i = 0; i < n; i++) {
		cnt[i] = 0;
		for (int j = 0; j < n; j++) {
			if (wh[j][i] > 0) cnt[i]++;
		}
		if (cnt[i] == 0) q.push(i);
	}
	
	vector< int > v;
	while (!q.empty()) {
		int x = q.front();
		q.pop();
		
		v.push_back(x);
		for (int i = 0; i < n; i++) {
			if (wh[x][i] > 0) {
				cnt[i]--;
				if (cnt[i] == 0) {
					q.push(i);
				}
			}
		}
	}
	assert(v.size() == n);
	return v;
}

pair<int, int> fin() {
	vector< int > v = sorr();
	
	//printf("sort: ");
	//for (int i = 0; i < v.size(); i++) printf("%d ", v[i]);
	//printf("\n");
	
	assert(v.size() == n);
	for (int i = 0; i < n; i++) {
		int a = v[i];
		for (int j = i - 1; j >= 0; j--) {
			int b = v[j];
			if (wh[b][a] == 1) return make_pair(b, a);
		}
	}
	return make_pair(-1, -1);
}

void gen1(vector< int > v, int a, int b) {
	if (v.size() == 0) return;
	int x = v[0];
	
	vector< int > p, q;
	for (int i = 1; i < v.size(); i++) {
		int tren = v[i];
		if (wh[tren][x] > 0) p.push_back(tren);
		else q.push_back(tren);
	}
	sol[x] = a + p.size();
	gen1(p, a, a + p.size() - 1);
	gen1(q, a + p.size() + 1, b);
}

void gen2(vector< int > v, int a, int b) {
	if (v.size() == 0) return;
	int x = v[0];
	
	vector< int > p, q;
	for (int i = 1; i < v.size(); i++) {
		int tren = v[i];
		if (wh[x][tren] > 0) p.push_back(tren);
		else q.push_back(tren);
	}
	sol[x] = b - p.size();
	gen2(p, sol[x] + 1, b);
	gen2(q, a, sol[x] - 1);
}

int query(int x, int y) {
	wh[x][y] = 0, wh[y][x] = 1;
	
	//vector< int > s;
	//for (int i = 0; i < n; i++) s.push_back(i);
	//gen1(s, 1, n);
	
	vector< int > v = sorr();
	for (int i = 0; i < n; i++) sol[v[i]] = i + 1;
	
	printf("query ");
	for (int i = 0; i < n; i++) printf("%d ", sol[i]);
	printf("\n");
	fflush(stdout);
	
	wh[x][y] = 1, wh[y][x] = 0;
	int out;
	scanf("%d", &out);
	return out;
}

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d", niz+i);
		
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (niz[i] < niz[j]) wh[i][j] = 1;
		}
	}
	
	/**
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++)
			printf("%d ", wh[i][j]);
		printf("\n");
	}
	**/
	while (true) {
		pair<int, int> tr = fin();
		int x = tr.X;
		int y = tr.Y;
		
		if (x == -1) break;
		
		//printf("trying: %d %d\n", x + 1, y + 1);
		int out = query(x, y);
		
		if (out == 0) {
			//printf("confirmed %d %d\n", x + 1, y + 1);
			wh[x][y] = 2;
			for (int i = 0; i < n; i++) {
				if (wh[i][x] == 2) wh[i][y] = 2;
			}
			for (int i = 0; i < n; i++) {
				if (wh[y][i] == 2) wh[x][i] = 2;
			}
			
			for (int i = 0; i < n; i++) {
				if (wh[i][x] != 2) continue;
				for (int j = 0; j < n; j++) {
					if (wh[y][j] == 2) wh[i][j] = 2;
				}
			}
		} else {
			wh[x][y] = 0;
		}
		
		/**
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++)
				printf("%d ", wh[i][j]);
			printf("\n");
		}
		**/
	}
	
	/**
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (wh[i][j] == 2) printf("%d %d\n", i + 1, j + 1);
		}
	}
	**/
	
	vector< int > s;
	for (int i = 0; i < n; i++) s.push_back(i);
	gen1(s, 1, n);
	
	printf("end\n");
	for (int i = 0; i < n; i++) printf("%d ", sol[i]);
	printf("\n");
	
	gen2(s, 1, n);
	for (int i = 0; i < n; i++) printf("%d ", sol[i]);
	printf("\n");
	fflush(stdout);
	return 0;
}

Compilation message (stderr)

In file included from /usr/include/c++/9/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/9/bits/stdc++.h:33,
                 from zagonetka.cpp:1:
zagonetka.cpp: In function 'std::vector<int> sorr()':
zagonetka.cpp:47:18: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   47 |  assert(v.size() == n);
      |         ~~~~~~~~~^~~~
zagonetka.cpp: In function 'std::pair<int, int> fin()':
zagonetka.cpp:58:18: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   58 |  assert(v.size() == n);
      |         ~~~~~~~~~^~~~
zagonetka.cpp: In function 'void gen1(std::vector<int>, int, int)':
zagonetka.cpp:74:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |  for (int i = 1; i < v.size(); i++) {
      |                  ~~^~~~~~~~~~
zagonetka.cpp: In function 'void gen2(std::vector<int>, int, int)':
zagonetka.cpp:89:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |  for (int i = 1; i < v.size(); i++) {
      |                  ~~^~~~~~~~~~
zagonetka.cpp: In function 'int query(int, int)':
zagonetka.cpp:116:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  116 |  scanf("%d", &out);
      |  ~~~~~^~~~~~~~~~~~
zagonetka.cpp: In function 'int main()':
zagonetka.cpp:121:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  121 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
zagonetka.cpp:123:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  123 |   scanf("%d", niz+i);
      |   ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...