HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911
线段树区间合并的题目,解释一下代码中声明数组的作用:
m1是区间内连续1的最长长度,m0是区间内连续0的最长长度,l1是从区间左端开始连续1的长度,r1是从区间右端开始连续1的长度,l0是从区间左端开始连续0的长度,r0是从区间右端开始连续0的长度,lazy标记该区间是否进行异或操作。
之所以要同时保存1的连续长度和0的连续长度,是因为这道题设计取反操作,所以取反是,只需将对应的0、1长度调换一下就可以了
#include<stdio.h>
#include<algorithm>
#define lson l,m,rt*2
#define rson m+1,r,rt*2+1
#define maxn 111111
using namespace std;
int m1[maxn*],m0[maxn*],l1[maxn*],r1[maxn*],l0[maxn*],r0[maxn*],lazy[maxn*];
void change(int rt){
swap(m1[rt],m0[rt]);
swap(l1[rt],l0[rt]);
swap(r1[rt],r0[rt]);
}
void pushup(int l,int r,int rt){
int m = (l+r)/;
//左边的长度等于左子区间左边的长度,右边的长度等于右子区间右边的长度,下同
l1[rt] = l1[rt*];
r1[rt] = r1[rt*+]; l0[rt] = l0[rt*];
r0[rt] = r0[rt*+];
//左边的长度等于区间左半长,则加上右子区间左边的长度,下同
if(l1[rt] == m-l+)
l1[rt] += l1[rt*+];
if(r1[rt] == r-m)
r1[rt] += r1[rt*]; if(l0[rt] == m-l+)
l0[rt] += l0[rt*+];
if(r0[rt] == r-m)
r0[rt] += r0[rt*];
//最大的长度为左右子区间最大长度的最大值,与该区间中间的长度取最值
m1[rt] = max(r1[rt*]+l1[rt*+],max(m1[rt*],m1[rt*+]));
m0[rt] = max(r0[rt*]+l0[rt*+],max(m0[rt*],m0[rt*+]));
}
void pushdown(int l,int r,int rt){
if(lazy[rt]){
lazy[rt*] ^= ;
lazy[rt*+] ^= ;
lazy[rt] = ;
change(rt*);
change(rt*+);
}
}
void build(int l,int r,int rt){
m1[rt] = m0[rt] = l1[rt] = r1[rt] = l0[rt] = r0[rt] = lazy[rt] = ;;
if(l == r){
scanf("%d",&m1[rt]);
if(m1[rt] == )
l1[rt] = r1[rt] = ;
else
l0[rt] = r0[rt] = m0[rt] = ;
return;
}
int m = (l+r)/;
build(lson);
build(rson);
pushup(l,r,rt);
}
void update(int l,int r,int rt,int a,int b){
if(a<=l && b>=r){
lazy[rt] ^= ;
change(rt);
return;
}
pushdown(l,r,rt);
int m = (l+r)/;
if(a <= m)
update(lson,a,b);
if(b > m)
update(rson,a,b);
pushup(l,r,rt);
}
int query(int l,int r,int rt,int a,int b){
if(a<=l && b>=r){
return m1[rt];
}
pushdown(l,r,rt);
int m = (l+r)/;
if(b <= m)
return query(lson,a,b);
if(a > m)
return query(rson,a,b);
int t1 = query(lson,a,b);
int t2 = query(rson,a,b);
//最值在左半区间、右半区间、以及中间的长度里去,其中中间的长度不能大于查询长度的边界
return max(max(t1,t2),min(m-a+,r1[rt*])+min(b-m,l1[rt*+]));
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
build(,n,);
int m;
scanf("%d",&m);
int x,a,b;
while(m--){
scanf("%d%d%d",&x,&a,&b);
if(x == ){
printf("%d\n",query(,n,,a,b));
}else{
update(,n,,a,b);
}
}
}
return ;
}
HDU 3911 线段树区间合并、异或取反操作的更多相关文章
- HDU 3911 线段树区间合并
北京赛区快了,准备袭击数据结构和图论.倒计时 18天,线段树区间合并.维护一个最长连续.. 题意:给一个01串,以下有一些操作,问区间最长的连续的1的个数 思路:非常裸的线段树区间合并 #includ ...
- hdu 3308(线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 1806(线段树区间合并)
Frequent values Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 3308 线段树 区间合并+单点更新+区间查询
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 3911 Black And White (线段树 区间合并)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意: 给你一段01序列,有两个操作: 1.区间异或,2.询问区间最长的连续的1得长度 思路: ...
- HDU 3911 Black And White(线段树区间合并+lazy操作)
开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
- HDU 3308 (线段树区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意: 两个操作 : 1 修改 单点 a 处的值. 2 求出 区间[a,b]内的最长上升子序列. 做法 ...
- HDU 6638 - Snowy Smile 线段树区间合并+暴力枚举
HDU 6638 - Snowy Smile 题意 给你\(n\)个点的坐标\((x,\ y)\)和对应的权值\(w\),让你找到一个矩形,使这个矩阵里面点的权值总和最大. 思路 先离散化纵坐标\(y ...
随机推荐
- 网站缓存数据到tomcat服务器
通过缓存使相同的数据不用重复加载,降低数据库的访问 public class CacheFilter implements Filter { //实例变量[每线程共享] private Map< ...
- href和src的使用场景
href和src的使用场景 href和src的用法虽然简单,但是有时候会突然记不起来该怎么用,且两者不可相互替换,下面列出来方便记忆,并给出具体区别. href的使用: 1.外部css引用:<l ...
- CSS的4种引入方式及优先级
第一:css的四种引入方式 1.行内样式 最直接最简单的一种,直接对HTML标签使用style="",例如: <p style="color:#F00; " ...
- 使用Java中的动态代理实现数据库连接池
2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池. 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的 ...
- cocos2d 2.2.6 win7下的配置
我搭建cocos2.6的开发环境需要安装工具包括: 1.Visual Studio 2012(由于不兼容win7,需要安装Update 4)和虚拟光驱daemon tool,虚拟光驱的下载地址:htt ...
- Java排序算法——快速排序
import java.util.Arrays; //================================================= // File Name : Arrays_Q ...
- SortedMap接口
SortedMap接口是排序接口,只要是实现了此接口的子类,都属于排序的子类,TreeMap也是此接口的一个子类. import java.util.Map; import java.util.Sor ...
- Nginx+PHP-fpm高负载优化及压力测试方法
Nginx+PHP-fpm组合,以内存占用小,负载能力强壮的特点,成为小内存VPS建站的首选组合.我们一起来探讨一下nginx+php-fpm高负载的优化方法. 先来看看nginx配置参数的优化.ng ...
- rem自适应布局的回顾总结
使用rem实现自适应布局,应该算是当前移动前端的一大趋势,有些人对此还有点迷惑,搞不懂rem是如何实现自适应布局,如何根据设计稿来调整rem的值?rem布局如何用雪碧背景图片?rem一定要加载JS吗? ...
- 为什么可以用while(cin)?
为什么可以用while(cin)? /** * @brief The quick-and-easy status check. * * This allows you to write const ...