题目:下列操作

Change operations:
0 a b change all characters into '0's in [a , b]
1 a b change all characters into '1's in [a , b]
2 a b change all '0's into '1's and change all '1's into '0's in [a, b]
Output operations:
3 a b output the number of '1's in [a, b]
4 a b output the length of the longest continuous '1' string in [a , b]

思路:  基础  区间 合并 不过操作比较多, 题目要求查询最长的 1  因为有异或  也要记下最长的  0

#include <iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#define N 100050
using namespace std;
int flag[N * ], Xor[N * ], sum[N * ];
int a[N];
int lsum[][N * ], rsum[][N * ], msum[][N * ];
int max(int x, int y) {
return x > y ? x : y;
}
void pushup(int i, int l, int r) {
int mid = (l + r) >> ;
sum[i] = sum[i << ] + sum[i << | ];
for (int j = ; j < ; ++j) {
lsum[j][i] = lsum[j][i << ];
rsum[j][i] = rsum[j][i << | ];
if (lsum[j][i] == mid - l + )
lsum[j][i] += lsum[j][i << | ];
if (rsum[j][i] == r - mid)
rsum[j][i] += rsum[j][i << ];
msum[j][i] = max(msum[j][i << ], msum[j][i << | ]);
msum[j][i] = max(msum[j][i], rsum[j][i << ] + lsum[j][i << | ]);
}
}
void pushdown(int i, int l, int r) {
if (flag[i] != -) {
int mid = (l + r) >> ;
flag[i << ] = flag[i << | ] = flag[i];
Xor[i << ] = Xor[i << | ] = ;
sum[i << ] = (mid - l + ) * flag[i];
sum[i << | ] = (r - mid) * flag[i];
lsum[flag[i]][i << ] = rsum[flag[i]][i << ] = msum[flag[i]][i << ]
= mid - l + ;
lsum[flag[i]][i << | ] = rsum[flag[i]][i << | ] = msum[flag[i]][i
<< | ] = r - mid;
lsum[ - flag[i]][i << ] = rsum[ - flag[i]][i << ] = msum[
- flag[i]][i << ] = ;
lsum[ - flag[i]][i << | ] = rsum[ - flag[i]][i << | ] = msum[
- flag[i]][i << | ] = ;
flag[i] = -; }
if (Xor[i] != ) {
int mid = (l + r) >> ;
Xor[i << ] ^= ;
Xor[i << | ] ^= ;
sum[i << ] = (mid - l + ) - sum[i << ];
sum[i << | ] = (r - mid) - sum[i << | ];
swap(lsum[][i << ], lsum[][i << ]);
swap(rsum[][i << ], rsum[][i << ]);
swap(msum[][i << ], msum[][i << ]);
swap(lsum[][i << | ], lsum[][i << | ]);
swap(rsum[][i << | ], rsum[][i << | ]);
swap(msum[][i << | ], msum[][i << | ]);
Xor[i] = ;
}
} void build(int l, int r, int i) {
flag[i] = -;
Xor[i] = ;
if (l == r) {
sum[i] = flag[i] = a[l];
msum[a[l]][i] = rsum[a[l]][i] = lsum[a[l]][i] = ;
msum[ - a[l]][i] = rsum[ - a[l]][i] = lsum[ - a[l]][i] = ;
return;
}
int mid = (l + r) >> ;
build(l, mid, i << );
build(mid + , r, i << | );
pushup(i, l, r);
}
void update(int l, int r, int pl, int pr, int type, int i) {
if (l >= pl && r <= pr) {
if (type == ) {
flag[i] = ;
sum[i] = ;
Xor[i] = ;
lsum[][i] = rsum[][i] = msum[][i] = r - l + ;
lsum[][i] = rsum[][i] = msum[][i] = ;
return;
}
if (type == ) { flag[i] = ;
sum[i] = (r-l+);
Xor[i] = ;
lsum[][i] = rsum[][i] = msum[][i] = ;
lsum[][i] = rsum[][i] = msum[][i] = r-l+;
return;
}
if(type==)
{
Xor[i]^=;
sum[i]=(r-l+)-sum[i];
swap(lsum[][i],lsum[][i]);
swap(rsum[][i],rsum[][i]);
swap(msum[][i],msum[][i]);
return;
}
return;
}
pushdown(i,l,r);
int mid=(l+r)>>;
if(pl<=mid)update(l,mid,pl,pr,type,i<<);
if(pr>mid)update(mid+,r,pl,pr,type,i<<|);
pushup(i,l,r);
}
int query1(int l,int r,int pl,int pr,int i)
{
if(l>=pl&&r<=pr)
return sum[i];
pushdown(i,l,r);
int mid=(l+r)>>;
int tmp=;
if(pl<=mid)tmp+=query1(l,mid,pl,pr,i<<);
if(pr>mid)tmp+=query1(mid+,r,pl,pr,i<<|);
pushup(i,l,r);
return tmp;
} int query2(int l,int r,int pl,int pr,int i)
{
if(l>=pl&&r<=pr)
{
return msum[][i];
}
pushdown(i,l,r);
int mid=(l+r)>>;
if(pr<=mid)return query2(l,mid,pl,pr,i<<);
else if(pl>mid)return query2(mid+,r,pl,pr,i<<|);
else
{
int tmp=;
if(mid-rsum[][i<<]+>=pl)
tmp+=rsum[][i<<];
else
tmp+=mid-pl+;
if(mid+lsum[][i<<|]<=pr)
tmp+=lsum[][i<<|];
else
tmp+=pr-mid; int maxn1=query2(l,mid,pl,mid,i<<);
int maxn2=query2(mid+,r,mid+,pr,i<<|);
tmp=max(tmp,maxn1);
tmp=max(tmp,maxn2);
return tmp;
}
}
int main() {
int n,m,tt;
scanf("%d",&tt);
while(tt--)
{
scanf("%d%d",&n,&m);
for(int i=;i<n;++i)
scanf("%d",&a[i]);
n--;
build(,n,); while(m--)
{
int x,y,z;
scanf("%d%d%d",&z,&x,&y);
if(z<=)update(,n,x,y,z,);
else if(z==)
{ printf("%d\n",query1(,n,x,y,));
}
else
printf("%d\n",query2(,n,x,y,));
}
}
return ;
}

HDU 3397 Sequence operation的更多相关文章

  1. HDU 3397 Sequence operation(线段树)

    HDU 3397 Sequence operation 题目链接 题意:给定一个01序列,有5种操作 0 a b [a.b]区间置为0 1 a b [a,b]区间置为1 2 a b [a,b]区间0变 ...

  2. hdu 3397 Sequence operation(很有意思的线段树题)

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  3. hdu 3397 Sequence operation(线段树:区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给你一个长度为n的0,1序列,支持下列五种操作, 操作0(0 a b):将a到b这个区间的 ...

  4. hdu 3397 Sequence operation (线段树 区间合并 多重标记)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意: 给你一串01串,有5种操作 0. 区间全部变为0 1.区间全部变为1 2.区间异或 3.询问 ...

  5. HDU 3397 Sequence operation(区间合并 + 区间更新)

    题目链接:pid=3397">http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给定n个数,由0,1构成.共同拥有5种操作. 每一个操 ...

  6. (简单) HDU 3397 Sequence operation,线段树+区间合并。

    Problem Description lxhgww got a sequence contains n characters which are all '0's or '1's. We have ...

  7. HDU 3397 Sequence operation (区间合并,操作比较多)

    费了我一天半的时间,到处debug,后来才发现,主要是建树的时候只在叶子节点对lazy1和lazy2进行初始化了,父节点都没初始化...晕. 具体见代码吧. #include <iostream ...

  8. hdu 3397 Sequence operation 线段树

    题目链接 给出n个数, 每个数是0或1, 给5种操作, 区间变为1, 区间变为0, 区间0,1翻转, 询问区间内1的个数, 询问区间内最长连续1的个数. 需要将数组开成二维的, 然后区间0, 1翻转只 ...

  9. 【线段树】HDU 3397 Sequence operation 区间合并

    操作 Change operations: 0 a b change all characters into '0's in [a , b] 1 a b change all characters i ...

随机推荐

  1. js_css_dl.dt实现列表展开、折叠效果

    第一种方式:不提倡 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  2. BJFU 1057

    描述 斐波那契额数列,我们都知道.现在qingyezhu想求斐波那契的某项值对2的某次方的结果.你可以帮一下他吗?他好可怜哦!计算了N的N次方次都错了,也挨了ben大哥的N的N次方次的训了.我想你是个 ...

  3. BJFU 1068

    描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结 ...

  4. js 格式化数字保留2位小数

    function toDecimal2(x) { var f = parseFloat(x); if (isNaN(f)) { return false; } var f = Math.round(x ...

  5. android 加载大图片

    引用:http://my.eoe.cn/littlebirds/archive/4646.html 尽量不要使用setImageBitmap或setImageResource或BitmapFactor ...

  6. Boadload和Image$$??$$Limit含义

    Bootloader 即引导加载程序,是系统加电后运行的第一段软件代码.简单的说它们都是bootloader,所完成的任务也大同小异. 熟悉x86体系结构的朋友肯定知道,x86平台上bootloade ...

  7. cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element ‘dubbo:application’. – schema_reference.4: Failed to read schema document

    解决办法: 1.直接百度下载一个dubbo.xsd文件 2.myeclispe-->window-->preferences-->xml catalog-->add 完美解决!

  8. JAVA下的Thread.sleep方法一定要try

    try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } 不同于C#,JAVA里的Thre ...

  9. SqlCommandBuilder的讨论

    之前也看过别人的解释,总感觉解释的不太理想,当然我自己的解释我尽量解释理想点,SqlCommandBuilder 是提供给外界对数据库的反操作的,如果只是对数据库的一个提取的话,那么用下面的代码足以 ...

  10. 用andtoid studio获取天气数据并解析适配

    1.申请拿到数据 可以用“聚合数据” 2.在android studio中导入需要的jar包 复制—>app—>libs—>粘贴—>右击—>Add As Library… ...