이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define sf scanf
#define pf printf
#define pb emplace_back
typedef long long ll;
#define maxn 131077
int n,x,ft[maxn];
vector<int> v,ans,t[2];
void up(int x,int nv){
while(x<=n)ft[x]+=nv,x+=x&-x;
}
int qry(int x){
int res=0;
while(x)res+=ft[x],x-=x&-x;
return res;
}
ll inv(int i){
memset(ft,0,sizeof ft);
ll res=0;
for(int x:t[i]){
res+=qry(x);
up(1,1);up(x+1,-1);
}
return res;
}
int main(){
sf("%d",&n);n=(1<<n);
for(int i=0;i<n;++i){
sf("%d",&x);v.pb(++x);
}
swap(v,t[0]);
ll pv=inv(0);
swap(v,t[0]);
while(true){
//pf("%lld\n",pv);
t[0].clear();t[1].clear();
for(int i=0;i<n;i+=2)t[1].pb(v[i]);
for(int i=1;i<n;i+=2)t[1].pb(v[i]);
for(int i=n/2;i<n;++i)t[0].pb(v[i]);
for(int i=0;i<n/2;++i)t[0].pb(v[i]);
//for(int x:t[0])pf("%d ",x);pf("\n");
//for(int x:t[1])pf("%d ",x);pf("\n");
ll a=inv(0),b=inv(1);
if(a>pv&&b>pv)break;
if(a<b){
ans.pb(1);
swap(v,t[0]);
pv=a;
}
else{
ans.pb(2);
swap(v,t[1]);
pv=b;
}
}
pf("%lld\n",pv);
for(int x:ans)pf("%d",x);
pf("\n");
}
컴파일 시 표준 에러 (stderr) 메시지
cheerleaders.cpp: In function 'int main()':
cheerleaders.cpp:33:4: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
33 | sf("%d",&n);n=(1<<n);
| ^
cheerleaders.cpp:35:5: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
35 | sf("%d",&x);v.pb(++x);
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |