题目描述:

luogu

题解:

当然splay。

区间翻转是基本操作。

区间异或?按套路记录区间内每一位$1$的个数,异或的时候按位取反即可。

区间查询同理。

因为要按位维护,所以复杂度多了个log。

不开O2只有30,开O2能过。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 100050;
template<typename T>
inline void read(T&x)
{
T f = 1,c = 0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
x = f*c;
}
int n,m,a[N];
struct Splay
{
int fa[N],ch[N][2],v[N],siz[N],tag[N],mp[N][22],rt;
bool res[N];
inline void rever(int u){swap(ch[u][0],ch[u][1]);res[u]^=1;}
inline void add(int u,int k)
{
if(!u)return ;
tag[u]^=k;v[u]^=k;
for(int i=0;i<20;i++)if(k&(1<<i))
mp[u][i]=siz[u]-mp[u][i];
}
inline void update(int u)
{
siz[u] = siz[ch[u][0]]+siz[ch[u][1]]+1;
for(int i=0;i<20;i++)
mp[u][i]=mp[ch[u][0]][i]+mp[ch[u][1]][i]+((v[u]>>i)&1);
}
inline void pushdown(int u)
{
if(tag[u])
{
add(ch[u][0],tag[u]);
add(ch[u][1],tag[u]);
tag[u]=0;
}
if(res[u])
{
rever(ch[u][0]);
rever(ch[u][1]);
res[u]=0;
}
}
void rotate(int x)
{
int y = fa[x],z = fa[y],k = (ch[y][1]==x);
ch[z][ch[z][1]==y] = x,fa[x] = z;
ch[y][k] = ch[x][!k],fa[ch[x][!k]] = y;
ch[x][!k] = y,fa[y] = x;
update(y),update(x);
}
void down(int x)
{
if(fa[x])down(fa[x]);
pushdown(x);
}
void splay(int x,int goal)
{
down(x);
while(fa[x]!=goal)
{
int y = fa[x],z = fa[y];
if(z!=goal)
(ch[y][1]==x)^(ch[z][1]==y)?rotate(x):rotate(y);
rotate(x);
}
if(!goal)rt = x;
}
int build(int l,int r,int f)
{
if(l>r)return 0;
int mid = (l+r)>>1;
ch[mid][0] = build(l,mid-1,mid);
ch[mid][1] = build(mid+1,r,mid);
fa[mid] = f,v[mid] = a[mid-1];
update(mid);
return mid;
}
int get_kth(int u,int k)
{
pushdown(u);
int tmp = siz[ch[u][0]];
if(k<=tmp)return get_kth(ch[u][0],k);
else if(k==tmp+1)return u;
else return get_kth(ch[u][1],k-1-tmp);
}
void rvs(int l,int r)
{
int lp = get_kth(rt,l),rp = get_kth(rt,r+2);
splay(lp,0),splay(rp,lp);
rever(ch[rp][0]);
}
void ins(int l,int r,int d)
{
int lp = get_kth(rt,l),rp = get_kth(rt,r+2);
splay(lp,0),splay(rp,lp);
add(ch[rp][0],d);
}
ll query(int l,int r)
{
int lp = get_kth(rt,l),rp = get_kth(rt,r+2);
splay(lp,0),splay(rp,lp);
ll ret = 0;
for(int i=0;i<20;i++)
ret+=(1ll<<i)*mp[ch[rp][0]][i];
return ret;
}
}tr;
int main()
{
read(n),read(m);
for(int i=1;i<=n;i++)read(a[i]);
tr.rt=tr.build(1,n+2,0);
for(int op,l,r,d,i=1;i<=m;i++)
{
read(op),read(l),read(r);
if(op==1)tr.rvs(l,r);
else if(op==2){read(d);tr.ins(l,r,d);}
else printf("%lld\n",tr.query(l,r));
}
return 0;
}

luogu4883 mzf的考验的更多相关文章

  1. 洛谷 P4883 mzf的考验 解题报告

    P4883 mzf的考验 题目背景 \(mzf\)立志要成为一个豪杰,当然,他也是一个\(OIer\). 他希望自己除了会\(OI\)之外还会各种东西,比如心理学.吉他.把妹等等. 为了让自己有更大的 ...

  2. 【洛谷】P4883 mzf的考验

    [洛谷]P4883 mzf的考验 最近忽然放弃治疗开始随机跳题了 感觉还行 就是必须吸氧感觉有点糟糕... 这题翻转和求和都是平衡树基本操作,那个异或可以通过维护树中\(2\)进制下第\(2^{i}\ ...

  3. P4883 mzf的考验[平衡树]

    P4883 mzf的考验 维护一种数据结构 支持区间翻转 区间异或 区间求和- 显然 fhq treap 区间异或显然是拆位 ~~然后复杂度*20~~ 第一次先遍历一下整棵树 pushup 一下 就可 ...

  4. 洛谷【P4883】mzf的考验

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

  5. mzf的考验

    题解: 比较水吧 显然是平衡树的操作 然后就是写写写 用对拍来查错相比之下直接样例查还是比较容易的 刚开始没有优化常数没开O2就变成暴力分了smg 开了O2就a了 代码: #include <b ...

  6. USB Type-C 应用面临安全性考验,USB-IF 将推动新认证机制

    USB 应用已经达到空前盛况,横跨电脑.移动设备.周边设备.影音器材等范畴,是一个极为普遍常见的界面.进入 USB Type-C 世代由于一并推动 USB-PD,过去没有严格执行的认证要求,基于安全性 ...

  7. 如果不能显示真正的考验个别车型toast问题解决

    当真正的考验个别车型toast不显示信息,找到两个解决方式.不知还有什么其他有效方法.期待大神们的分享!.! 1.手动方案:设置-->应用软件管理-->相应APP-->勾选显示通知框 ...

  8. BZOJ:4333: JSOI2012 智者的考验

    4333: JSOI2012 智者的考验 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 68  Solved: 18[Submit][Status][ ...

  9. 每个努力奋斗过的人,被不公正的际遇砸了满头包的时候,都有那么一瞬间的代入感。出生就是hard模式的人,早已经历了太多的劳其筋骨饿其体肤,再多的人为考验只会摧毁人对美好的向往。

    每个努力奋斗过的人,被不公正的际遇砸了满头包的时候,都有那么一瞬间的代入感.出生就是hard模式的人,早已经历了太多的劳其筋骨饿其体肤,再多的人为考验只会摧毁人对美好的向往.

随机推荐

  1. 协程 & IO模型 & HTTP协议

    今日内容 进程池与线程池的基本使用 协程理论与实操 IO模型 前端简介 内容详细 一.进程池与线程池的基本使用 1.进程池与线程池的作用 为了保证计算机硬件安全的前提下,提升程序的运行效率 2.回调机 ...

  2. rust连接oracle数据库遇到DPI-1047: Cannot locate a 64-bit Oracle Client library的解决方案

    这两天要实现一个用rust连接远程的oracle数据库的需求,所以就需要用rust连接oracle. 在github上面找到一个库,地址:https://github.com/kubo/rust-or ...

  3. 前端提交数据到node的N种方式

    写在前面 本篇介绍了前端提交数据给node的几种处理方式,从最基本的get和post请求,到图片上传,再到分块上传,由浅入深. GET请求 经典的get提交数据,参数通过URL传递给node,node ...

  4. Spring Cloud Feign 如何使用对象参数

    概述 Spring Cloud Feign 用于微服务的封装,通过接口代理的实现方式让微服务调用变得简单,让微服务的使用上如同本地服务.但是它在传参方面不是很完美.在使用 Feign 代理 GET 请 ...

  5. swagger 2.0

    1.引入jar包 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox- ...

  6. Wireshark教程之过滤器设置

    实验目的 1.工具介绍 2.主要应用 实验原理 1.网络管理员用来解决网络问题 2.网络安全工程师用来检测安全隐患 3.开发人员用来测试执行情况 4.学习网络协议 实验内容 1.抓取特定数据流 2.显 ...

  7. [Java]Thinking in Java 练习2.10

    题目 编写一个程序,打印出从命令行获得的三个参数.为此,需要确定命令行数组中String的下标. 代码 1 public class Ex2_10 { 2 public static void mai ...

  8. 推荐一款好用的国产web报表软件,轻松搞定复杂报表

    随着经济全球化程度的逐步加深以及全球市场的加速整合以便最大程度地对企业资源进行整合,从而达到降低成本和提高效率的目的.Web报表由于借助于web平台,即运用了B/S模式,即"浏览器/服务器& ...

  9. 一图胜千言,想让数据产生影响力,必须拥有好上手的BI数据分析工具

    当杂乱无章的数据,经过数据清洗后,得到了想用的数据,但是查看这些数据通过数据库只能看到数据本身,无法看到其中的规律,可以通过BI数据分析工具,图形化展示数据,使数据更形象化的展现在用户面前,更容易看出 ...

  10. Hadoop - HDFS学习笔记(详细)

    第1章 HDFS概述 hdfs背景意义 hdfs是一个分布式文件系统 使用场景:适合一次写入,多次读出的场景,且不支持文件的修改. 优缺点 高容错性,适合处理大数据(数据PB级别,百万规模文件),可部 ...