题解:

比较水吧

显然是平衡树的操作

然后就是写写写

用对拍来查错相比之下直接样例查还是比较容易的

刚开始没有优化常数没开O2就变成暴力分了smg 开了O2就a了

代码:

#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define ll long long
const int N=3e5;
int a[N],rt,x1,x2;
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
struct sgt{
int v[N][],data[N],lazy[N],ls[N],rs[N],count2[N],fa[N];
bool rev[N];
IL void updata(rint x)
{
count2[x]=count2[ls[x]]+count2[rs[x]]+;
rint *a=v[x],*b=v[ls[x]],*c=v[rs[x]],d=data[x];
rep(i,,) a[i]=((d>>i)&)+b[i]+c[i];
// rep(i,0,20) v[x][i]=((data[x]>>i)&1)+v[ls[x]][i]+v[rs[x]][i];
}
IL void down(rint x)
{
if (rev[x])
{
rev[ls[x]]^=; rev[rs[x]]^=;
swap(ls[x],rs[x]);
rev[x]=;
}
if (lazy[x])
{
if (ls[x])
{
lazy[ls[x]]^=lazy[x]; data[ls[x]]^=lazy[x];
dep(i,,)
if ((lazy[x]>>i)&) v[ls[x]][i]=count2[ls[x]]-v[ls[x]][i];
}
if (rs[x])
{
lazy[rs[x]]^=lazy[x]; data[rs[x]]^=lazy[x];
dep(i,,)
if ((lazy[x]>>i)&) v[rs[x]][i]=count2[rs[x]]-v[rs[x]][i];
}
lazy[x]=;
}
}
void rotate(rint x,rint y)
{
rint f1=fa[x];
if (y==)
{
rs[f1]=ls[x];
if (ls[x]) fa[ls[x]]=f1;
} else
{
ls[f1]=rs[x];
if (rs[x]) fa[rs[x]]=f1;
}
fa[x]=fa[f1];
if (fa[f1])
if (ls[fa[f1]]==f1) ls[fa[f1]]=x;
else rs[fa[f1]]=x;
fa[f1]=x;
if (y==) ls[x]=f1; else rs[x]=f1;
updata(f1); updata(x);
}
void dfs(int x)
{
if (fa[x]) dfs(fa[x]);
down(x);
}
void splay(rint x,rint y)
{
dfs(x);
rint f1=fa[x];
while (f1!=y)
{
if (fa[f1]==y)
if (ls[f1]==x) rotate(x,); else rotate(x,);
else
if (ls[fa[f1]]==f1)
if (ls[f1]==x) rotate(f1,),rotate(x,);
else rotate(x,),rotate(x,);
else if (rs[f1]==x) rotate(f1,),rotate(x,);
else rotate(x,),rotate(x,);
f1=fa[x];
}
if (!y) rt=x;
}
IL int search(rint x)
{
rint y=rt;
while (y)
{
down(y);
if (count2[ls[y]]+==x) return(y);
if (count2[ls[y]]>=x) y=ls[y];
else x-=count2[ls[y]]+,y=rs[y];
}
}
IL void split(rint x,rint y)
{
x1=search(x);
x2=search(y);
splay(x2,);
splay(x1,x2);
down(x2); down(x1); x1=rs[x1];
}
}S;
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
int n,m;
read(n); read(m);
rep(i,,n) read(a[i]);
rep(i,,n+)
{
S.rs[i]=i+,S.count2[i]=,S.fa[i+]=i,S.data[i]=a[i-];
}
S.splay(n+,);
rep(i,,m)
{
int kk,x,y,z;
read(kk); read(x); read(y);
if (kk==)
{
S.split(x,y+);
S.rev[x1]^=;
S.splay(x1,);
}
if (kk==)
{
read(z);
S.split(x,y+);
S.lazy[x1]^=z;
S.data[x1]^=z;
rep(i,,) if ((z>>i)&) S.v[x1][i]=S.count2[x1]-S.v[x1][i];
S.splay(x1,);
}
if (kk==)
{
S.split(x,y+);
ll ans=;
dep(i,,) ans+=1ll*(<<i)*S.v[x1][i];
cout<<ans<<endl;
}
}
return ;
}

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. luogu4883 mzf的考验

    题目描述: luogu 题解: 当然splay. 区间翻转是基本操作. 区间异或?按套路记录区间内每一位$1$的个数,异或的时候按位取反即可. 区间查询同理. 因为要按位维护,所以复杂度多了个log. ...

  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. 解决64bit不能连接access的问题

    原有的程序迁移至64位,结果调用数据库时出错,原因是jet驱动没有64位的,得换用64位的驱动程序:   1. 下载运行 AccessDatabaseEngine_x64.exe (http://ww ...

  2. strstr()函数的使用

    strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL. 实例: /** *Descriptio ...

  3. K-query SPOJ - KQUERY 离线 线段树/树状数组 区间大于K的个数

    题意: 给一个数列,一些询问,问你区间$[l.r]$大于$K$的个数 题解: 又一个"人尽皆知傻逼题"? 我们用一个01序列表示当前询问时,该位置的数字是否对答案有贡献, 显然,对 ...

  4. Alpha 冲刺 (3/10)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺3 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 组织第一次团队编程 继续阅读小程序开发文档 接下来的 ...

  5. 子元素position:absolute定位之后脱离文档流,怎么使子元素撑开父元素

    纯粹的CSS无法实现.因为position:absolute就是脱离文档流,怎么能让父元素不塌陷呢? 目前想到的只能用js和jquery来实现了,用js获取子元素的高度,赋值给父元素. <!DO ...

  6. E: The package code needs to be reinstalled, but I can't find an archive for it.

    ubuntu安装软件时报错: E: The package code needs to be reinstalled, but I can't find an archive for it. 解决方法 ...

  7. python学习第1天

    01 cpu 内存 硬盘 操作系统 CPU:中央处理器,相当于人大脑. 飞机 内存:临时存储数据. 8g,16g, 高铁 1,成本高. 2,断电即消失. 硬盘:长期存储大量的数据. 1T 512G等等 ...

  8. Laravel 5.2--改变数据库字段值,编辑时候,默认选中

    模型 <?php namespace App\Models; use App\Helpers\ImageHelper; use App\Libraries\Nestedset\NodeTrait ...

  9. 调整linux进程优先级

    使用环境 当服务器资源比较紧张的时候,可以通过调整优先级来优先处理某个进程的请求 查看进行优先级(top) 优先级由 -20~19这个范围来表示优先级大小,数值越小,优先级越高, 设置方法: 使用re ...

  10. 如何去掉li标签的重叠边框

    当我们的li标签设置了border的时候就会出现重叠边框,如何去掉呢,见代码 html代码 <ul class="friendLink_list"> <li> ...