【洛谷】P4883 mzf的考验

最近忽然放弃治疗开始随机跳题了

感觉还行

就是必须吸氧感觉有点糟糕。。。

这题翻转和求和都是平衡树基本操作,那个异或可以通过维护树中\(2\)进制下第\(2^{i}\)位的\(1\)的个数,即可\(O(\log d)\)快速维护

当敲板子玩了

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
mt19937 rnd(20020328);
struct node {
int pri;
int lc,rc,siz;
int cnt[20],d;
int64 sum,val;
bool rev;
}tr[MAXN];
int N,M,rt;
int a[MAXN];
#define lc(u) tr[u].lc
#define rc(u) tr[u].rc
#define sum(u) tr[u].sum
void update(int u) {
for(int j = 0 ; j < 20 ; ++j) {
tr[u].cnt[j] = ((tr[u].val >> j) & 1) + tr[lc(u)].cnt[j] + tr[rc(u)].cnt[j];
}
tr[u].sum = tr[u].val + tr[lc(u)].sum + tr[rc(u)].sum;
tr[u].siz = 1 + tr[lc(u)].siz + tr[rc(u)].siz;
}
void xorit(int u,int d) {
tr[u].val ^= d;tr[u].d ^= d;
for(int j = 0 ; j < 20 ; ++j) {
if(d >> j & 1) {
tr[u].sum -= 1LL * tr[u].cnt[j] * (1 << j);
tr[u].sum += 1LL * (tr[u].siz - tr[u].cnt[j]) * (1 << j);
tr[u].cnt[j] = tr[u].siz - tr[u].cnt[j];
}
} }
void Rev(int u) {
tr[u].rev ^= 1;
swap(lc(u),rc(u));
}
void pushdown(int u) {
if(tr[u].d) {
if(lc(u)) xorit(lc(u),tr[u].d);
if(rc(u)) xorit(rc(u),tr[u].d);
tr[u].d = 0;
}
if(tr[u].rev) {
if(lc(u)) Rev(lc(u));
if(rc(u)) Rev(rc(u));
tr[u].rev = 0;
}
}
int Merge(int u,int v) {
if(!u) return v;
if(!v) return u;
pushdown(u);pushdown(v);
if(tr[u].pri > tr[v].pri) {
tr[u].rc = Merge(tr[u].rc,v);
update(u);
return u;
}
else {
tr[v].lc = Merge(u,tr[v].lc);
update(v);
return v;
}
}
void Split(int u,int &L,int &R,int s) {
if(u == 0) {L = R = 0;return;}
int t = tr[lc(u)].siz + 1;
pushdown(u);
if(s >= t) {
L = u;
Split(tr[u].rc,tr[L].rc,R,s - t);
update(L);
}
else {
R = u;
Split(tr[u].lc,L,tr[R].lc,s);
update(R);
}
}
void Modify(int l,int r,int d) {
int L,R,p;
Split(rt,L,R,l - 1);
Split(R,p,R,r - l + 1);
xorit(p,d);
rt = Merge(L,p);rt = Merge(rt,R);
}
void Rev_Range(int l,int r) {
int L,R,p;
Split(rt,L,R,l - 1);
Split(R,p,R,r - l + 1);
Rev(p);
rt = Merge(L,p);rt = Merge(rt,R);
}
int64 Query(int l,int r) {
int L,R,p;
Split(rt,L,R,l - 1);
Split(R,p,R,r - l + 1);
int64 res = tr[p].sum;
rt = Merge(L,p);rt = Merge(rt,R);
return res;
} void Solve() {
read(N);read(M);
for(int i = 1 ; i <= N ; ++i) {
read(a[i]);
tr[i].pri = rnd();tr[i].sum = a[i];tr[i].val = a[i];
for(int j = 0 ; j < 20 ; ++j) {
tr[i].cnt[j] = (a[i] >> j) & 1;
}
tr[i].siz = 1;
rt = Merge(rt,i);
}
int opt,l,r,d;
for(int i = 1 ; i <= M ; ++i) {
read(opt);read(l);read(r);
if(opt == 1) Rev_Range(l,r);
else if(opt == 2) {read(d);Modify(l,r,d);}
else {out(Query(l,r));enter;}
}
}
int main(){
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif Solve();
}

【洛谷】P4883 mzf的考验的更多相关文章

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

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

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

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

  3. 洛谷 P4240 - 毒瘤之神的考验(数论+复杂度平衡)

    洛谷题面传送门 先扯些别的. 2021 年 7 月的某一天,我和 ycx 对话: tzc:你做过哪些名字里带"毒瘤"的题目,我做过一道名副其实的毒瘤题就叫毒瘤,是个虚树+dp yc ...

  4. 洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】

    题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij} ...

  5. 烦神的斐波那契&&洛谷-1306-斐波那契公约数

    传送门 洛谷1306传送门 -------------------------------------------------------------------------------------- ...

  6. 洛谷P5274 优化题(ccj)

    洛谷P5274 优化题(ccj) 题目背景 CCJCCJ 在前往参加 Universe \ OIUniverse OI 的途中... 题目描述 有一个神犇 CCJCCJ,他在前往参加 Universe ...

  7. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  8. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  9. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

随机推荐

  1. 在Android中使用OpenGL ES开发第(四)节:相机预览

    笔者之前写了三篇Android中使用OpenGL ES入门级的文章,从OpenGL ES的相关概念出发,分析了利用OpenGL ES实现3D绘图的重要的两个步骤:定义形状和绘制形状,简单的绘制了一个三 ...

  2. windows游戏编程X86 (内存)寄存器相关的基本概念

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22446971 作者:jadeshu   邮箱: jades ...

  3. ubuntu 14.04 安装ntp

    安装 sudo apt-get install ntp 修改ntp.conf配置文件 sudo vi /etc/ntp.conf 修改为如下内容 # Enable this if you want s ...

  4. 七、find 文件查找

    在文件系统上查找符合条件的文件 locate :依赖于事先构建的索引,索引的构建是在系统较为空闲时自动进行(周期性任务) 手动更新数据库(updatedb) 非实时查找 模糊查找 索引构建过程需要遍历 ...

  5. ios编译库文件时出现的问题

    1. 警告:directory not found for option "xxxxxxxx" 文件路径未找到 选择工程, 编译的 (targets) 选择 Build Setti ...

  6. 绕过本机DNS缓存

    --转载注明来源 http://www.cnblogs.com/sysnap/ 0x1 背景 往HOST文件添加127.0.0.1  www.baidu.com, 可以劫持百度的域名.病毒经常篡改HO ...

  7. 笔记四(Competitor Analysis Test小结)

    1.关机后启动电脑,测试BIOS的POST time 2.进入睡眠模式后,按任意键,通过Windows logs查看bios的init时间 3.进入BIOS setup的快捷键,一般为F2 4.进入B ...

  8. spaCy 第二篇:语言模型

    spaCy处理文本的过程是模块化的,当调用nlp处理文本时,spaCy首先将文本标记化以生成Doc对象,然后,依次在几个不同的组件中处理Doc,这也称为处理管道.语言模型默认的处理管道依次是:tagg ...

  9. UML期末复习题——2.3:UML State Diagram

    第三题  状态图 重要概念: 1.定义:事件.状态和转换: 事件:指一件值得注意的事情的发生. 状态:指对象在事件发生之间某时刻所处的情形. 转换:两个状态之间的关系.它表明当某事件发生时,对象从先前 ...

  10. <JavaScript>可枚举属性与不可枚举属性

    在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的.可枚举性决定了这个属性能否被for…in查找遍历到. 一.怎么判断属性是否可枚举 js中基本包 ...