题意##

维护一段区间,支持求区间最大值,区间且,区间或

\(n,q<=2*10^5\)

题解##

我们用线段树维护区间最大值

对于and和or运算,

and实质就是强行把一些位改为0

or实质就是强行把一些位改为1

那么由线段树区间标记的思想,如果某个操作对整个区间的影响是相同的,并且能很快维护出当前节点信息,我们就可以通过打标记进行优化

显然,当需要操作的那些位在整个区间都是相同的,我们就可以打上一个标记

对于统计区间相同位置,有一个小技巧:

维护区间or和区间and

and中为1的位区间都为1

or中为0的位区间都为0

二者整合起来就可以得到区间相同的位置集合

复杂度##

如果区间总是不相同,复杂度会不会变差呢?

很显然,每次操作只能使所有位置相同的越来越多,而原来不同的位置经操作后一定变为相同

所以复杂度依旧是\(O(nlogn)\)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u]; k; k = ed[k].nxt)
#define ls (u << 1)
#define rs (u << 1 | 1)
using namespace std;
const int maxn = 200005,maxm = 100005,maxv = (1 << 20) - 1,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
return out * flag;
}
int mx[4 * maxn],And[4 * maxn],Or[4 * maxn];
int vand[4 * maxn],vor[4 * maxn];
int n,A[maxn],Q;
void work_and(int u,int v){
mx[u] &= v; And[u] &= v; Or[u] &= v;
vand[u] &= v; vor[u] &= v;
}
void work_or(int u,int v){
mx[u] |= v; And[u] |= v; Or[u] |= v;
vand[u] |= v; vor[u] |= v;
}
void upd(int u){
vand[u] = vand[ls] & vand[rs];
vor[u] = vor[ls] | vor[rs];
mx[u] = max(mx[ls],mx[rs]);
}
void pd(int u){
if (And[u] != maxv){
work_and(ls,And[u]);
work_and(rs,And[u]);
And[u] = maxv;
}
if (Or[u]){
work_or(ls,Or[u]);
work_or(rs,Or[u]);
Or[u] = 0;
}
}
void build(int u,int l,int r){
And[u] = maxv;
Or[u] = 0;
if (l == r){
mx[u] = vand[u] = vor[u] = A[l];
return;
}
int mid = l + r >> 1;
build(ls,l,mid);
build(rs,mid + 1,r);
upd(u);
}
void modify(int u,int l,int r,int L,int R,int v,int opt){
if (l >= L && r <= R){
if (opt == 1){
if (((v ^ maxv) & ((vor[u] ^ maxv) | vand[u])) == (v ^ maxv)){
work_and(u,v);
return;
}
}
else {
if ((v & ((vor[u] ^ maxv) | vand[u])) == v){
work_or(u,v);
return;
}
}
}
pd(u);
int mid = l + r >> 1;
if (mid >= L) modify(ls,l,mid,L,R,v,opt);
if (mid < R) modify(rs,mid + 1,r,L,R,v,opt);
upd(u);
}
int query(int u,int l,int r,int L,int R){
if (l >= L && r <= R) return mx[u];
pd(u);
int mid = l + r >> 1;
if (mid >= R) return query(ls,l,mid,L,R);
else if (mid < L) return query(rs,mid + 1,r,L,R);
else return max(query(ls,l,mid,L,R),query(rs,mid + 1,r,L,R));
}
int main(){
n = read(); Q = read();
for (int i = 1; i <= n; i++) A[i] = read();
build(1,1,n);
int opt,l,r;
while (Q--){
opt = read();
l = read();
r = read();
if (opt < 3) modify(1,1,n,l,r,read(),opt);
else printf("%d\n",query(1,1,n,l,r));
}
return 0;
}

雅礼培训 Problem A 【线段树】的更多相关文章

  1. 雅礼培训 Problem B 【图论 + 贪心】

    题意 A和B在树上轮流选点,记A的联通块个数为\(x\),B的联通块个数为\(y\) A使\(x - y\)最大,B使\(x - y\) 二人采取最优策略,求\(x-y\) 题解 树联通块个数 = 点 ...

  2. BZOJ_2298_[HAOI2011]problem a_线段树

    BZOJ_2298_[HAOI2011]problem a_线段树 Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话( ...

  3. HDU 5475(2015 ICPC上海站网络赛)--- An easy problem(线段树点修改)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5475 Problem Description One day, a useless calculato ...

  4. codeforces 459D D. Pashmak and Parmida's problem(离散化+线段树或树状数组求逆序对)

    题目链接: D. Pashmak and Parmida's problem time limit per test 3 seconds memory limit per test 256 megab ...

  5. ACM学习历程—HDU5475 An easy problem(线段树)(2015上海网赛08题)

    Problem Description One day, a useless calculator was being built by Kuros. Let's assume that number ...

  6. 2014 Super Training #9 F A Simple Tree Problem --DFS+线段树

    原题: ZOJ 3686 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3686 这题本来是一个比较水的线段树,结果一个ma ...

  7. zoj 3686 A Simple Tree Problem (线段树)

    Solution: 根据树的遍历道的时间给树的节点编号,记录下进入节点和退出节点的时间.这个时间区间覆盖了这个节点的所有子树,可以当做连续的区间利用线段树进行操作. /* 线段树 */ #pragma ...

  8. [Codeforces Round #296 div2 D] Clique Problem 【线段树+DP】

    题目链接:CF - R296 - d2 - D 题目大意 一个特殊的图,一些数轴上的点,每个点有一个坐标 X,有一个权值 W,两点 (i, j) 之间有边当且仅当 |Xi - Xj| >= Wi ...

  9. HDU5107---K-short Problem (线段树区间 合并、第k大)

    题意:二维平面上 N 个高度为 Hi 建筑物,M次询问,每次询问输出 位于坐标(x ,y)左下角(也就是xi <= x && yi <= y)的建筑物中的第k高的建筑物的高 ...

随机推荐

  1. win7 ghost 纯净版最新系统下载

    这个系统是WIN7系统GHOST版装机旗舰版 SP1,更新了系统补丁到2016-02(可通过微软漏洞扫描和卫士漏洞扫描),升级Internet Explorer为IE9,增加数款驱动的支持,支持最新的 ...

  2. 洛谷 P2947 [USACO09MAR]仰望Look Up

    题目描述 Farmer John's N (1 <= N <= 100,000) cows, conveniently numbered 1..N, are once again stan ...

  3. PAT (Basic Level) Practise (中文)-1032. 挖掘机技术哪家强(20)

    PAT (Basic Level) Practise (中文)-1032. 挖掘机技术哪家强(20) http://www.patest.cn/contests/pat-b-practise/1032 ...

  4. Bootstrap历练实例:危险样式按钮

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  5. 电商技术中企业数据总线ESB和注册服务管理的区别

    一.概述 1.什么是ESB 就是企业数据总线的意思,他的核心功能就是兼容各种协议接口,可以将数据在各种协议之间进行流转,并且可以针对数据格式进行编排转换. 异构系统,功能繁多,复杂 代表性的项目有:J ...

  6. ios之UIAlertView

    举例: UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Default Alert View"messa ...

  7. Bzoj 1055: [HAOI2008]玩具取名 (区间DP)

    Bzoj 1055: [HAOI2008]玩具取名 (区间DP) 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间动态规划和可 ...

  8. HDU-1455-木棒

    这题的话,我们,定义一个结构体,然后把木棒从大到小排序. 这些木棒如果是由多根等长木棒组成的,那目标长度一定大于等于其中最长的木棒长度,所这就是我们搜索的下限. 上限就是所有的木棒组成了一根木棒,就是 ...

  9. zabbix:告警、恢复消息次数

    之前zabbix配置告警,存在告警信息发送多次并且恢复信息也跟着发送多次了,导致企业微信流量不够用,没有找到恢复信息单独的设置项 动作中的步骤我个人理解为:1-5的意思是发送5条告警消息      3 ...

  10. Python的第二堂课(1)

    一.编程语言的分类 机器语言:直接使用二进制命令去编写程序. 优点:执行效率高 缺点:开发效率低 汇编语言:用英文标签代替二进制命令去编写程序 优点:开发效率高于机器语言 缺点:执行效率低于机器语言 ...