This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define pb push_back
#define mp make_pair
#define PI ( acos(-1.0) )
#define IN freopen("hard1.txt","r",stdin)
#define OUT freopen("hard1.txt","w",stdout)
#define FOR(i,a,b) for(i=a ; i<=b ; i++)
#define DBG printf("Hi\n")
#define i64 long long int
#define eps (1e-8)
#define xx first
#define yy second
#define ln 17
#define off 1000005
#define FastIO ios_base::sync_with_stdio(false); cin.tie(NULL)
using namespace __gnu_pbds;
using namespace std ;
typedef tree< i64, null_type, less<i64>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
typedef pair<i64, i64> pii ;
#define maxn 1000005
#define mod 1000000007LL
#define lim 1000000000
#define INF 4500000000000000000LL
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#include <grader.h>
/*
vector <int> myPerm ;
int query( vector <int> vec )
{
int mat = 0 ;
for(int i=0 ; i<vec.size() ; i++)
{
if( vec[i]==myPerm[i] ) mat++ ;
}
return mat ;
}
*/
int ask( vector <int> vec )
{
int N = (int)vec.size() ;
for(int i=0 ; i<N ; i++) vec[i]++ ;
return query(vec) ;
}
int askWithDoubt( vector <int> perm , vector < pair<int,int> > doubt )
{
for(int i=0 ; i<doubt.size() ; i++)
{
swap( perm[ doubt[i].xx ] , perm[ doubt[i].yy ] ) ;
}
int mat = ask(perm) ;
return mat ;
}
pair<int,int> recur( vector <int> perm , vector < pair<int,int> > doubt )
{
if( doubt.size() == 1 ) return doubt[0] ;
int m = (doubt.size())/2 ;
vector < pair<int,int> > d1 , d2 ;
for(int i=0 ; i<m ; i++) d1.pb(doubt[i]) ;
for(int i=m ; i<doubt.size() ; i++) d2.pb( doubt[i] ) ;
int mat = askWithDoubt(perm,d1) ;
if(mat) return recur(perm,d1) ;
else return recur(perm,d2) ;
}
int vis[305] ;
vector <int> g[305] ;
void solve(int N)
{
// DBG ;
vector <int> perm ;
for(int i=0 ; i<N ; i++) perm.pb(i) ;
while( 1 )
{
if( ask(perm) == 0 ) break ;
shuffle( perm.begin() , perm.end() , rng ) ;
}
// for(int i=0 ; i<perm.size() ; i++) printf("%d ",perm[i]+1) ;
// printf("\n") ;
int M = N ;
if(M%2 == 0 ) M-- ;
vector < pair<int,int> > realPairs ;
for(int i=0 ; i<M ; i++)
{
vector < pair<int,int> > doubt ;
for(int j=0 ; j<M ; j++)
{
if(i==j) continue ;
// printf("-- %d %d\n" , i , j ) ;
int x = j, y = (( 2*i - x)%M + M)%M ;
// printf("%d %d\n",y,M) ;
if(y<x) continue ;
doubt.pb( mp(x,y) ) ;
}
if( N!=M ) doubt.pb( mp(i,M) ) ;
// for( auto d: doubt) printf("%d %d\n",d.xx,d.yy) ;
// printf("\n\n") ;
while( doubt.size() > 0 && askWithDoubt(perm,doubt) > 0 )
{
pair<int,int> p = recur(perm,doubt) ;
realPairs.pb(p) ;
for(int i=0 ; i<doubt.size() ; i++)
{
if( doubt[i]==p )
{
doubt.erase(doubt.begin()+i) ;
break ;
}
}
}
}
for(int i=0 ; i<N ; i++) g[i].clear() ;
for(int i=0 ; i<realPairs.size() ; i++)
{
int u = realPairs[i].xx , v = realPairs[i].yy ;
g[ u ].pb(v) ; g[v].pb(u) ;
}
// for(int i=0 ; i<realPairs.size() ; i++) printf("%d %d\n",realPairs[i].xx,realPairs[i].yy) ;
vector <int> ans(N,0) ;
memset(vis,0,sizeof(vis)) ;
for(int i=0 ; i<N ; i++)
{
if(vis[i]) continue ;
vector <int> vec ;
int cur = i ;
if( g[cur].size()==1 || g[cur][0] == g[cur][1] )
{
int u = cur , v = g[cur][0] ;
vis[u] = 1 ; vis[v] = 1 ;
ans[u] = perm[v] ; ans[v] = perm[u] ;
continue ;
}
vis[cur] = 1 ;
vec.pb(cur) ;
int prev = cur ;
vec.pb(cur) ;
cur = g[cur][0] ;
while( !vis[cur] )
{
vec.pb(cur) ;
vis[cur] = 1 ;
int nCur = (g[cur][0]^g[cur][1]^prev) ;
prev = cur ;
cur = nCur ;
}
vector <int> nPerm = perm ;
int temp = nPerm[ vec[0] ] ;
for(int i=1 ; i<vec.size() ; i++)
{
nPerm[ vec[i-1] ] = nPerm[ vec[i] ] ;
}
nPerm[ vec.back() ] = temp ;
int mat = ask(nPerm) ;
if(mat > 0)
{
for(int i=0 ; i<vec.size() ; i++)
{
ans[ vec[i] ] = nPerm[vec[i] ] ;
}
}
else{
for(int i=1 ; i<vec.size() ; i++) ans[ vec[i] ] = perm[ vec[i-1] ] ;
ans[ vec[0] ] = perm[ vec.back() ] ;
}
}
/*
for(int i=0 ; i<ans.size() ; i++) printf("%d ",ans[i]+1) ;
printf("\n") ; */
ask(ans) ;
}
/*
int main()
{
myPerm = { 3 , 1 , 5 , 2 , 7 , 4 , 6 } ;
solve(7) ;
return 0 ;
}
*/
Compilation message (stderr)
mouse.cpp: In function 'int askWithDoubt(std::vector<int>, std::vector<std::pair<int, int> >)':
mouse.cpp:59:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0 ; i<doubt.size() ; i++)
~^~~~~~~~~~~~~
mouse.cpp: In function 'std::pair<int, int> recur(std::vector<int>, std::vector<std::pair<int, int> >)':
mouse.cpp:75:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=m ; i<doubt.size() ; i++) d2.pb( doubt[i] ) ;
~^~~~~~~~~~~~~
mouse.cpp: In function 'void solve(int)':
mouse.cpp:127:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0 ; i<doubt.size() ; i++)
~^~~~~~~~~~~~~
mouse.cpp:140:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0 ; i<realPairs.size() ; i++)
~^~~~~~~~~~~~~~~~~
mouse.cpp:183:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=1 ; i<vec.size() ; i++)
~^~~~~~~~~~~
mouse.cpp:192:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0 ; i<vec.size() ; i++)
~^~~~~~~~~~~
mouse.cpp:198:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=1 ; i<vec.size() ; i++) ans[ vec[i] ] = perm[ vec[i-1] ] ;
~^~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |