Submission #43917

#TimeUsernameProblemLanguageResultExecution timeMemory
43917YehezkielZagonetka (COI18_zagonetka)C++11
100 / 100
89 ms716 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define eb emplace_back
#define pb push_back
#define all(x) (x).begin(),(x).end()
typedef long long LL;
typedef pair<int,int> pii;
typedef long double LD;
const int MAXN=100;
const int batastanya=5000;
int pos[MAXN+5],totaltanya=0,n;
bool hubungan[MAXN+5][MAXN+5];
vector <int> awal,perm_min,perm_max;
void print(vector <int> v){
	for(int i=0;i<v.size();i++)
	{
		printf("%d",v[i]);
		if(i==(int) v.size()-1)
			printf("\n");
		else
			printf(" ");
	}
}
bool equal(vector <int> tanya){
	totaltanya++;
	assert(totaltanya<=batastanya);
	printf("query ");
	print(tanya);
	fflush(stdout);
	int respon;
	scanf("%d",&respon);
	return (respon);
}
void jawab(){
	printf("end\n");
	print(perm_min);
	print(perm_max);
}

void berhubungan(){
	memset(hubungan,false,sizeof(hubungan));
	int nomor;
	vector <int> temp;
	for(int i=2;i<=n;i++)			//cek hubungan 
	{
		for(int j=i-1;j>=1;j--)
		{
			//cout<<"ngecek antara "<<i<<" dengan "<<j<<endl;
			if(hubungan[i][j])			//terlah terhubung dengan pengantara
				continue;
			
			//lakukan penomoran aneh
			temp=awal;
			nomor=i;
			
			//penomoran yang musuh
			for(int k=i-1;k>=j;k--)
			{
				if(!hubungan[i][k])
					temp[pos[k]]=nomor--;
			}
			
			//penomoran yang berhubungan
			temp[pos[i]]=nomor--;
			for(int k=i-1;k>=j;k--)
			{
				if(hubungan[i][k])
					temp[pos[k]]=nomor--;
			}
			
			assert(nomor==j-1);
			if(!equal(temp))			//artinya wajib berhubungan
			{
				//ubah jadi transitive
				hubungan[i][j]=true;
				for(int k=j-1;k>=1;k--)
					if(hubungan[j][k])
						hubungan[i][k]=true;
				//cout<<"wah jadian "<<endl;
			}
		}
	}
}


vector <int> node[MAXN+5];
pair<vector <int>, vector <int> > pisahkan(vector <int> inti, vector <int> sub){			//kiri sisa inti, kanan yang sub
	vector <int> kiri,kanan;
	int j=0;
	for(int i=1;i<inti.size();i++)
	{
		while(j<sub.size()&&sub[j]<inti[i])
			j++;
		if(j<sub.size()&&sub[j]==inti[i])
			kanan.pb(inti[i]);
		else
			kiri.pb(inti[i]);
	}
	return mp(kiri,kanan);
}
void solve(vector <int> &setor,vector <int> anggota,vector <int> nomor){
	pair<vector<int> ,vector <int> > temp;
	vector <int> nomorlain;
	while(anggota.size())
	{
			/*cout<<"solving dengan anggota"<<endl;
			for(auto isi:anggota)
				cout<<isi<<" ";
			cout<<endl;
			cout<<"nomornya "<<endl;
			for(auto isi:nomor)
				cout<<isi<<" ";
			cout<<endl;*/
			
		temp=pisahkan(anggota,node[anggota[0]]);
		int delta=temp.se.size()+1;
		
		setor[anggota[0]]=nomor[delta-1];
		nomorlain.clear();
		for(int i=0;i<delta-1;i++)
			nomorlain.pb(nomor[i]);
		
		for(int i=0;i+delta<nomor.size();i++)
			nomor[i]=nomor[i+delta];
		nomor.resize((int) nomor.size()-delta);
		
		anggota=temp.fi;
		
		solve(setor,temp.se,nomorlain);
	}
}
void solve(){
	perm_min.resize(n);
	perm_max.resize(n);
	for(int ulang=0;ulang<2;ulang++)
	{
		for(int i=0;i<n;i++)
			node[i].clear();
		
		//construct graph
		for(int i=2;i<=n;i++)
		{
			for(int j=1;j<i;j++)
			{
				if(hubungan[i][j])
				{
					if(ulang==0)
						node[pos[i]].pb(pos[j]);
					else
						node[pos[j]].pb(pos[i]);
				}
			}
		}
		
		for(int i=0;i<n;i++)
			sort(all(node[i]));
		
		vector <int> anggota,nomor;
		for(int i=0;i<n;i++)
		{
			anggota.pb(i);
			nomor.pb(i+1);
		}
		
		if(ulang==0)
			solve(perm_min,anggota,nomor);
		else
			solve(perm_max,anggota,nomor);
			
		if(ulang==1)
		{
			for(auto &isi:perm_max)
				isi=n-isi+1;
		}
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int input;
		scanf("%d",&input);
		pos[input]=awal.size();
		awal.pb(input);
	}
	assert(equal(awal));			//test test ji
	
	berhubungan();
	solve();
	jawab();
}

Compilation message (stderr)

zagonetka.cpp: In function 'void print(std::vector<int>)':
zagonetka.cpp:18:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<v.size();i++)
              ~^~~~~~~~~
zagonetka.cpp: In function 'std::pair<std::vector<int>, std::vector<int> > pisahkan(std::vector<int>, std::vector<int>)':
zagonetka.cpp:93:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=1;i<inti.size();i++)
              ~^~~~~~~~~~~~
zagonetka.cpp:95:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(j<sub.size()&&sub[j]<inti[i])
         ~^~~~~~~~~~~
zagonetka.cpp:97:7: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(j<sub.size()&&sub[j]==inti[i])
      ~^~~~~~~~~~~
zagonetka.cpp: In function 'void solve(std::vector<int>&, std::vector<int>, std::vector<int>)':
zagonetka.cpp:126:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i+delta<nomor.size();i++)
               ~~~~~~~^~~~~~~~~~~~~
zagonetka.cpp: In function 'bool equal(std::vector<int>)':
zagonetka.cpp:34:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&respon);
  ~~~~~^~~~~~~~~~~~~~
zagonetka.cpp: In function 'int main()':
zagonetka.cpp:182:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
  ~~~~~^~~~~~~~~
zagonetka.cpp:186:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&input);
   ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...