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时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这 ...
随机推荐
- create-react-app不支持less的解决方式
进入node_modules\react-scripts\config目录 修改webpack.config.dev.js跟webpack.config.prod.js中关于loader的配置即可,注 ...
- MySQL数据库中文乱码问题
mysql> select * from books; +-----+---------------------------------+---------+-------------+---- ...
- [技术博客] rails控制台调试路由
目录 rails console 获得路由 app.xxx_path 发送请求 获得响应 作者:庄廓然 rails console 在项目目录下执行rails console test 可以进入测试模 ...
- Python数据分析学习(一)
转摘:https://segmentfault.com/a/1190000015440560 一.数据初探 首先导入要使用的科学计算包numpy,pandas,可视化matplotlib,seabor ...
- 用Python实现一个简单的——人脸相似度对比
近几年来,兴起了一股人工智能热潮,让人们见到了AI的能力和强大,比如图像识别,语音识别,机器翻译,无人驾驶等等.总体来说,AI的门槛还是比较高,不仅要学会使用框架实现,更重要的是,需要有一定的数学基础 ...
- 转载:【TP5.0】TP5 Validate 验证规则
下面是部分tp5内置的验证规则: 格式验证类: 'name'=>'require' 验证某个字段的值是否为数字(采用filter_var验证),例如: number 或者 integer 'na ...
- Proj.4 升级新版本5.x和6.x
目录 Proj.4 升级新版本5.x和6.x 0.缘起 1.5.x和6.x更新情况简述 PROJ 5.x 更新 PROJ 6.x 更新 2.从PROJ.4向新版本迁移 迁移到5.x版本 迁移到6.x版 ...
- 面试突击(八)——JVM的结构及内存模型,是怎么划分的?
声明:本文图片均来自网络,我只是进行了选择,利用一图胜千言的力量来帮助自己快速的回忆相关的知识点 0:再上一张Java代码的转换流程图 .java——Java程序员编写,给人看的 .class——Ja ...
- odoo开发笔记 -- odoo快速开发技巧
1. 需求分析到位 2. 系统对接,角色用例,数据串接 ---确定,轻易不可变更 3. 业务流程拆分细化 出图--开发人员理解的地步 4. 数据模型建立 --对应角色用例 5. 确立开发计划,划分功能 ...
- python开发笔记-pymsslq连接操作SqlServer数据库
1. 普通连接测试 官方文档样例:http://pymssql.org/en/latest/pymssql_examples.html pymssql模块使用指南:https://blog.csdn. ...