洛谷 P5105 不强制在线的动态快速排序
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 不强制在线的动态快速排序的更多相关文章
- [洛谷P5105]不强制在线的动态快速排序
题目大意:有一个可重集$S$,有两个操作: $1\;l\;r:$表示把$S$变为$S\cup[l,r]$ $2:$表示将$S$从小到大排序,记为$a_1,a_2,\dots,a_n$,然后求出$\bi ...
- P5105 不强制在线的动态快速排序
P5105 不强制在线的动态快速排序 $\bigoplus \limits_{i=2}^n (a_i^2-a_{i-1}^2) = \bigoplus \limits_{i=2}^n (a_i-a_{ ...
- luogu P5105 不强制在线的动态快速排序
前言 考试的时候居然想错了区间贡献,mdzz 思路 题目看着很方啊,难道要树套树? 但数据范围提醒我们,是nlogn的复杂度 Sort(S)的定义是不是很鬼畜 但我们不动脑子的打表容易发现 连续区间[ ...
- luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set
不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...
- luoguP5105 不强制在线的动态快速排序
emm 可重集合没用用.直接变成不可重复集合 有若干个区间 每个区间形如[L,R] [L,R]计算的话,就是若干个连续奇数的和.拆位统计1的个数 平衡树维护 加入一个[L,R],把相交的区间合并.之后 ...
- [Luogu5105]不强制在线的动态快速排序
首先集合去重不影响答案,然后打表易得连续自然数平方差异或前缀和的规律,于是问题就变为在线维护区间求并同时更新答案,set记录所有区间,每次暴力插入删除即可.由于每个区间至多只会插入删除一次,故均摊复杂 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 洛谷P3676 小清新数据结构题 [动态点分治]
传送门 思路 这思路好妙啊! 首先很多人都会想到推式子之后树链剖分+线段树,但这样不够优美,不喜欢. 脑洞大开想到这样一个式子: \[ \sum_{x} sum_x(All-sum_x) \] 其中\ ...
- 【洛谷】P4643 【模板】动态dp
题解 在冬令营上听到冬眠的东西,现在都是板子了猫锟真的是好毒瘤啊(雾) (立个flag,我去thusc之前要把WC2018T1乱搞过去= =) 好的,我们可以参考猫锟的动态动态dp的课件,然后你发现你 ...
随机推荐
- python-gevent模块实现socket大并发
服务器端:gevent_server.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...
- head和tail命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/amosli/p/3496027.html 当要查看上千行的大文件时,我们可不会用cat命令把整个文件内容给打印出来,相 ...
- Mysql DataPacketTooBigException异常处理
在本地上运行好好,然后发布到服务器上去, 总是报错,后来查了一下日志,得到了如下的错误日志: [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] Pa ...
- 互评Beta版本 - Hello World团队项目空天猎
由于改组项目未提供可以直接进行安装运行的安装包或可执行文件,所以我找到了该组组长陈同学,由他根据其小组项目的功能说明书进行演示. 基于NABCD评论作品,及改进建议 每个小组评论其他小组beta发布的 ...
- jQuery获取复选框选中的每一个值
$('input[name="serviceMode"]:checked').each(function(){ this.attr('value') });
- spring boot开启热部署
步骤一:添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- 第二阶段每日站立会议Second Day
昨天我在手机端安装cpp后进行界面效果测试以及进一步完善 今天对图片显示的大小进行调整 遇到的问题:当图片太小时,显示一块灰色区域,不美观
- 【Coursera】经验风险最小化
一.经验风险最小化 1.有限假设类情形 对于Chernoff bound 不等式,最直观的解释就是利用高斯分布的图象.而且这个结论和中心极限定律没有关系,当m为任意值时Chernoff bound均成 ...
- 微信小程序之Flex布局
微信小程序页面布局方式采用的是Flex布局.Flex布局,是W3c在2009年提出的一种新的方案,可以简便,完整,响应式的实现各种页面布局.Flex布局提供了元素在容器中的对齐,方向以及顺序,甚至他们 ...
- 转 彻底理解js中的&&和||
javascript中,&&和||的用法比较神奇,经常用在对象上,例如a || b,如果a不存在,则返回b.a && b,如果a存在,则返回b,否则返回a. 光这样看, ...