首先我们考虑,对于And 和 Or 操作,对于操作位上只有And 0 和 Or 1 是有效果的。

我们注意到如果区间内需要改动的操作位上的数字都相同,那么是可以区间取与以及区间取或的。

那其实可以维护出这个区间的$区间与x和区间或y$

我们考虑 $某一位上 x\;  xor \; y == 1 时$

必定是$x 那一位上 是0 \; y 那一位上是1$

因为显然 $如果x那一位上是1,那么y那一位上必然是1, y那一位上是0, x 那一位上必然是0$

那我们再考虑区间与的操作,我们令 $S = (1 << 31) - 1, 令val 表示需要与的数$

当 $(x \; xor \; y) \; and \; (S - val) == 0 的时候$

这个时候可以理解为在不需要与0的位置上,这个区间内都是1或者都是0,即这些不相关位对我们的区间取与操作不会有影响。

再考虑如何标记$lazy, 对And 和 Or 分别设置一个lazyA 和 lazyO $

$我们注意到,要取与的时候,把lazyA 一并与上, 并且把lazyO也要与上$

取或的时候只给$lazyO$取或就可以。

区间取或的操作分析同理。

再简陋的证明一下复杂度:

假设我们考虑要处理的一段区间不能进行区间处理,需要一位一位处理,但是我们这次处理之后这一段区间就可以区间处理了

再考虑,对于一段已经完好的区间,我们对它区间处理,它就会分成三段,但实际上这次的处理是$log的$

再考虑下一次处理,实际上两头又是好的,感觉又是$log$..

好吧 不口胡了,还是放官方的复杂度证明吧。。

https://csacademy.com/contest/round-70/task/and-or-max/solution

 #include <bits/stdc++.h>
using namespace std; #define N 200010
int n, q, arr[N], S = ( << ) - ; struct SEG
{
struct node
{
int Max, A, O, lazyA, lazyO;
node() {}
node(int x)
{
Max = A = O = x;
lazyA = S;
lazyO = ;
}
node operator + (const node &r) const
{
node res = node();
res.Max = max(Max, r.Max);
res.A = A & r.A;
res.O = O | r.O;
return res;
}
void add(int And, int Or)
{
Max = Max & And | Or;
A = A & And | Or;
O = O & And | Or;
lazyA = lazyA & And;
lazyO = lazyO & And | Or;
}
}a[N << ];
void build(int id, int l, int r)
{
if (l == r)
{
a[id] = node(arr[l]);
return;
}
int mid = (l + r) >> ;
build(id << , l, mid);
build(id << | , mid + , r);
a[id] = a[id << ] + a[id << | ];
}
void pushdown(int id)
{
if (a[id].lazyA != S || a[id].lazyO)
{
a[id << ].add(a[id].lazyA, a[id].lazyO);
a[id << | ].add(a[id].lazyA, a[id].lazyO);
a[id].lazyA = S;
a[id].lazyO = ;
}
}
void updateA(int id, int l, int r, int ql, int qr, int val)
{
if (l >= ql && r <= qr && !((a[id].A ^ a[id].O) & (S ^ val)))
{
a[id].add(val, );
return;
}
pushdown(id);
int mid = (l + r) >> ;
if (ql <= mid) updateA(id << , l, mid, ql, qr, val);
if (qr > mid) updateA(id << | , mid + , r, ql, qr, val);
a[id] = a[id << ] + a[id << | ];
}
void updateO(int id, int l, int r, int ql, int qr, int val)
{
if (l >= ql && r <= qr && !((a[id].A ^ a[id].O) & val))
{
a[id].add(S, val);
return;
}
pushdown(id);
int mid = (l + r) >> ;
if (ql <= mid) updateO(id << , l, mid, ql, qr, val);
if (qr > mid) updateO(id << | , mid + , r, ql, qr, val);
a[id] = a[id << ] + a[id << | ];
}
int query(int id, int l, int r, int ql, int qr)
{
if (l >= ql && r <= qr) return a[id].Max;
pushdown(id);
int mid = (l + r) >> ;
int res = ;
if (ql <= mid) res = max(res, query(id << , l, mid, ql, qr));
if (qr > mid) res = max(res, query(id << | , mid + , r, ql, qr));
a[id] = a[id << ] + a[id << | ];
return res;
}
}seg; void Run()
{
while (scanf("%d%d", &n, &q) != EOF)
{
for (int i = ; i <= n; ++i) scanf("%d", arr + i);
seg.build(, , n);
for (int qq = , op, l, r, x; qq <= q; ++qq)
{
scanf("%d%d%d", &op, &l, &r);
if (op == ) printf("%d\n", seg.query(, , n, l, r));
else
{
scanf("%d", &x);
if (op == ) seg.updateA(, , n, l, r, x);
else seg.updateO(, , n, l, r, x);
}
}
}
} int main()
{
#ifdef LOCAL
freopen("Test.in", "r", stdin);
#endif Run();
return ;
}

BZOJ 5312: 冒险的更多相关文章

  1. 【刷题】BZOJ 5312 冒险

    Description Kaiser终于成为冒险协会的一员,这次冒险协会派他去冒险,他来到一处古墓,却被大门上的守护神挡住了去路,守护神给出了一个问题, 只有答对了问题才能进入,守护神给出了一个自然数 ...

  2. BZOJ.5312.冒险(线段树)

    题目链接 \(Description\) 维护一个序列,支持区间and/or一个数.区间查询最大值. \(Solution\) 维护区间最大值?好像没什么用,修改的时候和暴力差不多. 我们发现有时候区 ...

  3. bzoj 4695: 最假女选手 && Gorgeous Sequence HDU - 5306 && (bzoj5312 冒险 || 小B的序列) && bzoj4355: Play with sequence

    算导: 核算法 给每种操作一个摊还代价(是手工定义的),给数据结构中某些东西一个“信用”值(不是手动定义的,是被动产生的),摊还代价等于实际代价+信用变化量. 当实际代价小于摊还代价时,增加等于差额的 ...

  4. BZOJ5312:冒险——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5312 Kaiser终于成为冒险协会的一员,这次冒险协会派他去冒险,他来到一处古墓,却被大门上的守护 ...

  5. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  6. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  7. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  8. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  9. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

随机推荐

  1. 关于JSP生命周期的叙述,下列哪些为真?

    关于JSP生命周期的叙述,下列哪些为真? A.JSP会先解释成Servlet源文件,然后编译成Servlet类文件 B.每当用户端运行JSP时,jspInit()方法都会运行一次 C.每当用户端运行J ...

  2. 在项目中用过Spring的哪些方面?及用过哪些Ajax框架?

    在项目中用过Spring的哪些方面?及用过哪些Ajax框架? 解答:在项目使用过Spring IOC ,AOP,DAO,ORM,还有上下文环境. 在项目使用过Ext,Juery等Ajax框架.

  3. windows下解决mysql忘记password

    windows下解决mysql忘记password   mysql有时候忘记password了怎么办?我给出案例和说明!一下就攻克了!    Windows下的实际操作例如以下    1.关闭正在执行 ...

  4. phpQuery对数据信息的采集进一步学习

    前提:需要下载:phpQuery/phpQuery.php 链接:http://www.cnblogs.com/wuheng1991/p/5145398.html 1.对于规则的部分 <?php ...

  5. 【R】自定义描述统计函数-从均值到峰度偏度

    data_show<-function(x) { n<-length(x) m<-mean(x) v<-var(x) s<-sd(x) me<-median(x) ...

  6. Laravel5.1 搭建博客 --展示简单的首页

    今天起开始搭建博客,把之前学的东西运用下. 1 创建 配置项目 1.1 创建项目 composer create-project laravel/laravel blog 5.1.1 1.2 配置数据 ...

  7. Echoprint系列--编译

    近期要做一个音乐相关的client.当中一个功能是音乐识别.搜索了一些资料选择Echoprint来开发.Echoprint是开源免费的,并且多种client都支持能节约非常多时间,今天主要下载和编译源 ...

  8. CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题

    项目开发过程中,发现CKEDITOR 插件的弹出框 内 如果跟据项目需要写表格(table tr td),表格的边框等属性会被 CKEDITOR的清除或覆盖,导致表格很难看. 问题关键: 插件弹出框d ...

  9. css3的3d属性集合

    css3的3d属性集合 想进入css3的3d世界必须知道一下几个属性及其用法. 当然在进入属性介绍之前我想你必须知道3维坐标,附上一张经典图如下: 我想不用解释了吧.之后要平移和旋转都是在这个基础之上 ...

  10. 查看python对象的属性

    在Python语言中,有些库在使用时,在网络上找到的文档不全,这就需要查看相应的Python对象是否包含需要的函数或常量.下面介绍一下,如何查看Python对象中包含哪些属性,如成员函数.变量等,其中 ...