模板题

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 100007using namespace std;int n,m;
int a[MAX];struct Tree
{int l , r , lmx[2] , rmx[2] , mx[2] , lazy;
}tree[MAX<<2];void push_up ( int u )
{for ( int i = 0 ; i < 2 ; i++ ){tree[u].lmx[i] = tree[u<<1].lmx[i];tree[u].rmx[i] = tree[u<<1|1].rmx[i];tree[u].mx[i] = max ( tree[u<<1].mx[i] , tree[u<<1|1].mx[i] );if ( tree[u<<1].lmx[i] == tree[u<<1].r - tree[u<<1].l + 1 )tree[u].lmx[i] = tree[u<<1].lmx[i] + tree[u<<1|1].lmx[i];if ( tree[u<<1|1].rmx[i] == tree[u<<1|1].r - tree[u<<1|1].l + 1 )tree[u].rmx[i] = tree[u<<1].rmx[i] + tree[u<<1|1].rmx[i];tree[u].mx[i] = max ( tree[u].mx[i] , tree[u<<1].rmx[i] + tree[u<<1|1].lmx[i] );}
}void push_down ( int u )
{int lazy = tree[u].lazy;if ( lazy&1 ){tree[u].lazy = 0;tree[u<<1].lazy += lazy;tree[u<<1|1].lazy += lazy;swap ( tree[u<<1].lmx[0] , tree[u<<1].lmx[1] );swap ( tree[u<<1].rmx[0] , tree[u<<1].rmx[1] );swap ( tree[u<<1].mx[0] , tree[u<<1].mx[1] );swap ( tree[u<<1|1].lmx[0] , tree[u<<1|1].lmx[1] );swap ( tree[u<<1|1].rmx[0] , tree[u<<1|1].rmx[1] );swap ( tree[u<<1|1].mx[0] , tree[u<<1|1].mx[1] );}
}void build ( int u , int l , int r )
{tree[u].l = l , tree[u].r = r;tree[u].lazy = 0;if ( l == r ){int c = a[l];tree[u].lmx[c] = tree[u].rmx[c] = tree[u].mx[c] = 1;tree[u].lmx[c^1] = tree[u].rmx[c^1] = tree[u].mx[c^1] = 0;return;}int mid = l + r >> 1;build ( u<<1 , l , mid );build ( u<<1|1 , mid+1 , r );push_up ( u );
}void update ( int u , int left , int right )
{int l = tree[u].l , r = tree[u].r;if ( left <= l && r <= right ){tree[u].lazy++;swap ( tree[u].lmx[0] , tree[u].lmx[1] );swap ( tree[u].rmx[0] , tree[u].rmx[1] );swap ( tree[u].mx[0] , tree[u].mx[1] );return;}push_down ( u );int mid = l + r >> 1;if ( left <= mid && right >= l )update ( u<<1 , left , right );if ( left <= r && right > mid )update ( u<<1|1 , left , right );push_up ( u );
}struct Ret
{int mx,lmx,rmx,l,r;Ret ( ) { }Ret ( int a , int b , int c , int d  , int w ) : mx ( a ) , lmx ( b ) , rmx ( c ) , l ( d ) , r ( w ) { }
};Ret query ( int u , int left , int right )
{int l = tree[u].l , r = tree[u].r;if ( left <= l && r <= right )return Ret ( tree[u].mx[1] , tree[u].lmx[1] , tree[u].rmx[1] , tree[u].l , tree[u].r );int mid = l + r >> 1;push_down ( u );if ( mid < left ) return query ( u<<1|1 , left , right );else if ( right <= mid ) return query ( u<<1 , left , right );else{Ret ret1 = query ( u<<1 , left , right );Ret ret2 = query ( u<<1|1 , left , right );Ret ret;ret.l = ret1.l , ret.r = ret2.r;ret.mx = max ( ret1.mx , ret2.mx );ret.lmx = ret1.lmx;ret.rmx = ret2.rmx;if ( ret1.lmx == ret1.r - ret1.l + 1 )ret.lmx = ret1.lmx + ret2.lmx;if ( ret2.rmx == ret2.r - ret2.l + 1 )ret.rmx = ret2.rmx + ret1.rmx;ret.mx = max ( ret.mx , ret1.rmx + ret2.lmx );return ret;}}int main ( )
{while ( ~scanf ( "%d" , &n ) ){for ( int i = 1 ; i <= n ; i++ ) scanf ( "%d" , &a[i] );scanf ( "%d" , &m );int f,l,r;build ( 1, 1 ,n );for ( int i = 0 ; i < m ; i++ ){scanf ( "%d%d%d" , &f , &l , &r );if ( f ) update ( 1 , l , r );else printf ( "%d\n" , query ( 1 , l , r ).mx );}}
}

hdu 3911 线段树+区间合并相关推荐

  1. hdu 5367(线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...

  2. hdu 1806线段树 区间合并

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> us ...

  3. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  4. HDU3308 线段树区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...

  5. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

  6. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

  7. CodeForces - 1539F Strange Array(线段树区间合并)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,规定位置 iii 的贡献是:设 x=a[i]x=a[i]x=a[i],选择一个包含 iii 的区间 [l,r][l,r][l,r],将其中 ...

  8. 牛客 - 求函数(线段树+区间合并/线段树+矩阵维护)

    题目链接:点击查看 题目大意:现在有 n 个函数,每个函数都是诸如 f( x ) = k * x + b 的形式,只是每个函数的 k 和 b 都是相互独立的,现在给出两个操作: 1 pos k b:将 ...

  9. 2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并

    传送门 文章目录 题意: 思路: 题意: 题面挺绕口的,还是看原题比较好. 大概的意思就是让你从给定的区间中选择一个以左端点为起点的一个上升子序列,让后将这些下标存下来,在bbb中将这些位置拿出来后, ...

  10. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

最新文章

  1. 揭秘@爱可可:“寂寞呆子”成长记
  2. 对于U盘做系统,win8降级到win7系统的心得体会
  3. 一张图说明 函数, 实例(对象), 原型之间的关系
  4. C# 实现DB文件的导入导出功能
  5. 银行错误将10万打给自己,客户有责任退还,银行难道没责任吗?
  6. 今天正式开通51CTO技术博客
  7. python setup.py 指定文件到指定路径_linux下python安装到指定目录
  8. 2017.10.22 最多的方案 失败总结
  9. 《长安十二时辰》火了!程序员版本过于真实!
  10. 写个鸭子类方法java_小黄鸭系列java基础知识 | Java基本语法
  11. Cesium加载影像图
  12. 2021周记11:慢慢自律和追剧
  13. ubuntu系统添加新的字体——JetBrains Mono 字体添加实例
  14. Cool Edit Pro
  15. ZooKeeper - 四字命令解析
  16. 医疗实施-EMPI(患者主索引)
  17. 创业期间,应该怎么样坚持下去?如何从容面对困难?
  18. 基于HTML5的捕鱼达人游戏网页版
  19. pandas+plt操作练习(统计高等数学竞赛获奖)
  20. 数据中台的五个关键要素

热门文章

  1. js模拟群聊天php,jquery仿微信聊天界面实例分享
  2. tcpdump教程_Tcpdump教程示例
  3. ## reverse函数 //matlab
  4. Android声明式UI框架 Litho 初探——基础使用
  5. C语言学习笔记 —— 内存管理
  6. Android消息推送原理
  7. 深度分析第一家上市的全栈量子计算公司IonQ,是否值得投资?
  8. Java基础——数据导入(Scanner)
  9. iis网站无法启动,提示ox8ffe2740错误
  10. tomcat报错PermGen space解决方案