社区讨论

快排常数巨大以至于加强之后只有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 条回复,欢迎继续交流。

正在加载回复...