이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//#define LOCAL 1
#ifndef LOCAL
#include "library.h"
#endif // LOCAL
#ifdef LOCAL
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
using namespace std;
void Solve(int N);
namespace {
struct Judge
{
int N;
int A[1002];
int pos[1002];
bool f[1002];
int query_c;
bool answered;
void init()
{
query_c=0;
int ret=scanf("%d",&N); ret++;
answered=false;
for(int i=0;i<N;i++)ret=scanf("%d",&A[i]),pos[A[i]]=i;
}
int query(const vector<int>& M)
{
if(query_c==20000)
{
puts("Wrong Answer [3]");
exit(0);
}
if(int(M.size())!=N)
{
puts("Wrong Answer [1]");
exit(0);
}
bool all_zero=true;
for(int i=0;i<N;i++)
{
if(M[i]!=0&&M[i]!=1)
{
puts("Wrong Answer [2]");
exit(0);
}
if(M[i]==1)all_zero=false;
}
if(all_zero)
{
puts("Wrong Answer [2]");
exit(0);
}
memset(f,0,sizeof(f));
for(int i=0;i<N;i++)if(M[i])f[pos[i+1]]=true;
bool las=false;
int r=0;
for(int i=0;i<N;i++)
{
if(las==false&&f[i]==true)r++;
las=f[i];
}
query_c++;
return r;
}
void answer(const vector<int>& res)
{
bool f1=true,f2=true;
if(int(res.size())!=N)
{
puts("Wrong Answer [4]");
exit(0);
}
if(answered)
{
puts("Wrong Answer [7]");
exit(0);
}
answered=true;
memset(f,0,sizeof(f));
for(int i=0;i<N;i++)
{
if(res[i]<=0||res[i]>N)
{
puts("Wrong Answer [5]");
exit(0);
}
if(f[res[i]])
{
puts("Wrong Answer [6]");
exit(0);
}
f[res[i]]=true;
}
for(int i=0;i<N;i++)
{
f1&=A[i]==res[i];
f2&=A[i]==res[N-i-1];
}
if(!f1&&!f2)
{
puts("Wrong Answer [8]");
exit(0);
}
}
void end()
{
if(!answered)puts("Wrong Answer [7]");
else printf("Accepted : %d\n",query_c);
}
}judge;
}
int Query(const vector<int>& M)
{
return judge.query(M);
}
void Answer(const vector<int>& res)
{
judge.answer(res);
}
int main()
{
if(fopen("A.INP", "r")){
freopen("A.INP", "r", stdin);
}
judge.init();
Solve(judge.N);
judge.end();
}
#endif // LOCAL
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
vector<int> vec, vis;
int ask(vector<int> vi)
{
if(vi.size() == 0) return 0;
if(vi.size() == 1) return 1;
for(int & x : vec) x = 0;
for(int x : vi) vec[x - 1] = 1;
return Query(vec);
}
int con(int u, vector<int> v)
{
int a = ask(v); v.pb(u);
int b = ask(v); return a - b + 1;
}
void Solve(int N)
{
if (N == 1) { Answer({1}); return; }
if (N == 2) { Answer({1,2}); return; }
vec.assign(N, 0);
vis.assign(N, 0);
vector<int> res;
for(int i = 1; i <= N; ++i){
vector<int> v;
for(int j = 1; j <= N; ++j){
if(i != j) v.pb(j);
}
if(ask(v) == 1){
res.pb(i);
break;
}
}
for(int i = 0; i < N - 1; ++i){
int u = res[i];
vis[u - 1] = 1;
vector<int> v;
for(int j = 0; j < N; ++j){
if(vis[j] == 0) v.pb(j + 1);
}
int l = 1, r = v.size(), mid;
while(l <= r){
mid = (l + r) / 2;
if(con(u, vector<int> (v.begin(), v.begin() + mid)))
r = mid - 1;
else l = mid + 1;
}
res.pb(v[l - 1]);
}
Answer(res);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |