luoguP5105 不强制在线的动态快速排序
emm
可重集合没用用。直接变成不可重复集合
有若干个区间
每个区间形如[L,R]
[L,R]计算的话,就是若干个连续奇数的和。拆位统计1的个数
平衡树维护
加入一个[L,R],把相交的区间合并。之后相邻不相交的部分O(1)计算贡献到答案里。
O(nlogn+30n)
写起来并不太好写
set就可以
删除一些区间,合并成大区间
要分类讨论
至于calc(l,r)
有O(1)公式,可以不用按位:

第一个第二个发现了,后面就是多余位置处理即可。
代码:
1.注意插入区间被包含的情况,删掉前驱,R还要取一个max
2.按位的话,最高的是1e9+1e9=2e9,是1<<30,不是29.。。
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
int q;
struct po{
ll l,r;
po(){}
po(int x,int y){
l=x;r=y;
}
bool friend operator <(po a,po b){
if(a.l!=b.l) return a.l<b.l;
return a.r<b.r;
}
};
set<po>s;
set<po>::iterator it,le,ri;
ll ans;
ll pre(int x,ll p){
if(p==) return x%;
if(p==) {
if(x%==) return ;
if(x%==) return ;
if(x%==) return ;
if(x%==) return ;
}
x=x%(<<p);
if(x==) return (<<(p-))%;
return max(,x-(<<(p-)))%;
}
ll clac(int l,int r){
ll ret=;
l=(l+l+)/+;
r=(r+r-)/+;
if(l>r) return ;
for(ll i=;i>=;--i){
ret+=(pre(r,i)-pre(l-,i)+++)%*(<<i);
}
return ret;
}
void dele(int typ){ if(typ==){//pre and bac and me
ll tmp=clac((*it).l,(*it).r);
ans^=tmp;
ri=it;
++ri;
if(ri!=s.end()){
ans^=((*ri).l)*((*ri).l)-((*it).r)*((*it).r);
}
le=it;
if(le!=s.begin()){
--le;
ans^=((*it).l)*((*it).l)-((*le).r)*((*le).r);
}
s.erase(it);
}
else if(typ==){//bac and me
ll tmp=clac((*it).l,(*it).r);
ans^=tmp;
ri=it;
++ri;
if(ri!=s.end()){
ans^=((*ri).l)*((*ri).l)-((*it).r)*((*it).r);
}
s.erase(it);
}else {//only bac
ri=it;
++ri;
if(ri!=s.end()){
ans^=((*ri).l)*((*ri).l)-((*it).r)*((*it).r);
}
}
}
void ins(int l,int r){
if(s.empty()){
ans^=clac(l,r);
s.insert(po(l,r));
}else{
it=s.lower_bound(po(l,r));
ll L=l,R=r;
//bool fl=false;
if(it!=s.begin()){
--it;
if((*it).r>=l-){
L=min(L,(*it).l);
R=max(R,(*it).r);
dele();
//fl=true;
it=s.lower_bound(po(l,r));
}else{
dele();
}
}
while(){
it=s.lower_bound(po(l,r));
if(it==s.end()) break;
if((*it).l>r) break;
R=max(R,(*it).r);
dele();
} if(it!=s.end()){
ans^=((*it).l)*((*it).l)-R*R;
}
if(it!=s.begin()){
--it;
ans^=L*L-((*it).r)*((*it).r);
}
ans^=clac(L,R);
s.insert(po(L,R));
}
}
int main(){
rd(q);
int op,l,r;
while(q--){
rd(op);
if(op==){
rd(l);rd(r);
ins(l,r);
}else{
printf("%lld\n",ans);
}
}
return ;
} }
signed main(){
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/1/16 9:17:43
*/
luoguP5105 不强制在线的动态快速排序的更多相关文章
- luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set
不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...
- 洛谷 P5105 不强制在线的动态快速排序
P5105 不强制在线的动态快速排序 题目背景 曦月最近学会了快速排序,但是她很快地想到了,如果要动态地排序,那要怎么办呢? 题目描述 为了研究这个问题,曦月提出了一个十分简单的问题 曦月希望维护一个 ...
- P5105 不强制在线的动态快速排序
P5105 不强制在线的动态快速排序 $\bigoplus \limits_{i=2}^n (a_i^2-a_{i-1}^2) = \bigoplus \limits_{i=2}^n (a_i-a_{ ...
- [Luogu5105]不强制在线的动态快速排序
首先集合去重不影响答案,然后打表易得连续自然数平方差异或前缀和的规律,于是问题就变为在线维护区间求并同时更新答案,set记录所有区间,每次暴力插入删除即可.由于每个区间至多只会插入删除一次,故均摊复杂 ...
- [洛谷P5105]不强制在线的动态快速排序
题目大意:有一个可重集$S$,有两个操作: $1\;l\;r:$表示把$S$变为$S\cup[l,r]$ $2:$表示将$S$从小到大排序,记为$a_1,a_2,\dots,a_n$,然后求出$\bi ...
- luogu P5105 不强制在线的动态快速排序
前言 考试的时候居然想错了区间贡献,mdzz 思路 题目看着很方啊,难道要树套树? 但数据范围提醒我们,是nlogn的复杂度 Sort(S)的定义是不是很鬼畜 但我们不动脑子的打表容易发现 连续区间[ ...
- [EOJ439] 强制在线
Description 见EOJ439 Solution 先考虑不强制在线怎么做. 按询问区间右端点排序,从左往右扫,维护所有后缀的答案. 如果扫到 \(a[i]\),那么让统计个数的 \(cnt[a ...
- hihocoder #1236 Scores (15北京赛区网络赛J) (五维偏序,强制在线,bitset+分块)
链接:http://hihocoder.com/problemset/problem/1236 思路; 有n个五维的向量,给出q个询问,每个询问是一个五维向量,问有多少个向量没有一维比这个向量大.并且 ...
- [BZOJ 3720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树
jzyzoj的p2016 先码着,强制在线的树分块或者树套树?关键是我树分块还在入门阶段树套树完全不会啊摔 http://blog.csdn.net/jiangyuze831/article/de ...
随机推荐
- Python接口测试实战4(上) - 接口测试框架实战
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- C#入门经典第十章例题 - - 卡牌
1.库 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
- Ubuntu常用shell命令
目录 ls cd mkdir mv cp scp rm df du chmod chown chgrp head tail screen apt-get Ubuntu常用shell命令 Ubuntu作 ...
- Linux内核学习笔记(1)-- 进程管理概述
一.进程与线程 进程是处于执行期的程序,但是并不仅仅局限于一段可执行程序代码.通常,进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个 ...
- AngularJS学习之数据绑定
既然AngularJS是以数据作为驱动的MVC框架,在上一篇文章中,也介绍了AngularJS如何实现MVC模式的,所有模型里面的数据,都必须经过控制器,才能展示到视图中. 什么是数据绑定 首先来回忆 ...
- 【每日scrum】NO.9
(1)这是我们冲刺的最后一天,晚上我们的团队进行了收尾工作:第一阶段的任务基本完成,软件主要实现了校园景点照片以及对应的介绍,查询最短路径,查询涉及相关景点的查询,查询全部路径,基本界面的设计,导航功 ...
- debian 安装kde
今天用最小安装安装了一台debian虚拟机,想要安装kde桌面,总是安装不上,使用语句 apt-get install kde apt-get install kde4 都试了,不行.最终查看debi ...
- C语言文法翻译
<程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...
- CCF——数列分段201509-1
问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式 输入的第一行包含一个整数n,表示数列中整数的个数. 第二行包含n个整数a1, a2, …, an,表示 ...
- oracle impdp导入时 提示“ORA-39002: 操作无效 ORA-39070: 无法打开日志文件 ”
第一步:首先使用DBA权限的用户创建directory,我使用system ,可以在服务器本地创建,也可以远程连接sqlplus进行创建,使用的将是服务器上面的路径.要确保创建directory时,操 ...