BZOJ5312 冒险 势能分析、线段树
区间位赋值、区间求最大值似乎是不能够像一般的线段树一样直接打标记的,但是直接暴力也太没有面子了。
我们考虑优化一下暴力:如果说线段树的一段区间内在当前修改的所有位置上所有数都是相同的,那么这个最大值就是可以直接维护的,在上面打上标记;如果这个条件不满足就暴力向下递归。
然后交一发发现过了!然而这并不是数据水。
考虑势能分析计算复杂度。设每一个节点的势能函数为当前区间的所有数在位置上不全相同的位置个数。每一次在找到覆盖区间之后暴力向下递归,则势能函数必定减小至少\(1\),而势能的增加量最多为\(log\ nlog\ w\),所以总的复杂度是\(O(nlog\ nlog\ w)\)。
#include<bits/stdc++.h>
using namespace std;
int read(){
int a = 0; char c = getchar(); bool f = 0;
while(!isdigit(c)){f = c == '-'; c = getchar();}
while(isdigit(c)){
a = a * 10 + c - 48; c = getchar();
}
return f ? -a : a;
}
const int _ = 2e5 + 3 , MX = (1 << 20) - 1;
namespace segt{
int mx[_ << 2] , mrkand[_ << 2] , mrkor[_ << 2] , vis[_ << 2];
#define mid ((l + r) >> 1)
#define lch (x << 1)
#define rch (x << 1 | 1)
void mark(int x , int And , int Or){
mrkor[x] ^= mrkor[x] & And; mrkand[x] ^= mrkand[x] & Or;
mrkor[x] |= Or; mrkand[x] |= And; mx[x] = mx[x] & ~And | Or;
}
void down(int x){mark(lch , mrkand[x] , mrkor[x]); mark(rch , mrkand[x] , mrkor[x]); mrkand[x] = mrkor[x] = 0;}
void init(int x , int l , int r){
if(l == r){mx[x] = read(); vis[x] = MX;}
else{
init(lch , l , mid); init(rch , mid + 1 , r);
mx[x] = max(mx[lch] , mx[rch]); vis[x] = vis[lch] & vis[rch] & ~(mx[lch] ^ mx[rch]);
}
}
void modify(int x , int l , int r , int L , int R , int And , int Or){
if(l >= L && r <= R && ((vis[x] & And) == And) && ((vis[x] & Or) == Or)){mark(x , And , Or); return;}
down(x); if(mid >= L) modify(lch , l , mid , L , R , And , Or);
if(mid < R) modify(rch , mid + 1 , r , L , R , And , Or);
mx[x] = max(mx[lch] , mx[rch]); vis[x] = vis[lch] & vis[rch] & ~(mx[lch] ^ mx[rch]);
}
int qry(int x , int l , int r , int L , int R){
if(l >= L && r <= R) return mx[x];
int mx = 0; down(x);
if(mid >= L) mx = qry(lch , l , mid , L , R);
if(mid < R) mx = max(mx , qry(rch , mid + 1 , r , L , R));
return mx;
}
}using namespace segt;
int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
freopen("out","w",stdout);
#endif
int N = read() , M = read() , l , r , x; init(1 , 1 , N);
while(M--)
switch(read()){
case 1:
l = read(); r = read(); x = read(); modify(1 , 1 , N , l , r , MX ^ x , 0);
break;
case 2:
l = read(); r = read(); x = read(); modify(1 , 1 , N , l , r , 0 , x);
break;
case 3:
l = read(); r = read(); printf("%d\n" , qry(1 , 1 , N , l , r));
}
return 0;
}
BZOJ5312 冒险 势能分析、线段树的更多相关文章
- bzoj5312: 冒险(势能均摊线段树)
题目链接 BZOJ5312: 冒险 题解 如果一次操作对区间& 和 区间| 产生的影响是相同的,那么该操作对整个区间的影响都是相同的 对于每次操作,在某些位上的值,对于整个区间影响是相同的,对 ...
- BZOJ_1012_[JSOI2008]_最大数maxnumber_(线段树/树状数组+RMQ)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1012 两种操作: 1.求序列末尾n个数中的最大值. 2.在序列末尾插入一个数. 分析 线段树求 ...
- LightOJ 1135(线段树)
题解引自:http://www.cnblogs.com/wuyiqi/archive/2012/05/27/2520642.html 题意: 有n个数,刚开始都为0 add i , j 给i,j区间内 ...
- [luogu1198][bzoj1012][JSOI2008]最大数【线段树+分块】
题目描述 区间查询最大值,结尾插入,强制在线. 分析 线段树可以做,但是练了一下分块,发现自己打错了两个地方,一个是分块的地方把/打成了%,还有是分块的时候标号要-1. 其他也没什么要多讲的. 代码 ...
- HDU - 1540 Tunnel Warfare(线段树区间合并)
https://cn.vjudge.net/problem/HDU-1540 题意 D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 分析 线段树的区间内,我 ...
- BZOJ 4399 魔法少女LJJ(线段树合并)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=4399 思路 码农题,需要一定代码功底.方法很暴力,先将权值离散,表示在线段树里储存的位置,每 ...
- 【BZOJ】1756: Vijos1083 小白逛公园(线段树)
题目 传送门:QWQ 分析 线段树维护一下最大子序列 维护一下最大前缀 最大后缀 区间和 就ok了 好像只能用结构体..... 代码 #include <bits/stdc++.h> u ...
- uvalive4108(线段树)
uvalive4108 题意 按顺序给出 n 个矩形,每给出一个矩形,统计它在多长的部分是最高的,并把这个长度称为该矩形的覆盖度,求最后总的覆盖度(每次得到的矩形的覆盖度之和) 分析 线段树.用两个数 ...
- 【离线 线段树分治】bzoj4025: 二分图
昨天mac的gdb挂了,今天怎么笔记本的gdb也挂了…… Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这 ...
随机推荐
- LSF 作业系统常用命令
LSF(Load Sharing Facility)是一个被广泛使用的作业管理系统,具有高吞吐.配置灵活的优点.通过 LSF 集中监控和调度,可以充分利用计算机的CPU.内存.磁盘等资源. bqueu ...
- Linux kill、kill-15、kill-9区别
进程状态转换图 kill和kill -9,两个命令在linux中都有杀死进程的效果,然而两命令的执行过程却大有不同,在程序中如果用错了,可能会造成莫名其妙的现象. 执行kill(不加 -* 默认kil ...
- Spring Cloud Ribbon源码分析---负载均衡实现
上一篇结合 Eureka 和 Ribbon 搭建了服务注册中心,利用Ribbon实现了可配置负载均衡的服务调用.这一篇我们来分析Ribbon实现负载均衡的过程. 从 @LoadBalanced入手 还 ...
- Salt-Formulas的使用
Saltstack自0.17.x版本开始引进Formulas的概念,旨在通过简化State和集成数据来实现State的友好管理.根据SALT FORMULAS的官方文档,在完成手动添加formula目 ...
- Unity资源商店 Asset store下载文件夹的位置
Win10 C:\Users\用户名\AppData\Roaming\Unity\Asset Store-5.x\ Mac OS X ~/Library/Unity/Asset Store
- 使用 ArcGIS Desktop 切瓦片
目录 1.生成切片缓存切片方案 2.切瓦片 1.生成切片缓存切片方案 ArcGIS有默认的切片方案,如果需要自定义切片规则,需要先生成一个切片方案. 打开ArcMap,打开 工具箱(Tools Box ...
- MySQL 设计与开发规范
MySQL 设计与开发规范 1 目的 本规范的主要目的是希望规范数据库设计与开发,尽量避免由于数据库设计与开发不当而产生的麻烦:同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好保 ...
- js---if判断的几种写法
在写JS中最常见的就是 if 判断,但是直接写 if(){}else{}; 太low ,下面是常见的几种js的if判断的写法: /** * js 判断的几种写法 */ var a = 10,b = 2 ...
- Windows删除空文件夹问题带来的学习与思考
https://blog.csdn.net/XavierDarkness/article/details/84785482 1.问题产生: 前段时间得到一份资源,号称有近500个G的学习资料,花了 ...
- centos7.6使用 supervisor 对filebeat7.3.1进程进行管理
centos7.6使用 supervisor 对filebeat7.3.1进程进行管理 Supervisor 是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX ...