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

题目背景

曦月最近学会了快速排序,但是她很快地想到了,如果要动态地排序,那要怎么办呢?

题目描述

为了研究这个问题,曦月提出了一个十分简单的问题

曦月希望维护一个允许重复的集合\(S\),支持:

  • 插入\([L, R]\),也就是插入\(L, L + 1 ... , R\),这\(R - L + 1\)个数
  • 询问\(Sort(S)\)

\(Sort(S)\)的定义为:

我们将集合\(S\)中的元素从小到大按照快速排序排好序,记为\(a_1, a_2 ... a_n\)

那么,\(Sort(S) = \bigoplus \limits_{i = 2}^n (a_i^2 - a_{i - 1}^2)\),其中\(\bigoplus\)表示异或和

关于异或的定义,请咨询度娘

输入输出格式

输入格式:

第一行,一个数\(q\)

后\(q\)行,或者是\(1\;l\;r\),表示插入\([l, r]\),或者是\(2\),表示一次询问

输出格式:

对于每个询问,一行一个答案

说明

对于\(30\)分的数据,\(q \leqslant 100\)

对于\(50\)分的数据,\(q \leqslant 5 * 10^4\)

对于另外的\(20\)分的数据,满足\(L=R\)

对于\(100\)分的数据,\(q \leqslant 3 * 10^5\),\(1 \leqslant L \leqslant R \leqslant 10^9\)


先考虑单独插入一个区间\([l,r]\)

然后发现贡献是\(\bigoplus_{i=l}^r 2i+1\)

把每个贡献右移一位,可以用发现是求\(\bigoplus_{i=l}^r i\),然后特判一下最后一位的奇偶。

异或前缀和有个结论

int cal(int n)
{
if(n%4==0) return n;
if(n%4==1) return 1;
if(n%4==2) return n+1;
if(n%4==3) return 0;
}

多组显然可以平衡树,但是写起来很麻烦

于是可以用线段树直接维护区间插入,对每个区间维护最左和最右位置,然后直接合并左右儿子时计算一下贡献就可以了。


Code:

#include <cstdio>
#define int long long
const int N=3e5+10;
int cal(int n)
{
if(n%4==0) return n;
if(n%4==1) return 1;
if(n%4==2) return n+1;
if(n%4==3) return 0;
}
#define ls ch[now][0]
#define rs ch[now][1]
int sum[N*20],ch[N*20][2],lp[N*20],rp[N*20],is[N*20],tot,root;
void change(int &now,int L,int R,int l,int r)
{
if(is[now]) return;
if(!now) now=++tot;
if(L==l&&R==r)
{
is[now]=1;
if(l!=r) sum[now]=((cal(r-1)^cal(l-1))<<1)|(r-l&1);
lp[now]=l;
rp[now]=r;
return;
}
int Mid=L+R>>1;
if(r<=Mid) change(ls,L,Mid,l,r);
else if(l>Mid) change(rs,Mid+1,R,l,r);
else change(ls,L,Mid,l,Mid),change(rs,Mid+1,R,Mid+1,r);
lp[now]=lp[ls];
if(!lp[now]) lp[now]=lp[rs];
rp[now]=rp[rs];
if(!rp[now]) rp[now]=rp[ls];
sum[now]=sum[ls]^sum[rs];
if(rp[ls]&&lp[rs])
sum[now]^=(lp[rs]+rp[ls])*(lp[rs]-rp[ls]);
}
const int M=1e9;
signed main()
{
int n;scanf("%lld",&n);
for(int op,l,r,i=1;i<=n;i++)
{
scanf("%lld",&op);
if(op==2)
printf("%lld\n",sum[root]);
else
{
scanf("%lld%lld",&l,&r);
change(root,1,M,l,r);
}
}
return 0;
}

2018.12.16

洛谷 P5105 不强制在线的动态快速排序的更多相关文章

  1. [洛谷P5105]不强制在线的动态快速排序

    题目大意:有一个可重集$S$,有两个操作: $1\;l\;r:$表示把$S$变为$S\cup[l,r]$ $2:$表示将$S$从小到大排序,记为$a_1,a_2,\dots,a_n$,然后求出$\bi ...

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

    P5105 不强制在线的动态快速排序 $\bigoplus \limits_{i=2}^n (a_i^2-a_{i-1}^2) = \bigoplus \limits_{i=2}^n (a_i-a_{ ...

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

    前言 考试的时候居然想错了区间贡献,mdzz 思路 题目看着很方啊,难道要树套树? 但数据范围提醒我们,是nlogn的复杂度 Sort(S)的定义是不是很鬼畜 但我们不动脑子的打表容易发现 连续区间[ ...

  4. luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set

    不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...

  5. luoguP5105 不强制在线的动态快速排序

    emm 可重集合没用用.直接变成不可重复集合 有若干个区间 每个区间形如[L,R] [L,R]计算的话,就是若干个连续奇数的和.拆位统计1的个数 平衡树维护 加入一个[L,R],把相交的区间合并.之后 ...

  6. [Luogu5105]不强制在线的动态快速排序

    首先集合去重不影响答案,然后打表易得连续自然数平方差异或前缀和的规律,于是问题就变为在线维护区间求并同时更新答案,set记录所有区间,每次暴力插入删除即可.由于每个区间至多只会插入删除一次,故均摊复杂 ...

  7. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  8. 洛谷P3676 小清新数据结构题 [动态点分治]

    传送门 思路 这思路好妙啊! 首先很多人都会想到推式子之后树链剖分+线段树,但这样不够优美,不喜欢. 脑洞大开想到这样一个式子: \[ \sum_{x} sum_x(All-sum_x) \] 其中\ ...

  9. 【洛谷】P4643 【模板】动态dp

    题解 在冬令营上听到冬眠的东西,现在都是板子了猫锟真的是好毒瘤啊(雾) (立个flag,我去thusc之前要把WC2018T1乱搞过去= =) 好的,我们可以参考猫锟的动态动态dp的课件,然后你发现你 ...

随机推荐

  1. 廖雪峰git教程学习笔记

    对git来说,没有消息就是最好的消息 使用 git init 把当前目录变为git仓库 要在仓库里加入文件,先在仓库目录新建这个文件后,比如新建一个文件xiaobai.txt,内容为: 在命令行里输入 ...

  2. 编码 解码 python

    之前一直对python文件中编码解码糊里糊涂,今天看到一篇文章,觉得把我讲的有点明白了.写个心得吧. 1.编码解码是怎么一回事? Python 里面的编码和解码也就是 unicode 和 str 这两 ...

  3. 3星|《规避政治风险:全球化企业必修课》:中国将赢得5G竞争

    规避政治风险:全球化企业必修课(<哈佛商业评论>增刊) <哈佛商业评论>的两篇文章+<财经>的1篇文章.把<财经>的文章放到增刊中,好像是第一次,我觉得 ...

  4. 2018NOIP爆0记第二弹之day1

    出门进了电梯 白底黑字的告示上只有一句话 善待你一生. 湖上的白天鹅和白鹭远远厮混成一点,抱着玻璃杯里装着的小菊花,又慢悠悠溜达去了实验楼. t1 原本写过原题,结果考场上死去活来也只搞出了个nlog ...

  5. golang应用打包成docker镜像

    golang编译的应用是不需要依赖其他运行环境的,那么为什么还需要打包成docker镜像呢?当需要附带配置和日志等文件时可以更方便的移植和运行,下面介绍从dockerfile编译成镜像. 在项目根目录 ...

  6. MUI的踩坑笔记

    最近在做公司项目的手机端实现,稍微记录下遇到的坑 1.在app开发中,若要使用HTML5+扩展api,必须等plusready事件发生后才能正常使用,mui将该事件封装成了mui.plusReady( ...

  7. 记一次centos6升级salt-minion启动失败的问题

    记一次centos6升级salt-minion启动失败的问题 作者:耀耀 blog:https://www.liuyao.me 一.起因 升级Salt-minion后 使用/etc/init.d/sa ...

  8. 利用Cocoapods创建基于SVN的私有库podspec

    由于项目年后要进行组件化,考虑到公司内部实现的一些私有组件,不对外公开,而又想在不同项目中使用,该怎么办呢?由于cocoapods有了强大的功能,可以自己创建podspec,更可以设置私有的库.那么利 ...

  9. iOS 模块化、组件化方案探索(利用cocoapods 、git 创建私有仓库)

    来自bang's blog http://blog.cnbang.net/tech/3080/ 模块化 简单来说,模块化就是将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能 ...

  10. Cocoapods更改安装版本及卸载、ruby版本检测和安装

    修改于:2017.1.10 我们实际过程中会遇到很多的问题,并且各式各样,特别是各种系统.工具版本升级后遇到的问题,最后的杀手锏就是彻底删干净,重装. 一. 移除pod组件 这条指令会告诉你Cocoa ...