HDU 3911 线段树区间染色 区间查询
来源:互联网 发布:tekla软件 价格 编辑:程序博客网 时间:2024/06/04 23:34
九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/12110463
题意:
n个点
下面表示每个点的值(0或1)
m个操作
oper [u,v] oper==1表示把区间所有值异或一下, ==0 表示询问区间上 连续为1的最长长度
#include<iostream>#include<stdio.h>#include<string>#include<string.h>#include<algorithm>#include<set>#include <cstdio> #include <cstring> #include <iostream> #include <math.h> #include <queue> #define N 100100#define ll int #define L(x) x<<1 #define R(x) x<<1|1 #define Mid(x,y) (x+y)>>1 using namespace std; inline ll Min(ll a,ll b){return a>b?b:a;}inline ll Max(ll a,ll b){return a>b?a:b;}int a[N];//1是黑struct node{ int l,r; int Win, Bin;//区间内黑白的最长int Llen, Rlen;// Llen 是 这个区间内 从区间左端点向右连续相同颜色的长度int Lc, Rc;//左端颜色bool lazy;int len(){return r-l+1;}}tree[N*8]; void change(int id){tree[id].lazy = 0;tree[id].Lc ^= 1;tree[id].Rc ^= 1;int temp = tree[id].Win;tree[id].Win = tree[id].Bin; tree[id].Bin = temp;tree[L(id)].lazy ^= 1;tree[R(id)].lazy ^= 1;}void updata_up(int id){tree[id].Lc = tree[L(id)].Lc , tree[id].Rc = tree[R(id)].Rc ;tree[id].Rlen = tree[R(id)].Rlen;tree[id].Llen = tree[L(id)].Llen;tree[id].Bin=Max(tree[L(id)].Bin, tree[R(id)].Bin);tree[id].Win=Max(tree[L(id)].Win, tree[R(id)].Win);if( tree[L(id)].Rc == tree[R(id)].Lc){if(tree[L(id)].Rc)tree[id].Bin = Max(tree[id].Bin, tree[L(id)].Rlen + tree[R(id)].Llen);else tree[id].Win = Max(tree[id].Win, tree[L(id)].Rlen + tree[R(id)].Llen);if(tree[L(id)].Llen == tree[L(id)].len())tree[id].Llen = tree[L(id)].len() + tree[R(id)].Llen;if(tree[R(id)].Rlen == tree[R(id)].len())tree[id].Rlen = tree[R(id)].len() + tree[L(id)].Rlen;}if(tree[id].Lc==1)tree[id].Bin=Max(tree[id].Bin, tree[id].Llen);else tree[id].Win=Max(tree[id].Win, tree[id].Llen);if(tree[id].Rc==1)tree[id].Bin=Max(tree[id].Bin, tree[id].Rlen);else tree[id].Win=Max(tree[id].Win, tree[id].Rlen);}void Lazy(int id){if(!tree[id].lazy) return ;tree[id].lazy = 0;tree[id].Lc ^= 1;tree[id].Rc ^= 1;int temp = tree[id].Win;tree[id].Win = tree[id].Bin; tree[id].Bin = temp;tree[L(id)].lazy ^= 1;tree[R(id)].lazy ^= 1;}void build(int l,int r,int id){tree[id].l = l, tree[id].r = r;tree[id].lazy=0;if(l == r){tree[id].Llen=tree[id].Rlen=1;tree[id].Lc = tree[id].Rc = a[l];tree[id].Bin = a[l];tree[id].Win = 1-a[l];return ;}int mid = Mid(l,r);build( l, mid, L(id));build( mid+1, r, R(id));updata_up(id);}void updata(int l, int r, int id){if(l == tree[id].l && tree[id].r == r){Lazy(id); change(id); return ;}int mid=Mid(tree[id].l, tree[id].r);if(r <= mid) updata(l, r, L(id));else if(mid < l) updata(l, r, R(id));else {updata(l, mid, L(id));updata(mid+1, r, R(id));}Lazy(L(id)),Lazy(R(id));updata_up(id);}int query(int l, int r, int id){Lazy(id);if(l == tree[id].l && tree[id].r == r)return tree[id].Bin; int mid=Mid(tree[id].l, tree[id].r);int r1=0, r2=0, ans=0;if(r <= mid) r1 = query(l, r, L(id));else if(mid < l) r2 = query(l, r, R(id));else {r1 = query(l, mid, L(id));r2 = query(mid+1, r, R(id));if(tree[L(id)].Rc == 1 && tree[R(id)].Lc == 1)ans = Min(mid-l+1, tree[L(id)].Rlen) + Min(r-mid, tree[R(id)].Llen) ;r1 = Max(ans, r1);}ans = Max(r1, r2);return ans;}int main(){int n, que, oper, b, c;while(~scanf("%d",&n)){for(int i=1;i<=n;i++)scanf("%d", &a[i]);build(1,n,1);scanf("%d", &que);while(que--){scanf("%d %d %d", &oper, &b, &c);if(oper)updata(b,c,1);elseprintf("%d\n", query(b,c,1));//问黑色}}return 0;}/*0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 0 15,160 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 1 0 6,180 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 9,1520 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0990 1 161 15 160 1 171 6 18 0 1 181 9 150 1 191 1 10 1 201 1 21 3 50 1 111 1 200 1 12 0 1 130 1 151 2 200 1 201 4 191 5 71 6 131 2 200 1 10 2 100 3 80 4 90 10 110 1 20ans:6454472228122212*/
- HDU 3911 线段树区间染色 区间查询
- HDU 3397 线段树区间染色 区间查询
- HDU 1540 && POJ 2892 线段树 单点染色 区间查询
- poj1436(线段树区间染色)
- poj2528(线段树区间染色)
- HDU 3397——Sequence operation(线段树,区间染色+区间异或+区间合并)
- POJ 2777-Count Color(线段树-区间染色查询)
- hdu 5023(线段树区间更新+区间查询)
- 线段树--区间更新-区间查询HDU 1698
- HDU 1540 线段树(区间查询)
- poj 2777 Count Color 【线段树lazy区间染色 + 查询区间颜色数目 + 状态压缩】
- HDU 1698 Just a Hook(线段树区间更新+区间求和+染色问题)
- 线段树区间查询
- hdu1698(线段树染色区间求和)
- ZOJ 1610 线段树区间染色
- poj 2777 线段树(区间染色)
- BZOJ 8843 染色 [树链剖分+区间线段树]
- poj 2777(线段树+区间染色)
- 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
- GAR路由器RIP实验
- NGINX-RTMP复杂度分析
- 工作那些事(三)什么样的公司能吸引你,什么样的公司适合你?
- 排序算法
- HDU 3911 线段树区间染色 区间查询
- GAR路由器OSPF实验
- iterator与const_iterator区别
- 详解大端模式和小端模式
- C++不能继承与实例化问题
- GAR路由器PPP实验
- hdu 4463 Outlets (次小生成树)
- Linux内核源码中两个宏定义likely,unlikely
- 11年上海赛区赛真题 Bombing