HDU 3397 Sequence operation

题目链接

题意:给定一个01序列,有5种操作
0 a b [a.b]区间置为0
1 a b [a,b]区间置为1
2 a b [a,b]区间0变成1,1变成0
3 a b 查询[a,b]区间1的个数
4 a b 查询[a,b]区间连续1最长的长度

思路:线段树线段合并。须要两个延迟标记一个置为01,一个翻转,然后因为4操作,须要记录左边最长0、1。右边最长0、1,区间最长0、1,然后区间合并去搞就可以

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;#define lson(x) ((x<<1)+1)
#define rson(x) ((x<<1)+2)
const int N = 100005;int t, n, m;struct Node {int l, r, sum[3][2], num;int setv, flip;Node() {setv = -1;flip = 0;}int size() {return r - l + 1;}void gao1(int v) {setv = v;num = v * (r - l + 1);for (int i = 0; i < 3; i++) {sum[i][v] = r - l + 1;sum[i][!v] = 0;}flip = 0;}void gao2() {flip ^= 1;for (int i = 0; i < 3; i++)swap(sum[i][0], sum[i][1]);num = r - l + 1 - num;}
} node[N * 4];Node merge(Node lson, Node rson) {Node x;x.l = lson.l; x.r = rson.r;for (int i = 0; i < 2; i++) {x.sum[0][i] = lson.sum[0][i];x.sum[1][i] = rson.sum[1][i];x.sum[2][i] = max(lson.sum[2][i], rson.sum[2][i]);if (lson.sum[0][i] == lson.size())x.sum[0][i] += rson.sum[0][i];if (rson.sum[1][i] == rson.size())x.sum[1][i] += lson.sum[1][i];x.sum[2][i] = max(x.sum[2][i], lson.sum[1][i] + rson.sum[0][i]);}x.num = lson.num + rson.num;return x;
}void pushup(int x) {node[x] = merge(node[lson(x)], node[rson(x)]);
}void pushdown(int x) {if (node[x].setv != -1) {node[lson(x)].gao1(node[x].setv);node[rson(x)].gao1(node[x].setv);node[x].setv = -1;}if (node[x].flip) {node[lson(x)].gao2();node[rson(x)].gao2();node[x].flip = 0;}
}void build(int l, int r, int x = 0) {node[x].l = l; node[x].r = r;node[x].setv = -1; node[x].flip = 0;if (l == r) {int tmp;scanf("%d", &tmp);for (int i = 0; i < 3; i++) {node[x].sum[i][tmp] = 1;node[x].sum[i][!tmp] = 0;}node[x].num = tmp;return;}int mid = (l + r) / 2;build(l, mid, lson(x));build(mid + 1, r, rson(x));pushup(x);
}void add(int l, int r, int v, int x = 0) {if (node[x].l >= l && node[x].r <= r) {if (v == 2) node[x].gao2();else node[x].gao1(v);return;}int mid = (node[x].l + node[x].r) / 2;pushdown(x);if (l <= mid) add(l, r, v, lson(x));if (r > mid) add(l, r, v, rson(x));pushup(x);
}Node query(int l, int r, int x = 0) {if (node[x].l >= l && node[x].r <= r)return node[x];int mid = (node[x].l + node[x].r) / 2;pushdown(x);Node ans;if (l <= mid && r > mid) ans = merge(query(l, r, lson(x)), query(l, r, rson(x)));else if (l <= mid) ans = query(l, r, lson(x));else if (r > mid) ans = query(l, r, rson(x));pushup(x);return ans;
}int main() {scanf("%d", &t);while (t--) {scanf("%d%d", &n, &m);build(0, n - 1);int op, a, b;while (m--) {scanf("%d%d%d", &op, &a, &b);if (op <= 2) add(a, b, op);else if (op == 3) printf("%d\n", query(a, b).num);else if (op == 4) printf("%d\n", query(a, b).sum[2][1]);}}return 0;
}

HDU 3397 Sequence operation(线段树)相关推荐

  1. hdu 3397 Sequence operation(线段树,lazy,区间合并)

    hdu 3397 Sequence operation 线段树lazy和区间合并结合的一个题,相当于几个题集中到一起嘛,分开想就好了 0,1,2操作都要lazy,2的异或操作找到每一只含1或只含0的区 ...

  2. HDU - 3397 Sequence operation(线段树+区间合并)

    题目链接:点击查看 题目大意:给定一个初始的数列,然后依次进行m次操作: 0 a b:将闭区间[a,b]内的点都变为0 1 a b:将闭区间[a,b]内的点都变为1 2 a b:将闭区间[a,b]内的 ...

  3. HDU 3397 Sequence operation 线段树 成段更新 区间合并

    比较综合的题. 两个标记  setv,xorr.setv的优先级高于xorr,当一个节点获得一个setv时,他之前的xorr要清除. //#pragma comment(linker, "/ ...

  4. 【线段树】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 ...

  5. HDU 3397 Sequence operation(线段树区间合并)

    题意: 0 a b将区间[a,b]所有数全部变成0 1 a b将区间[a,b]所有数全部变成1 2 a b将区间[a,b]中所有数0 1互换,0变1,1变0 3 a b输出区间[a,b]中1的个数 4 ...

  6. HDU 3397 Sequence operation

    裸线段树区间合并,题目本身不难,就是细节处理比较麻烦. 因为涉及到异或运算,所以连续0和连续1的个数都要记录一下. 操作的懒惰标记我只用了一个flag,注意flag更新时的细节,我分了三种情况: fl ...

  7. HDU 4893 - Wow! Such Sequence!(线段树)

    题意:给定 n 个数的序列(1 <= n <= 100000,且初始均为 0),m 个操作(1 <= m <= 100000),操作共分三种: 1.将第 k 个数加 d: 2. ...

  8. HDU - 5919 Sequence II——主席树+区间种类++逆序建树

    [题目描述] HDU - 5919 Sequence II [题目分析] 题目给定一个数组,每次查询一个区间,找出区间内不同数字的个数x,然后输出按出现顺序第x/2向上取整个数字的位置. 按照要求,我 ...

  9. CodeForces 438D - The Child and Sequence(线段树)

    At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at ...

最新文章

  1. 解决PLSQL Developer 9连接oracle10g出现乱码
  2. springside3.3.4部署小结
  3. PostgreSQL数据库服务端监听设置及客户端连接方法教程
  4. 使用osql.exe, 将Select的内容保存为文件
  5. JSP页面空指针异常调错办法之weblogic
  6. java中类与对象回顾总结
  7. dw中HTML修改背景图片,dreamweaver将一个图片设定背景,用代码怎么写?
  8. mysql-5.5.38_MySQL-5.5.38通用二进制安装
  9. IOS的Target-action 设计模式
  10. 【Linux】【Services】【Cache】使用Sentinel搭建高可用Redis
  11. 2021浙江高考成绩排名查询,2021年浙江高考成绩排名查询,第一批分数线23日公布...
  12. mysql代码的核心类_mysql源码---核心类 (1)线程类
  13. 王笑京:国家新一代智能交通框架与实施进展
  14. 2018第一发:记一次【Advanced Installer】打包之旅
  15. iOS小技能: 自定义相机(基础知识储备)
  16. 智能车浅谈——抗干扰技术硬件篇
  17. Android 判断是否是刘海屏
  18. Sql Server 生成 Word 文档 表结构
  19. Assemble(王爽)——nasm 和 masm的一些简单区分
  20. 边缘设备、系统及计算杂谈(18)——Meteor JS学习

热门文章

  1. 小学生计算机课学生心得,【小学信息技术学习体会13篇】_小学信息技术学习体会范文大全_2021年小学信息技术学习体会_东城教研...
  2. python中openpyxl的使用
  3. dockerfile、docker compose、k8s区别
  4. python语言程序设计 梁勇_计算机二级教程 Python语言程序设计,第9章Python标准库概览...
  5. android 断点续录,android 录音的断点续传
  6. oracle如何获取异常,ORACLE-函数异常处理(EXCEPTION)
  7. Python -- reload 函数
  8. 基于XML使用MyBatis
  9. 2017.9.9 传送带 失败总结
  10. 2017.9.9 幸运数字 失败总结