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 ...
随机推荐
- dotnet服务器端框架从精通到弃坑
当你们看到这篇经验分享的时候,我已经把服务器端主要力量转到JAVA了. 纯当留念. 另外里面实现oauth2.0的部分就不写了,因为特殊性太强,完全根据自家需求结合它的理念改写的. 为什么我会选择sp ...
- openstack golang sdk使用
1. go get github.com/gophercloud/gophercloud import ( "github.com/gophercloud/gophercloud" ...
- Java fluent风格(转载)
转载:java Fluent风格 一.我们先写一个通常的,即不使用fluent风格 1.实体类 package com.xbq.demo.stu; /** * @ClassName: Student ...
- UUID.randomUUID()简单介绍
UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OS ...
- 《Linux内核与分析》第四周
20135130王川东 一.用户态.内核态和中断处理过程 CPU的几种不同的执行级别: 高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种执行级别对应内核态: 低级别执行状态下,代码的掌握范 ...
- c# HttpListener拒绝访问
直接记录解决步骤: 程序代码: HttpListener httpListener = new HttpListener(); httpListener.Prefixes.Add("http ...
- 2018软工实践—Alpha冲刺(4)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前后端接口的开发 测试项目运行的服务器环 ...
- 第一次c++团队合作作业期间第一篇随笔
分析了自己分到的任务,我的理解是这样的:首先要生成程序主框架,在主框架中进行地图的描绘.我应该是先进行地图的拼接,把建筑物和地面都拼接好.然后再在地图上显示出英雄和小兵.同时还要在主框架中分析了自己分 ...
- 团队Alpha冲刺(六)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- goroutine与channels
goroutine(协程) 大家都知道java中的线程Thread,golang没有提供Thread的功能,但是提供了更轻量级的goroutine(协程),协程比线程更轻,创办一个协程很简单,只需要g ...