BZOJ 5312: 冒险
首先我们考虑,对于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: 冒险的更多相关文章
- 【刷题】BZOJ 5312 冒险
Description Kaiser终于成为冒险协会的一员,这次冒险协会派他去冒险,他来到一处古墓,却被大门上的守护神挡住了去路,守护神给出了一个问题, 只有答对了问题才能进入,守护神给出了一个自然数 ...
- BZOJ.5312.冒险(线段树)
题目链接 \(Description\) 维护一个序列,支持区间and/or一个数.区间查询最大值. \(Solution\) 维护区间最大值?好像没什么用,修改的时候和暴力差不多. 我们发现有时候区 ...
- bzoj 4695: 最假女选手 && Gorgeous Sequence HDU - 5306 && (bzoj5312 冒险 || 小B的序列) && bzoj4355: Play with sequence
算导: 核算法 给每种操作一个摊还代价(是手工定义的),给数据结构中某些东西一个“信用”值(不是手动定义的,是被动产生的),摊还代价等于实际代价+信用变化量. 当实际代价小于摊还代价时,增加等于差额的 ...
- BZOJ5312:冒险——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5312 Kaiser终于成为冒险协会的一员,这次冒险协会派他去冒险,他来到一处古墓,却被大门上的守护 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
随机推荐
- Swift-9-类和结构体
// Playground - noun: a place where people can play import UIKit // 几个重要的概念Properties/Methods/Subscr ...
- MySQL Migration Toolkit启动报jre错误
正常启动的话,会报出“an error occurred during the initialization of the runtime system.Please make sure you ha ...
- 描述J2EE框架的多层结构,并简要说明各层的作用。
描述J2EE框架的多层结构,并简要说明各层的作用. 解答: 1) Presentation layer(表示层) a. 表示逻辑(生成界面代码) b. 接收请求 c. 处理业务层抛出的异常 d. 负责 ...
- 框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口
框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口. 与Frame不同,Applet是在网页中显示的,也可以通过添加Panel进行组件布局. package TomAwt; im ...
- MongoDB中关于查询条件中包括集合中字段的查询
要查询的数据结构例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FvMzY5NTE=/font/5a6L5L2T/fontsize/400/f ...
- 【Raspberry Pi】定时运行python程序读温湿度传感器数据&发邮件
1.定时执行脚本 http://tech.it168.com/a2011/0707/1214/000001214830_all.shtml /sbin/service crond start //启动 ...
- 你不知道的Console命令
一.显示信息的命令 1: <!DOCTYPE html> 2: <html> 3: <head> 4: <title>常用console命令</t ...
- DataContract 和 DataMember
数据契约(DataContract) 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被 ...
- Android 电源管理 -- wakelock机制
转载地址:http://blog.csdn.net/wh_19910525/article/details/8287202 Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, ...
- CGContextRef用法
本文转载至 http://blog.csdn.net/perfect_promise/article/details/7660220 quartz 是主要的描画接口,支持基于路径的描画. 抗锯齿渲染. ...