【洛谷】P4883 mzf的考验
【洛谷】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的考验的更多相关文章
- 洛谷 P4883 mzf的考验 解题报告
P4883 mzf的考验 题目背景 \(mzf\)立志要成为一个豪杰,当然,他也是一个\(OIer\). 他希望自己除了会\(OI\)之外还会各种东西,比如心理学.吉他.把妹等等. 为了让自己有更大的 ...
- P4883 mzf的考验[平衡树]
P4883 mzf的考验 维护一种数据结构 支持区间翻转 区间异或 区间求和- 显然 fhq treap 区间异或显然是拆位 ~~然后复杂度*20~~ 第一次先遍历一下整棵树 pushup 一下 就可 ...
- 洛谷 P4240 - 毒瘤之神的考验(数论+复杂度平衡)
洛谷题面传送门 先扯些别的. 2021 年 7 月的某一天,我和 ycx 对话: tzc:你做过哪些名字里带"毒瘤"的题目,我做过一道名副其实的毒瘤题就叫毒瘤,是个虚树+dp yc ...
- 洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】
题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij} ...
- 烦神的斐波那契&&洛谷-1306-斐波那契公约数
传送门 洛谷1306传送门 -------------------------------------------------------------------------------------- ...
- 洛谷P5274 优化题(ccj)
洛谷P5274 优化题(ccj) 题目背景 CCJCCJ 在前往参加 Universe \ OIUniverse OI 的途中... 题目描述 有一个神犇 CCJCCJ,他在前往参加 Universe ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
随机推荐
- Java面向对象3(K~O)
K 正方形(SDUT 2444) import java.lang.reflect.Array; import java.util.*; public class Main { public ...
- final关键字的理解
final :最终作为一个修饰符 1.可以修饰类,函数,变量: 2.被final修饰的类不可以被继承: 3.被final修饰的方法不可以被复写: 4.被final修饰的变量是一个常量,只能赋值一次,既 ...
- Python经典练习题1:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
Python经典练习题 网上能够搜得到的答案为: for i in range(1,85): if 168 % i == 0: j = 168 / i; if i > j and (i + j) ...
- windows环境下启动mongodb服务
方法一1.打开命令窗口,切换到mongodb安装目录下的“bin”目录中. 输入命令:cd E:\software\MongoDB\Server\3.4\bin 2.启动服务.输入命令:”mongod ...
- OpenCV学习笔记(2)——如何用OpenCV处理视频
如何用OpenCV处理视频 读取视频文件,显示视频,保存视频文件 从摄像头获取并显示视频 1.用摄像头捕获视频 为了获取视频,需要创建一个VideoCapature对象.其参数可以是设备的索引号,也可 ...
- 三、Navicat将远程MySql数据库数据导入本地
1.安装本地的MySql.记住用户名和密码,这里以root,root为例. 2.打开Navicat,新建连接(连接),输入连接名,用户名,密码.确定,连接测试.这里连接名为luzhanshi.这样本地 ...
- Intent Flags
Activity都是运行在任务栈里面,但如果要从广播接受者BordercastReceiver或者服务Service去启动一个Activity,必须为当前Activity创建一个新的任务栈才能正常显示 ...
- linux挂载iscsi出现的问题
挂载的时候我们可以使用永久挂载但是这里我们就需要注意了正常的永久挂载可能会导致系统起不来因为这里我们使用的是服务端的硬盘为网络设备而开机的读取中 会先读取/etc/fstab下的内容 之后再读取网络的 ...
- windows下gitee WEBHOOK的坑...
折腾到凌晨五点,依然没有实现 windows下 分支 push之后服务器自动部署 主要是因为GIT的helper的配置上的问题.最后果断放弃了,最后祭出大招,用 WINDONS命令行自动循环..60 ...
- Spring Boot连接MySQL报错“Internal Server Error”的解决办法
报错信息如下: {timestamp: "2018-06-14T03:48:23.436+0000", status: 500, error: "Internal Ser ...