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变成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(线段树)相关推荐
- hdu 3397 Sequence operation(线段树,lazy,区间合并)
hdu 3397 Sequence operation 线段树lazy和区间合并结合的一个题,相当于几个题集中到一起嘛,分开想就好了 0,1,2操作都要lazy,2的异或操作找到每一只含1或只含0的区 ...
- HDU - 3397 Sequence operation(线段树+区间合并)
题目链接:点击查看 题目大意:给定一个初始的数列,然后依次进行m次操作: 0 a b:将闭区间[a,b]内的点都变为0 1 a b:将闭区间[a,b]内的点都变为1 2 a b:将闭区间[a,b]内的 ...
- HDU 3397 Sequence operation 线段树 成段更新 区间合并
比较综合的题. 两个标记 setv,xorr.setv的优先级高于xorr,当一个节点获得一个setv时,他之前的xorr要清除. //#pragma comment(linker, "/ ...
- 【线段树】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 ...
- 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 ...
- HDU 3397 Sequence operation
裸线段树区间合并,题目本身不难,就是细节处理比较麻烦. 因为涉及到异或运算,所以连续0和连续1的个数都要记录一下. 操作的懒惰标记我只用了一个flag,注意flag更新时的细节,我分了三种情况: fl ...
- HDU 4893 - Wow! Such Sequence!(线段树)
题意:给定 n 个数的序列(1 <= n <= 100000,且初始均为 0),m 个操作(1 <= m <= 100000),操作共分三种: 1.将第 k 个数加 d: 2. ...
- HDU - 5919 Sequence II——主席树+区间种类++逆序建树
[题目描述] HDU - 5919 Sequence II [题目分析] 题目给定一个数组,每次查询一个区间,找出区间内不同数字的个数x,然后输出按出现顺序第x/2向上取整个数字的位置. 按照要求,我 ...
- 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 ...
最新文章
- 解决PLSQL Developer 9连接oracle10g出现乱码
- springside3.3.4部署小结
- PostgreSQL数据库服务端监听设置及客户端连接方法教程
- 使用osql.exe, 将Select的内容保存为文件
- JSP页面空指针异常调错办法之weblogic
- java中类与对象回顾总结
- dw中HTML修改背景图片,dreamweaver将一个图片设定背景,用代码怎么写?
- mysql-5.5.38_MySQL-5.5.38通用二进制安装
- IOS的Target-action 设计模式
- 【Linux】【Services】【Cache】使用Sentinel搭建高可用Redis
- 2021浙江高考成绩排名查询,2021年浙江高考成绩排名查询,第一批分数线23日公布...
- mysql代码的核心类_mysql源码---核心类 (1)线程类
- 王笑京:国家新一代智能交通框架与实施进展
- 2018第一发:记一次【Advanced Installer】打包之旅
- iOS小技能: 自定义相机(基础知识储备)
- 智能车浅谈——抗干扰技术硬件篇
- Android 判断是否是刘海屏
- Sql Server 生成 Word 文档 表结构
- Assemble(王爽)——nasm 和 masm的一些简单区分
- 边缘设备、系统及计算杂谈(18)——Meteor JS学习
热门文章
- 小学生计算机课学生心得,【小学信息技术学习体会13篇】_小学信息技术学习体会范文大全_2021年小学信息技术学习体会_东城教研...
- python中openpyxl的使用
- dockerfile、docker compose、k8s区别
- python语言程序设计 梁勇_计算机二级教程 Python语言程序设计,第9章Python标准库概览...
- android 断点续录,android 录音的断点续传
- oracle如何获取异常,ORACLE-函数异常处理(EXCEPTION)
- Python -- reload 函数
- 基于XML使用MyBatis
- 2017.9.9 传送带 失败总结
- 2017.9.9 幸运数字 失败总结