题目描述:

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. Solution -「APIO 2018」「洛谷 P4630」铁人两项

    \(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的无向图(不保证联通),求有序三元点对 \((s,c,f)\) 的个数,满足 \(s ...

  2. verification 验证环境配置传递

    验证环境配置传递 tc配置env 继承关系: tc_base->tc_base_bt->tc_xx base_env->xx_env base_env_cfg->xx_env_ ...

  3. SpringMVC--@RequestMapping注解标注方法解析

    SpringMVC--@RequestMapping注解标注方法解析 本文是基于springboot进行源码追踪分析 问题 @RequestMapping注释的类及方法,Spring是何时,何种方式解 ...

  4. mysql视图,索引

    一.视图 View 视图是一个虚拟表,是sql语句的查询结果,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成.视图的数据变化会影响到基表,基表的数据变化也会 ...

  5. Redis原理再学习04:数据结构-哈希表hash表(dict字典)

    哈希函数简介 哈希函数(hash function),又叫散列函数,哈希算法.散列函数把数据"压缩"成摘要,有的也叫"指纹",它使数据量变小且数据格式大小也固定 ...

  6. HTTP攻击与防范-PHP安全配置

    实验目的 1.了解PHP攻击带来的危险性. 2.掌握PHP攻击的原理与方法 3.掌握防范攻击的方法 实验原理 由于网站服务器是以单一系统使用者的模式在运行,因此这个系统的使用者账号必须能够读取每个使用 ...

  7. [题解]第十一届北航程序设计竞赛预赛——D.最大公约数

    题目描述 给一个长度为n(1<=n<=100000)的正整数列,分成尽量多的非空段,使得每一段的最大公约数相等.一个数的最大公约数是它本身. 解题思路 要求每一段子列的gcd相等,不妨设为 ...

  8. 命名空间 namespace

    ​ 命名空间是一块程序员可以自己命名的内存区域,用于解决同名冲突的问题. ​ 举例来说,某班及内有三个张三,分别坐在班级的第一排.第三排和最后一排.当老师喊张三时,三个张三都站起来应答,这就是同名冲突 ...

  9. 【C# 反射】使用 Activator 类 -激活器

    创建类的实例: //需要添加对Education.dll的引用才能正确执行 object CreateInstanceKind1 = Activator.CreateInstance("Ed ...

  10. 递归Recursion

    从开始自学写代码开始,就感觉递归是个特别美丽的算法. "如果使用循环,程序的性能可能更高:如果使用递归,程序可能更容易理解.如何选择要看什么对你来说更重要." 编写递归函数时,必须 ...