제출 #200186

#제출 시각아이디문제언어결과실행 시간메모리
200186mohammedehab2002Mouse (info1cup19_mouse)C++14
90.08 / 100
162 ms4120 KiB
#include <bits/stdc++.h>
#include "grader.h"
using namespace std;
vector<int> ans;
map<vector<int>,int> m;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int myquery(vector<int> v,int f=0,int s=0)
{
	vector<int> tmp=ans;
	int pos=0;
	for (int i:v)
	{
		while (tmp[pos])
		pos++;
		tmp[pos]=i;
	}
	swap(tmp[find(tmp.begin(),tmp.end(),f)-tmp.begin()],tmp[find(tmp.begin(),tmp.end(),s)-tmp.begin()]);
	if (!m.count(tmp))
	m[tmp]=query(tmp);
	return m[tmp];
}
int go(int l,int r,vector<int> p)
{
	if (l==r)
	{
		int pos=0;
		for (int i=0;i<=l;i++)
		{
			while (ans[pos])
			pos++;
			if (i==l)
			{
				ans[pos]=p[l];
			}
			pos++;
		}
		return p[l];
	}
	if (l+1==r)
	{
		int t=1;
		while (t==p[l] || t==p[r])
		t++;
		int a=myquery(p,p[l],t);
		if (a==ans.size())
		return -1;
		int b=myquery(p,p[r],t);
		if (b==ans.size())
		return -1;
		if (a<b)
		return go(l,l,p);
		return go(r,r,p);
	}
	int a=myquery(p);
	if (a==ans.size())
	return -1;
	if (l+2==r)
	{
		int b=myquery(p,p[l],p[l+1]);
		if (b==ans.size())
		return -1;
		if (a>b)
		return go(l,l+1,p);
		return go(r,r,p);
	}
	int mid=(l+r)/2;
	for (int t=0;;t^=1)
	{
		vector<int> tmp=p;
		int nl=l,nr=r;
		if (t)
		{
			shuffle(tmp.begin()+l,tmp.begin()+mid+1,rng);
			nr=mid;
		}
		else
		{
			shuffle(tmp.begin()+mid+1,tmp.begin()+r+1,rng);
			nl=mid+1;
		}
		int b=myquery(tmp);
		if (b==ans.size())
		return -1;
		if (a>b)
		return go(nl,nr,p);
		if (a<b)
		return go(nl,nr,tmp);
	}
}
void solve(int n)
{
	ans=vector<int>(n,0);
	vector<int> cur;
	for (int i=1;i<=n;i++)
	cur.push_back(i);
	for (int i=1;i<n;i++)
	{
		while (1)
		{
			shuffle(cur.begin(),cur.end(),rng);
			int a=myquery(cur);
			if (a==ans.size())
			return;
			if (a>=i)
			break;
		}
		int a=go(0,n-i,cur);
		if (a==-1)
		return;
		cur.erase(find(cur.begin(),cur.end(),a));
	}
	myquery(cur);
}

컴파일 시 표준 에러 (stderr) 메시지

mouse.cpp: In function 'int go(int, int, std::vector<int>)':
mouse.cpp:45:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (a==ans.size())
       ~^~~~~~~~~~~~
mouse.cpp:48:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (b==ans.size())
       ~^~~~~~~~~~~~
mouse.cpp:55:7: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if (a==ans.size())
      ~^~~~~~~~~~~~
mouse.cpp:60:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (b==ans.size())
       ~^~~~~~~~~~~~
mouse.cpp:82:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (b==ans.size())
       ~^~~~~~~~~~~~
mouse.cpp: In function 'void solve(int)':
mouse.cpp:102:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if (a==ans.size())
        ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...