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

 1 #include<set>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
 5 typedef long long ll;
 6 using namespace std;
 7
 8 const int N=300010;
 9 int Q,op,l,r;
10 ll ans;
11 struct P{ int l,r; };
12 bool operator <(const P &a,const P &b){ return a.l<b.l; }
13 set<P>S;
14
15 ll D(int n){
16     n=(n+1)/2;
17     if (n%4==1) return 2*n-1;
18     if (n%4==2) return 2;
19     if (n%4==3) return 2*n+1;
20     return 0;
21 }
22
23 ll calc(int l,int r){ if (l==r) return 0; else return D(r*2-1)^D(l*2-1); }
24
25 ll get(set<P>::iterator it){
26     int l=it->l,r=it->r,u=-1,v=-1; ll res=calc(l,r);
27     it++; if (it!=S.end()) res^=1ll*((it->l)+r)*((it->l)-r),u=it->l;
28     it--; if (it!=S.begin()) it--,res^=1ll*(l+(it->r))*(l-(it->r)),v=it->r;
29     if (~u && ~v) res^=1ll*(u+v)*(u-v);
30     return res;
31 }
32
33 void work(int l,int r){
34     if (S.empty()) { ans=calc(l,r); S.insert((P){l,r}); return; }
35     set<P>::iterator it=S.lower_bound((P){l,r});
36     while (it!=S.end() && it->l<=r)
37         l=min(l,it->l),r=max(r,it->r),ans^=get(it),S.erase(it),it=S.lower_bound((P){l,r});
38     if (it!=S.begin()){
39         it--;
40         while (it->r>=l){
41             l=min(l,it->l); r=max(r,it->r); ans^=get(it); S.erase(it);
42             it=S.lower_bound((P){l,r});
43             if (it==S.begin()) break; else it--;
44         }
45     }
46     it=S.insert((P){l,r}).first; ans^=get(it);
47     //for (it=S.begin(); it!=S.end(); it++) printf("%d %d\n",it->l,it->r); puts("");
48 }
49
50 int main(){
51     for (scanf("%d",&Q); Q--; ){
52         scanf("%d",&op);
53         if (op==1) scanf("%d%d",&l,&r),work(l,r); else printf("%lld\n",ans);
54     }
55     return 0;
56 }

转载于:https://www.cnblogs.com/HocRiser/p/10225704.html

[Luogu5105]不强制在线的动态快速排序相关推荐

  1. [EOJ439] 强制在线

    Description 见EOJ439 Solution 先考虑不强制在线怎么做. 按询问区间右端点排序,从左往右扫,维护所有后缀的答案. 如果扫到 \(a[i]\),那么让统计个数的 \(cnt[a ...

  2. 在线Java 动态运行Java源代码-执行器

    当我们通过类加载器获得Class后,就可以通过常用反射手段,调用类方法了. 反射调用方法的要素:Class类,方法名,方法参数,方法返回值. Class类:已经通过前面的类加载器获取到了: 方法名:需 ...

  3. 强制在线带修区间LCM(线段树+质因子状压)

    题目链接:信息学奥赛比赛系统 | 强制在线带修区间LCM (qduoj.com) 先说点题外话,这个题目困扰了我一天多,刚ac,真的是太爽了,感觉从这里面学到的东西挺多的,所以就来分享一下. 题目的意 ...

  4. 动态文字闪图怎么做?手把手教你在线做动态闪图

    想要做炫酷的动态文字闪图,又不会使用专业的做图软件时,应该怎么操作呢?很简单,给大家分享一款在线gif图片制作(https://www.gif.cn/)工具-[GIF中文网],只需要打开浏览器上传jp ...

  5. LayUI表格在线编辑动态修改列数据

    LayUI表格在线编辑动态修改列数据 每次只能修改指定属性是 edit 定义的 列 {field:'aname', width:80, title: '昵称', minWidth: 100, edit ...

  6. 在线Java 动态运行Java源代码-处理器

    处理器主要的作用是串起编译器.类加载器.执行器,对外提供统一的方法调用实现动态运行Java源代码的整个流程,以及暂存或缓存已编译加载好的Class类优化整个流程执行效率. 因字节码对边界系统来说用处不 ...

  7. 在线生成彩字在线制作动态特效文字的2个网站

    1 Textanim - 是一个在线生成动态文字效果的站点,操作简单, 输入想要生成的英文字母或单词,选择字体和彩字样式,就能可以轻松生成. 提供了上百种的花纹可以选择使用. 提供设置项包括: 1.字 ...

  8. 在线Java 动态运行Java源代码

    在线执行动态的Java代码,或者运行时动态编译加载java源码实现例如动态策略.动态配置等业务.我们大致就需要有以下流程: #mermaid-svg-aIJVYE5t6EFpeK0L {font-fa ...

  9. 在线Java 动态运行Java源代码-编译器

    1.获取JDK编译器主要有两种方式(当然大神也可以有三种,自己写编译器): 如果运行的环境System.getProperty("java.home")中配置了JDK,则直接通过T ...

最新文章

  1. php 简单的解密和加密
  2. 【Linux】一步一步学Linux——unzip命令(68)
  3. 在Swing和Swt中使用JavaFX
  4. activiti自定义_在Activiti中执行自定义查询
  5. C/C++中“空语句”的说明
  6. centos7 通过kvm+vnc 实现远程桌面虚拟化和创建windows、Linux虚拟机
  7. 云小课 |选定合适的证书,做“有证”的合规域名
  8. 大数据学习总结(5)参考elk技术架构
  9. mysql 允许主码重复_数据库主码可以重复吗
  10. Kali基于字典的无线破解
  11. 从苏宁电器到卡巴斯基(第二部)第06篇:我在卡巴的日子 VI
  12. SparkSteaming运行流程分析以及CheckPoint操作
  13. Android之登录注册——简易版
  14. CLion Executable和Library区别
  15. win7无线网显示小太阳
  16. 1分钟读懂猫咪免疫流程:怎么打疫苗,必须打的疫苗有哪些
  17. 批量升级320k百度音乐(java版本)
  18. String存放在堆中还是栈中?5年的Java照样说不清楚!
  19. echarts.js 下载
  20. 《C语言动漫教程(中级)》

热门文章

  1. 深度优先搜索及广度优先搜索
  2. 01 Spring学习之-事件驱动eventListener
  3. 北京市交管局联合高德地图发布北京中考出行提示
  4. FTServer 0.9 发布,全文搜索服务器
  5. Pitch,Yaw,Roll的概念
  6. 前端组件化的三种方案:
  7. 使用EXE4J自动打包可运行jar文件
  8. Linux多任务编程(三)---exec函数族及其基础实验
  9. 菜鸟学Java笔记1
  10. 自己动手清除电脑中的***程序