专栏文章

题解:AT_abc253_g [ABC253G] Swap Many Times

AT_abc253_g题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqq35xl
此快照首次捕获于
2025/12/04 08:53
3 个月前
此快照最后确认于
2025/12/04 08:53
3 个月前
查看原文

前言

为啥题解清一色是找性质呢?其实这道题可以直接暴力 ds 的,就是复杂度劣一些。

解法

我们注意到,一段形如 (i,l),(i,l+1),,(i,r)(i,l),(i,l+1),\dots,(i,r) 的操作等价于对 aia_ial,al+1,,ara_l,a_{l+1},\dots,a_r 作循环右移。形式化地:
  • ai=ara'_i=a_r
  • al=aia'_l=a_i
  • ap=ap1(l<pr)a'_p=a_{p-1}(l<p\le r)
那么我们对于这个操作直接上平衡树就行了,复杂度 O(nlogn)\mathcal{O}(n\log n)
这里我采用 FHQ Treap 实现。这里仅展示循环移位部分,其他部分请读者自行实现:
CPP
ll s=0,l,r;
for(int i=1;i<=n;i++){
  s+=n-i;
  if(s>=lp){
    l=n-s+lp;r=n;
    if(s>=rp) r=n-s+rp;
    //i l~r
    int r1,r2,r3,r4,r5,r6;
    split(r1,r2,l-1,rt);
    split(r2,r3,r-l+1,r2);
    split(r2,r6,r-l,r2);
    split(r1,r4,i-1,r1);
    split(r4,r5,1,r4);
    //r1 -> 1~i-1  r4 -> i r5 -> i+1~l-1
    //r2 -> l~r-1 r6 -> r r3 -> r+1~n
    rt=merge(r1,r6);
    rt=merge(rt,r5);
    rt=merge(rt,r4);
    rt=merge(rt,r2);
    rt=merge(rt,r3);
    if(s<rp) lp=s+1;
    else break;
  }
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...