QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#747345 | #9432. Permutation | Nahidameow | TL | 0ms | 0kb | C++20 | 3.5kb | 2024-11-14 16:56:49 | 2024-11-14 16:56:50 |
answer
#include<bits/stdc++.h>
#define pd push_back
#define all(A) A.begin(),A.end()
#define lb lower_bound
#define ve std::vector
typedef long long ll;
typedef long long ll;
typedef __int128 Int;
typedef unsigned long long ul;
typedef long double LD;
bool FileIfstream(std::string name){
std::ifstream f(name.c_str());
return f.good();
}
namespace Math{
ll QP(ll x,ll y,ll mod){ll ans=1;for(;y;y>>=1,x=x*x%mod)if(y&1)ans=ans*x%mod;return ans;}
ll inv(ll x,ll mod){return QP(x,mod-2,mod);}
}
const int N=2e5+10;
const int mod=998244353;
namespace Grader{
std::vector<int>S;
int n;ve<int>P;
int tot;
void init(int _n){
n=_n;P.resize(n+1);
for(int i=1;i<=n;i++)std::cin>>P[i];
tot=0;
}
void Get(std::vector<int>v){
assert(S.empty());
if(v.size()!=n+1){std::cout<<"size(n) is not ok\n";exit(0);}
if(v[0]==0){
tot++;
int cnt=0;
for(int i=1;i<=n;i++){
if(v[i]<1||v[i]>n){
std::cout<<"range(v) is not ok\n";
for(int j=1;j<=n;j++)
std::cout<<v[j]<<' ';
exit(0);
}
cnt+=v[i]==P[i];
}
S.pd(cnt);
}else{
for(int i=1;i<=n;i++)
if(v[i]!=P[i]){
std::cout<<"not ok\n";
for(int j=1;j<=n;j++)
std::cout<<v[j]<<' ';
exit(0);
}
std::cout<<"ok\n";
std::cout<<"times: "<<tot<<'\n';
}
reverse(all(S));
}
int readInt(){
assert(!S.empty());
int x=S.back();
S.pop_back();
return x;
}
void putInt(int x){
std::vector<int>P;
P.pd(x);Get(P);
}void putVec(std::vector<int>v){Get(v);}
}
std::mt19937 rnd(time(NULL));
int Grnd(int l,int r){return rnd()%(r-l+1)+l;}
void solve(){
//don't forget to open long long
int n;std::cin>>n;Grader::init(n);
if(n==1)return std::cout<<"1 1\n",std::cout.flush(),void();
auto query=[&](ve<int>v)->int{
v.insert(v.begin(),0);
//for(auto &p:v)std::cout<<p<<' ';std::cout<<'\n';
//std::cout.flush();
Grader::putVec(v);
int x;
x=Grader::readInt();
//std::cin>>x;
return x;
};
ve<int>ans(n+1);ans[0]=1;
// int F=Grnd(1,n);int pos=0;
// for(int i=1;i<=n;i++){
// ve<int>v(n,(F==1)?2:1);v[i-1]=F;
// if(query(v)==2){pos=i;break;}
// }
ve<int>vt;
for(int i=1;i<=n;i++)vt.pd(i);
auto calc=[&](int l,int r,ve<int>vt,auto self)->void{
if(l==r)return ans[l]=vt[0],void();
ve<int>L,R;auto mid=l+r>>1;
ve<ve<int>>v;
for(auto &p:vt)v.pd({p});
shuffle(all(v),rnd);
while(v.size()>1){
ve<int>P1=v.back();v.pop_back();
ve<int>P2=v.back();v.pop_back();
ve<int>rv(n);
for(int i=1;i<=mid;i++)rv[i-1]=P1[0];
for(int i=mid+1;i<=n;i++)rv[i-1]=P2[0];
int p=query(rv);
if(p==0){
for(auto &p:P1)R.pd(p);
for(auto &p:P2)L.pd(p);
}else if(p==2){
for(auto &p:P1)L.pd(p);
for(auto &p:P2)R.pd(p);
}else{
for(auto &p:P2)P1.pd(p);
v.pd(P1);
}
}
if(v.size()==1){
if(L.size()!=mid-l+1)for(auto &p:v[0])
L.pd(p);
else for(auto &p:v[0])
R.pd(p);
}
self(l,mid,L,self);
self(mid+1,r,R,self);
};
calc(1,n,vt,calc);
Grader::putVec(ans);
}
int main(){
#ifndef ONLINE_JUDGE
if(!FileIfstream("IO.in")){
freopen("IO.in","w",stdout);
return 0;
}
freopen("IO.in","r",stdin);
freopen("IO.out","w",stdout);
#endif
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int T=1;
//std::cin>>T;
while(T--)solve();
#ifndef ONLINE_JUDGE
std::cerr<<std::fixed<<std::setprecision(10)<<1.0*clock()/CLOCKS_PER_SEC<<'\n';
#endif
return 0;
}
详细
Test #1:
score: 0
Time Limit Exceeded
input:
5