답안 #244277

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
244277 2020-07-03T13:11:18 Z vanic Zagonetka (COI18_zagonetka) C++14
27 / 100
77 ms 384 KB
#include <iostream>
#include <algorithm>
#include <math.h>
#include <vector>
#include <bitset>
#include <assert.h>

using namespace std;

const int maxn=105;

int p[maxn];
int q[maxn];
int pos[maxn];
vector < int > ms[2][maxn];
bitset < maxn > imam[2][maxn];
vector < int > val;
vector < pair < int, int > > query;

pair < int, int > uvjet[maxn];
int m;
int n;

void precompute(){
	cin >> m;
	for(int i=0; i<m; i++){
		cin >> uvjet[i].first >> uvjet[i].second;
		uvjet[i].first--;
		uvjet[i].second--;
	}
}

bool provjeri(){
	bool prov=1;
	for(int i=0; i<m; i++){
		if(q[uvjet[i].first]>q[uvjet[i].second]){
			prov=0;
		}
	}
	return prov;
}



void rijesi(int x, bool s){
	sort(ms[s][x].begin(), ms[s][x].end());
	for(int i=0; i<ms[s][x].size(); i++){
		if(!q[ms[s][x][i]]){
			rijesi(ms[s][x][i], s);
		}
	}
	q[x]=val.back();
	val.pop_back();
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for(int i=0; i<n; i++){
		cin >> p[i];
		pos[p[i]]=i;
	}
//	precompute();
	bool prov;
	for(int i=1; i<=n; i++){
		for(int j=1; j<=n-i; j++){
			if(imam[1][pos[j]][pos[j+i]]){
				continue;
			}
			for(int k=0; k<ms[1][pos[j]].size(); k++){
				query.push_back({p[ms[1][pos[j]][k]], ms[1][pos[j]][k]});
			}
			for(int k=0; k<ms[0][pos[j+i]].size(); k++){
				query.push_back({p[ms[0][pos[j+i]][k]], ms[0][pos[j+i]][k]});
			}
			query.push_back({j, pos[j]});
			query.push_back({j+i, pos[j+i]});
			sort(query.begin(), query.end());
			for(int k=0; k<n; k++){
				q[k]=p[k];
			}
			for(int k=0; k<query.size(); k++){
				if(query[k].first!=j && query[k].first!=j+i){
					val.push_back(query[k].second);
				}
			}
			q[pos[j+i]]=query[ms[0][pos[j+i]].size()].first;
			query.erase(query.begin()+ms[0][pos[j+i]].size());
			q[pos[j]]=query[ms[0][pos[j+i]].size()].first;
			query.erase(query.begin()+ms[0][pos[j+i]].size());
			for(int k=0; k<query.size(); k++){
				q[val[k]]=query[k].first;
			}
			query.clear();
			val.clear();
			cout << "query ";
			for(int i=0; i<n; i++){
				cout << q[i] << " ";
			}
			cout << '\n';
			cout.flush();
			cin >> prov;
//			prov=provjeri();
			if(prov){
				continue;
			}
//			cout << "nasao " << pos[j]+1 << " " << pos[j+i]+1 << '\n';
			ms[1][pos[j]].push_back(pos[j+i]);
			imam[1][pos[j]][pos[j+i]]=1;
			for(int l=0; l<ms[0][pos[j]].size(); l++){
				if(!imam[1][ms[0][pos[j]][l]][pos[j+i]]){
					ms[1][ms[0][pos[j]][l]].push_back(pos[j+i]);
					imam[1][ms[0][pos[j]][l]][pos[j+i]]=1;
				}
			}
			for(int k=0; k<ms[1][pos[j+i]].size(); k++){
				if(!imam[1][pos[j]][ms[1][pos[j+i]][k]]){
					ms[1][pos[j]].push_back(ms[1][pos[j+i]][k]);
					imam[1][pos[j]][ms[1][pos[j+i]][k]]=1;
					for(int l=0; l<ms[0][pos[j]].size(); l++){
						if(!imam[1][ms[0][pos[j]][l]][ms[1][pos[j+i]][k]]){
							ms[1][ms[0][pos[j]][l]].push_back(ms[1][pos[j+i]][k]);
							imam[1][ms[0][pos[j]][l]][ms[1][pos[j+i]][k]]=1;
						}
					}
				}
			}
			ms[0][pos[j+i]].push_back(pos[j]);
			imam[0][pos[j+i]][pos[j]]=1;
			for(int l=0; l<ms[1][pos[j+i]].size(); l++){
				if(!imam[0][ms[1][pos[j+i]][l]][pos[j]]){
					ms[0][ms[1][pos[j+i]][l]].push_back(pos[j]);
					imam[0][ms[1][pos[j+i]][l]][pos[j]]=1;
				}
			}
			for(int k=0; k<ms[0][pos[j]].size(); k++){
				if(!imam[0][pos[j+i]][ms[0][pos[j]][k]]){
					ms[0][pos[j+i]].push_back(ms[0][pos[j]][k]);
					imam[0][pos[j+i]][ms[0][pos[j]][k]]=1;
					for(int l=0; l<ms[1][pos[j+i]].size(); l++){
						if(!imam[0][ms[1][pos[j+i]][l]][ms[0][pos[j]][k]]){
							ms[0][ms[1][pos[j+i]][l]].push_back(ms[0][pos[j]][k]);
							imam[0][ms[1][pos[j+i]][l]][ms[0][pos[j]][k]]=1;
						}
					}
				}
			}
		}
	}
	cout << "end\n";
	for(int i=0; i<n; i++){
		val.push_back(n-i);
		q[i]=0;
	}
	for(int i=0; i<n; i++){
		if(!q[i]){
			rijesi(i, 0);
		}
		cout << q[i] << " ";
	}
	cout << '\n';
	for(int i=0; i<n; i++){
		val.push_back(i+1);
		q[i]=0;
	}
/*	for(int i=0; i<n; i++){
		cout << "na " << i << '\n';
		for(int j=0; j<ms[1][i].size(); j++){
			cout << ms[1][i][j] << " ";
		}
		cout << '\n';
	}*/
	for(int i=0; i<n; i++){
		if(!q[i]){
			rijesi(i, 1);
		}
		cout << q[i] << " ";
	}
	cout << '\n';
	cout.flush();
	return 0;
}

Compilation message

zagonetka.cpp: In function 'void rijesi(int, bool)':
zagonetka.cpp:47:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<ms[s][x].size(); i++){
               ~^~~~~~~~~~~~~~~~
zagonetka.cpp: In function 'int main()':
zagonetka.cpp:72:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int k=0; k<ms[1][pos[j]].size(); k++){
                 ~^~~~~~~~~~~~~~~~~~~~~
zagonetka.cpp:75:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int k=0; k<ms[0][pos[j+i]].size(); k++){
                 ~^~~~~~~~~~~~~~~~~~~~~~~
zagonetka.cpp:84:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int k=0; k<query.size(); k++){
                 ~^~~~~~~~~~~~~
zagonetka.cpp:93:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int k=0; k<query.size(); k++){
                 ~^~~~~~~~~~~~~
zagonetka.cpp:112:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int l=0; l<ms[0][pos[j]].size(); l++){
                 ~^~~~~~~~~~~~~~~~~~~~~
zagonetka.cpp:118:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int k=0; k<ms[1][pos[j+i]].size(); k++){
                 ~^~~~~~~~~~~~~~~~~~~~~~~
zagonetka.cpp:122:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for(int l=0; l<ms[0][pos[j]].size(); l++){
                   ~^~~~~~~~~~~~~~~~~~~~~
zagonetka.cpp:132:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int l=0; l<ms[1][pos[j+i]].size(); l++){
                 ~^~~~~~~~~~~~~~~~~~~~~~~
zagonetka.cpp:138:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int k=0; k<ms[0][pos[j]].size(); k++){
                 ~^~~~~~~~~~~~~~~~~~~~~
zagonetka.cpp:142:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for(int l=0; l<ms[1][pos[j+i]].size(); l++){
                   ~^~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Correct 4 ms 384 KB Output is correct
4 Correct 5 ms 384 KB Output is correct
5 Correct 5 ms 384 KB Output is correct
6 Correct 5 ms 384 KB Output is correct
7 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 384 KB Output is correct
2 Correct 36 ms 384 KB Output is correct
3 Correct 34 ms 384 KB Output is correct
4 Correct 34 ms 384 KB Output is correct
5 Correct 12 ms 384 KB Output is correct
6 Correct 42 ms 384 KB Output is correct
7 Correct 10 ms 384 KB Output is correct
8 Correct 14 ms 384 KB Output is correct
9 Correct 33 ms 384 KB Output is correct
10 Correct 17 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 77 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -