社区讨论
快排常数巨大以至于加强之后只有60pts,求改进思路
P9452 [ZSHOI-R1] 河外塔(加强版)参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo2a8gvy
- 此快照首次捕获于
- 2023/10/23 10:32 2 年前
- 此快照最后确认于
- 2023/11/03 10:44 2 年前
n=40000的时候操作大概1800000次
CPP#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
#define N 200005
ll n;
stack<ll> s[4];
ll a[40005];
ll tot=0,from[2000005],to[2000005];
inline void mov(ll x,ll y){
ll t=s[x].top();
s[x].pop();
s[y].push(t);
tot++;
from[tot]=x;to[tot]=y;
}
void xmov(ll x,ll y,ll z,ll w){
for(int i=1;i<=w;i++)mov(x,z);
for(int i=1;i<=w;i++)mov(z,y);
}
void qsort(ll l,ll r,ll x){
//cout<<l<<" "<<r<<" "<<x<<"\n";
ll mid=(l+r)>>1,cnt=r-l+1;
if(cnt==1)return;
ll y,z;//y:<=mid,z:>mid
if(x==1)y=2,z=3;
if(x==2)y=1,z=3;
if(x==3)y=1,z=2;
for(int i=l;i<=r;i++){
ll t=s[x].top();
if(t>mid)mov(x,z);
else mov(x,y);
}
qsort(l,mid,y);
qsort(mid+1,r,z);
ll lcnt=mid-l+1,rcnt=r-(mid+1)+1;
xmov(z,x,y,rcnt);
xmov(y,x,z,lcnt);
}
int main(){
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
//ios::sync_with_stdio(false);
//cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=n;i>=1;i--){
s[1].push(a[i]);
}
qsort(1,n,1);
xmov(1,3,2,n);
cout<<tot<<"\n";
for(int i=1;i<=tot;i++){
cout<<" ABC"[from[i]]<<" "<<" ABC"[to[i]]<<"\n";
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...