P5105 不强制在线的动态快速排序

P5105 不强制在线的动态快速排序

$\bigoplus \limits_{i=2}^n (a_i^2-a_{i-1}^2) = \bigoplus \limits_{i=2}^n (a_i-a_{i-1})×(a_i+a_{i-1})$

关于$l~r$区间,由于$a_i=a_{i-1}+1$

$ \bigoplus \limits_{i=l}^{r-1} (2i+1)=\bigoplus \limits_{i=1}^{r-1} (2i+1)\bigoplus \limits_{i=1}^{l-1} (2i+1)$

区间内奇数异或和,按位分解,其实只与$2^i$的个数有关

打表,可以发现$O(1)$的规律

设$n=4m+k$

当$k=\{0,1,2,3\}$前缀和分别为$\{2n,3,2n+2,1\}$

线段树维护区间异或和,修改$O(log_1e9)$查询$O(1)$

My complete code:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long LL;
inline LL Read(){
    LL x=0,f=1; char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') f=-1; c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<3)+(x<<1)+c-'0'; c=getchar();
    }return x*f;
}
const LL maxn=10000000;
const LL inf=1e10;
struct node{
    LL mx,mi,son[2],sum,lazy;
}tree[maxn];
LL nod,m,root;
inline void Update(LL now){
    LL l=tree[now].son[0],r=tree[now].son[1];
    tree[now].mi=tree[l].mi?tree[l].mi:tree[r].mi;
    tree[now].mx=tree[r].mx?tree[r].mx:tree[l].mx;
    tree[now].sum=tree[l].sum^tree[r].sum;
    if(l&&r)
        tree[now].sum^=(tree[l].mx+tree[r].mi)*(tree[r].mi-tree[l].mx);
    if(tree[l].lazy&&tree[r].lazy)
        tree[now].lazy=1;
}
inline LL Get(LL x){
    LL now=x%4;
    if(!now)
        return x<<1;
    if(now==1)
        return 3;
    if(now==2)
        return (x<<1)+2;
    return 1;
}
void Add(LL &now,LL l,LL r,LL lt,LL rt){
    if(lt>r||rt<l||tree[now].lazy) 
        return;
    if(!now)
        now=++nod;
    if(lt<=l&&rt>=r){
        tree[now].mi=l,
        tree[now].mx=r,
        tree[now].sum=Get(l-1)^Get(r-1);
        tree[now].lazy=1;
        return;
    }
    LL mid=(l+r)>>1;
    Add(tree[now].son[0],l,mid,lt,rt);
    Add(tree[now].son[1],mid+1,r,lt,rt);
    Update(now);
}
int main(){
    m=Read();
    while(m--){
        LL op=Read(),l,r;
        if(op==1)
            l=Read(),r=Read(),
            Add(root,1,1e9,l,r);
        else
            printf("%lld\n",tree[root].sum);
    }
    return 0;
}

  

转载于:https://www.cnblogs.com/y2823774827y/p/10129578.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值