[Luogu5105]不强制在线的动态快速排序
首先集合去重不影响答案,然后打表易得连续自然数平方差异或前缀和的规律,于是问题就变为在线维护区间求并同时更新答案,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]不强制在线的动态快速排序相关推荐
- [EOJ439] 强制在线
Description 见EOJ439 Solution 先考虑不强制在线怎么做. 按询问区间右端点排序,从左往右扫,维护所有后缀的答案. 如果扫到 \(a[i]\),那么让统计个数的 \(cnt[a ...
- 在线Java 动态运行Java源代码-执行器
当我们通过类加载器获得Class后,就可以通过常用反射手段,调用类方法了. 反射调用方法的要素:Class类,方法名,方法参数,方法返回值. Class类:已经通过前面的类加载器获取到了: 方法名:需 ...
- 强制在线带修区间LCM(线段树+质因子状压)
题目链接:信息学奥赛比赛系统 | 强制在线带修区间LCM (qduoj.com) 先说点题外话,这个题目困扰了我一天多,刚ac,真的是太爽了,感觉从这里面学到的东西挺多的,所以就来分享一下. 题目的意 ...
- 动态文字闪图怎么做?手把手教你在线做动态闪图
想要做炫酷的动态文字闪图,又不会使用专业的做图软件时,应该怎么操作呢?很简单,给大家分享一款在线gif图片制作(https://www.gif.cn/)工具-[GIF中文网],只需要打开浏览器上传jp ...
- LayUI表格在线编辑动态修改列数据
LayUI表格在线编辑动态修改列数据 每次只能修改指定属性是 edit 定义的 列 {field:'aname', width:80, title: '昵称', minWidth: 100, edit ...
- 在线Java 动态运行Java源代码-处理器
处理器主要的作用是串起编译器.类加载器.执行器,对外提供统一的方法调用实现动态运行Java源代码的整个流程,以及暂存或缓存已编译加载好的Class类优化整个流程执行效率. 因字节码对边界系统来说用处不 ...
- 在线生成彩字在线制作动态特效文字的2个网站
1 Textanim - 是一个在线生成动态文字效果的站点,操作简单, 输入想要生成的英文字母或单词,选择字体和彩字样式,就能可以轻松生成. 提供了上百种的花纹可以选择使用. 提供设置项包括: 1.字 ...
- 在线Java 动态运行Java源代码
在线执行动态的Java代码,或者运行时动态编译加载java源码实现例如动态策略.动态配置等业务.我们大致就需要有以下流程: #mermaid-svg-aIJVYE5t6EFpeK0L {font-fa ...
- 在线Java 动态运行Java源代码-编译器
1.获取JDK编译器主要有两种方式(当然大神也可以有三种,自己写编译器): 如果运行的环境System.getProperty("java.home")中配置了JDK,则直接通过T ...
最新文章
- php 简单的解密和加密
- 【Linux】一步一步学Linux——unzip命令(68)
- 在Swing和Swt中使用JavaFX
- activiti自定义_在Activiti中执行自定义查询
- C/C++中“空语句”的说明
- centos7 通过kvm+vnc 实现远程桌面虚拟化和创建windows、Linux虚拟机
- 云小课 |选定合适的证书,做“有证”的合规域名
- 大数据学习总结(5)参考elk技术架构
- mysql 允许主码重复_数据库主码可以重复吗
- Kali基于字典的无线破解
- 从苏宁电器到卡巴斯基(第二部)第06篇:我在卡巴的日子 VI
- SparkSteaming运行流程分析以及CheckPoint操作
- Android之登录注册——简易版
- CLion Executable和Library区别
- win7无线网显示小太阳
- 1分钟读懂猫咪免疫流程:怎么打疫苗,必须打的疫苗有哪些
- 批量升级320k百度音乐(java版本)
- String存放在堆中还是栈中?5年的Java照样说不清楚!
- echarts.js 下载
- 《C语言动漫教程(中级)》