Submission #784719

#TimeUsernameProblemLanguageResultExecution timeMemory
784719kshitij_sodaniPark (JOI17_park)C++14
77 / 100
253 ms624 KiB
#include "park.h"
#include <bits/stdc++.h>
using namespace std;
#define a first
#define b second
#define pb push_back
typedef long long llo;
#define endl '\n'

int query(int x,int y,int Place[]){
	return Ask(min(x,y),max(x,y),Place);
}
static int cur[1501];
vector<int> adj[1501];
int vis[1501];
int par3[1501];
vector<int> ss;
void dfs(int no,int par=-1){
	ss.pb(no);
	for(auto j:adj[no]){
		if(j!=par){
			dfs(j,no);
		}
	}
}

int n;
vector<int> kk;
int xa;
bool cmp(int aa,int bb){
	if(aa==bb){
		return false;
	}
	for(int i=0;i<n;i++){
		cur[i]=0;
	}
	for(auto j:kk){
		cur[j]=1;
	}
	cur[xa]=1;
	cur[aa]=0;
	if(query(min(xa,bb),max(xa,bb),cur)==1){
		return false;
	}
	else{
		return true;
	}
}
int val[1501];
vector<int> ee;
void dfs3(int no,int par=-1){
	ee.pb(no);
	for(auto j:adj[no]){
		if(j!=par and val[j]==1){
			dfs3(j,no);
		}
	}
}
vector<pair<int,int>> ans;
void solve(int i,vector<int> tt){
	if(tt.size()==0){
		return;
	}
	for(int j=0;j<n;j++){
		val[j]=0;
	}
	for(auto j:tt){
		val[j]=1;
	}
	assert(val[i]==0);
	ee.clear();
	dfs3(tt[0]);
	for(int j=0;j<n;j++){
		cur[j]=0;
	}
	for(auto j:ee){
		cur[j]=1;
	}
	cur[i]=1;
	if(query(i,ee[0],cur)==1){
		int low=-1;
		for(int j=19;j>=0;j--){
			if(low+(1<<j)<ee.size()){
				for(int ii=0;ii<ee.size();ii++){
					if(ii<=(low+(1<<j))){
						cur[ee[ii]]=1;
					}
					else{
						cur[ee[ii]]=0;
					}
				}

				if(query(i,ee[0],cur)==0){
					low+=(1<<j);
				}
			}
		}
		low++;
		int x=ee[low];
		ans.pb({x,i});
		vector<int> mm;
		
		for(auto j:adj[x]){
			if(val[j]==1){
				mm.pb(j);
			}
		}
		val[x]=0;
		vector<vector<int>> za;
		for(auto j:mm){
			ee.clear();
			dfs3(j);
			za.pb(ee);
		}
		for(auto j:za){
			solve(i,j);
		}
	}
	else{
		return;
	}



}

void Detect(int t, int nn) {
	int i;
	n=nn;
	if(t==1){
		for(int i=0;i<n;i++){
			for(int j=i+1;j<n;j++){
				for(int x=0;x<n;x++){
					cur[x]=0;
				}
				cur[i]=1;
				cur[j]=1;
				if(query(i,j,cur)==1){
					Answer(i,j);
				}
			}
		}
		return;
	}
	vis[0]=1;
	for(int i=1;i<n;i++){
		if(vis[i]==0){
			ss.clear();
			dfs(0);
			for(int j=0;j<n;j++){
				cur[j]=1;
			}
			int low=-1;
			for(int j=19;j>=0;j--){
				if(low+(1<<j)<ss.size()){
					for(int ii=0;ii<ss.size();ii++){
						if(ii<=(low+(1<<j))){
							cur[ss[ii]]=1;
						}
						else{
							cur[ss[ii]]=0;
						}
					}
				/*	if(i==2 and low+(1<<j)==0){
						for(int jj=0;jj<n;jj++){
							cout<<cur[jj]<<",,";
						}
						cout<<endl;
						cout<<query(0,i,cur)<<endl;

					}*/
					if(query(0,i,cur)==0){
						low+=(1<<j);
					}
				}
			}
			low++;
			int x=ss[low];
		/*	for(auto  j:ss){
				cout<<j<<"::";
			}
			cout<<low<<"?"<<endl;
			cout<<endl;
*/
			vector<int> tt;
			vis[i]=1;
			for(int j=0;j<n;j++){
				if(vis[j]==0){
					tt.pb(j);
				}
			}
			for(int j=0;j<n;j++){
				cur[j]=0;
			}
			for(int j=0;j<=low;j++){
				cur[ss[j]]=1;
			}
			cur[i]=1;
			low=-1;
		//	cout<<22<<endl;


			
			kk.clear();
			

			while(true){
				for(int j=19;j>=0;j--){
					if(low+(1<<j)<tt.size()){
						for(int ii=0;ii<tt.size();ii++){
							if(ii<=(low+(1<<j))){
								cur[tt[ii]]=0;
							}
							else{
								cur[tt[ii]]=1;
							}
						}
						for(auto ii:kk){
							cur[ii]=1;
						}
					/*	cout<<33<<endl;
						for(int jj=0;jj<n;jj++){
							cout<<cur[jj]<<":";
						}
						cout<<endl;*/
						if(query(0,i,cur)==1){
							low+=(1<<j);
						}
					}
				}
				//from prev to low nothing is there
				//low+1 is there
				if(low+1==tt.size()){
					break;
				}
				low++;
				kk.pb(tt[low]);
				//low+1 must be there
			}
		//	cout<<44<<endl;
			//you need to sort elements of kk between x and i
			for(auto j:kk){
				vis[j]=1;
			}
			xa=x;
			sort(kk.begin(),kk.end(),cmp);
			
			kk.pb(i);
		/*	cout<<x<<",";
			for(auto  j:kk){
				cout<<j<<",";
			}
			cout<<endl;*/
			for(auto j:kk){
				adj[x].pb(j);
				par3[j]=x;
				adj[j].pb(x);
				x=j;
			}
		}
	}
	for(int i=1;i<n;i++){
		for(auto j:adj[par3[i]]){
			if(j==i){
				continue;
			}
			ss.clear();
			dfs(j,par3[i]);
			solve(i,ss);
		}
	}
	for(int i=0;i<n;i++){
		for(auto j:adj[i]){
			if(i>j){
				continue;
			}
			//cout<<i<<":"<<j<<endl;
			Answer(min(i,j),max(i,j));
		}
	}
	for(auto j:ans){
	//	cout<<j.a<<"::"<<j.b<<endl;
		Answer(min(j.a,j.b),max(j.a,j.b));
	}

}

Compilation message (stderr)

park.cpp: In function 'void solve(int, std::vector<int>)':
park.cpp:83:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |    if(low+(1<<j)<ee.size()){
      |       ~~~~~~~~~~^~~~~~~~~~
park.cpp:84:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   84 |     for(int ii=0;ii<ee.size();ii++){
      |                  ~~^~~~~~~~~~
park.cpp: In function 'void Detect(int, int)':
park.cpp:155:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  155 |     if(low+(1<<j)<ss.size()){
      |        ~~~~~~~~~~^~~~~~~~~~
park.cpp:156:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  156 |      for(int ii=0;ii<ss.size();ii++){
      |                   ~~^~~~~~~~~~
park.cpp:209:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  209 |      if(low+(1<<j)<tt.size()){
      |         ~~~~~~~~~~^~~~~~~~~~
park.cpp:210:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  210 |       for(int ii=0;ii<tt.size();ii++){
      |                    ~~^~~~~~~~~~
park.cpp:233:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  233 |     if(low+1==tt.size()){
      |        ~~~~~^~~~~~~~~~~
park.cpp:128:6: warning: unused variable 'i' [-Wunused-variable]
  128 |  int 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...
#Verdict Execution timeMemoryGrader output
Fetching results...