[SCOI2010]序列操作 BZOJ1858 线段树 原创 fish04 2022-05-27 19:49:46 博主文章分类:数据结构 ©著作权 文章标签 #include #define d3 文章分类 后端开发 ©著作权归作者所有:来自51CTO博客作者fish04的原创作品,请联系作者获取转载授权,否则将追究法律责任 题目描述lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作:0 a b 把[a, b]区间内的所有数全变成01 a b 把[a, b]区间内的所有数全变成12 a b 把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,把所有的1变成03 a b 询问[a, b]区间内总共有多少个14 a b 询问[a, b]区间内最多有多少个连续的1对于每一种询问操作,lxhgww都需要给出回答,聪明的程序员们,你们能帮助他吗?输入输出格式输入格式:输入数据第一行包括2个数,n和m,分别表示序列的长度和操作数目第二行包括n个数,表示序列的初始状态接下来m行,每行3个数,op, a, b,(0<=op<=4,0<=a<=b<n)表示对于区间[a, b]执行标号为op的操作输出格式:对于每一个询问操作,输出一行,包括1个数,表示其对应的答案输入输出样例输入样例#1:复制10 10 0 0 0 1 1 0 1 0 1 1 1 0 2 3 0 5 2 2 2 4 0 4 0 3 6 2 3 7 4 2 8 1 0 5 0 5 6 3 3 9输出样例#1: 复制5265说明对于30%的数据,1<=n, m<=1000对于100%的数据,1<=n, m<=100000 很刺激的线段树题目;注意赋值的操作的优先级>翻转的操作;还有很多细节要注意;#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include//#include//#pragma GCC optimize(2)using namespace std;#define maxn 300005#define inf 0x3f3f3f3f#define INF 9999999999#define rdint(x) scanf("%d",&x)#define rdllt(x) scanf("%lld",&x)#define rdult(x) scanf("%lu",&x)#define rdlf(x) scanf("%lf",&x)#define rdstr(x) scanf("%s",x)typedef long long ll;typedef unsigned long long ull;typedef unsigned int U;#define ms(x) memset((x),0,sizeof(x))const long long int mod = 1e9 + 7;#define Mod 1000000000#define sq(x) (x)*(x)#define eps 1e-3typedef pair pii;#define pi acos(-1.0)const int N = 1005;#define REP(i,n) for(int i=0;i<(n);i++)typedef pair pii;inline ll rd() { ll x = 0; char c = getchar(); bool f = false; while (!isdigit(c)) { if (c == '-') f = true; c = getchar(); } while (isdigit(c)) { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); } return f ? -x : x;}ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a%b);}ll sqr(ll x) { return x * x; }/*ll ans;ll exgcd(ll a, ll b, ll &x, ll &y) { if (!b) { x = 1; y = 0; return a; } ans = exgcd(b, a%b, x, y); ll t = x; x = y; y = t - a / b * y; return ans;}*/ll qpow(ll a, ll b, ll c) { ll ans = 1; a = a % c; while (b) { if (b % 2)ans = ans * a%c; b /= 2; a = a * a%c; } return ans;}struct node { int sum; int Lw, Lb;// Lb:区间连续0的最大长度,Lw:连续1的最大长度 int llw, rlw;//llb:区间左端点连续0的最大长度,llw:区间左端点连续1的最大长度; int llb, rlb;// rlb:区间右端点连续0的最大长度;rlw:区间右端点连续1的最大长度 int lazy, rev;// lazy:是否全部变为1/0;rev:翻转标记}tr[maxn<<2];int n, m;#define lson (rt<<1)#define rson (rt<<1|1)#define mid ((l+r)>>1)void pushup(int l, int r, int rt) { tr[rt].sum = tr[lson].sum + tr[rson].sum; tr[rt].Lb = max(tr[lson].Lb, tr[rson].Lb); tr[rt].Lw = max(tr[lson].Lw, tr[rson].Lw); tr[rt].llb = tr[lson].llb; tr[rt].llw = tr[lson].llw; if (tr[lson].llw == mid - l + 1)tr[rt].llw += tr[rson].llw; if (tr[lson].llb == mid - l + 1)tr[rt].llb += tr[rson].llb; tr[rt].rlb = tr[rson].rlb; tr[rt].rlw = tr[rson].rlw; if (tr[rson].rlb == r - mid)tr[rt].rlb += tr[lson].rlb; if (tr[rson].rlw == r - mid)tr[rt].rlw += tr[lson].rlw; tr[rt].Lw = max(tr[rt].Lw, tr[lson].rlw + tr[rson].llw); tr[rt].Lb = max(tr[rt].Lb, tr[lson].rlb + tr[rson].llb);}void down(int l, int r, int rt) { int lazy = tr[rt].lazy, rev = tr[rt].rev; int L1 = mid - l + 1, L2 = r - mid; tr[rt].lazy = -1; if (lazy == 0) { tr[lson] = node { 0, 0, L1, 0, 0, L1, L1, 0, 0 }; tr[rson] = node{ 0,0,L2,0,0,L2,L2,0,0 }; } else if (lazy == 1) { tr[lson] = node{ L1,L1,0,L1,L1,0,0,1,0 }; tr[rson] = node{ L2,L2,0,L2,L2,0,0,1,0 }; } if (rev) { tr[rt].rev = 0; int sum = tr[lson].sum; int Lw = tr[lson].Lw, Lb = tr[lson].Lb; int llw = tr[lson].llw, llb = tr[lson].llb; int rlw = tr[lson].rlw, rlb = tr[lson].rlb; tr[lson].sum = L1 - sum; tr[lson].Lw = Lb; tr[lson].Lb = Lw; tr[lson].llw = llb; tr[lson].rlw = rlb; tr[lson].llb = llw; tr[lson].rlb = rlw; tr[lson].rev ^= 1; sum = tr[rson].sum; Lw = tr[rson].Lw; Lb = tr[rson].Lb; llw = tr[rson].llw; llb = tr[rson].llb; rlw = tr[rson].rlw; rlb = tr[rson].rlb; tr[rson].sum = L2 - sum; tr[rson].Lw = Lb; tr[rson].Lb = Lw; tr[rson].llw = llb; tr[rson].rlw = rlb; tr[rson].llb = llw; tr[rson].rlb = rlw; tr[rson].rev ^= 1; }}void build(int l, int r, int rt) { tr[rt].lazy = -1; if (l == r) { int x; rdint(x); tr[rt] = node{ x,x,(x ^ 1),x,x,(x ^ 1),(x ^ 1),-1,0 }; return; } build(l, mid, lson); build(mid + 1, r, rson); pushup(l, r, rt);}void upd1(int l, int r, int rt, int L, int R) { if (L <= l && r <= R) { int LL = r - l + 1; tr[rt] = node{ 0,0,LL,0,0,LL,LL,0,0 }; return; } if (l > R || r < L)return; down(l, r, rt); upd1(l, mid, lson, L, R); upd1(mid + 1, r, rson, L, R); pushup(l, r, rt);}void upd2(int l, int r, int rt, int L, int R) { if (L <= l && r <= R) { int LL = r - l + 1; tr[rt] = node{ LL,LL,0,LL,LL,0,0,1,0 }; return; } if (l > R || r < L)return; down(l, r, rt); upd2(l, mid, lson, L, R); upd2(mid + 1, r, rson, L, R); pushup(l, r, rt);}void upd3(int l, int r, int rt, int L, int R) { if (L <= l && r <= R) { int LL = r - l + 1, sum = tr[rt].sum, Lw = tr[rt].Lw, Lb = tr[rt].Lb; int llw = tr[rt].llw, llb = tr[rt].llb; int rlw = tr[rt].rlw, rlb = tr[rt].rlb; tr[rt] = node{ LL - sum,Lb,Lw,llb,rlb,llw,rlw,tr[rt].lazy,(tr[rt].rev ^ 1) }; return; } if (l > R || r < L)return; down(l, r, rt); upd3(l, mid, lson, L, R); upd3(mid + 1, r, rson, L, R); pushup(l, r, rt);}int query1(int l, int r, int rt, int L, int R) { if (L <= l && r <= R)return tr[rt].sum; if (l > R || r < L)return 0; down(l, r, rt); return query1(l, mid, lson, L, R) + query1(mid + 1, r, rson, L, R);}node query2(int l, int r, int rt, int L, int R) { if (L <= l && r <= R)return tr[rt]; if (l > R || r < L)return node{ 0 }; down(l, r, rt); node LL = query2(l, mid, lson, L, R), RR = query2(mid + 1, r, rson, L, R), ans; ans.sum = LL.sum + RR.sum; ans.Lw = max(LL.Lw, RR.Lw); ans.Lb = max(LL.Lb, RR.Lb); ans.llw = LL.llw, ans.rlw = RR.rlw; ans.llb = LL.llb, ans.rlb = RR.rlb; if (LL.llb == mid - l + 1)ans.llb += RR.llb; if (LL.llw == mid - l + 1)ans.llw += RR.llw; if (RR.rlb == r - mid)ans.rlb += LL.rlb; if (RR.rlw == r - mid)ans.rlw += LL.rlw; ans.Lw = max(ans.Lw, LL.rlw + RR.llw); ans.Lb = max(ans.Lb, LL.rlb + RR.llb); return ans;}int main(){ //ios::sync_with_stdio(0); rdint(n); rdint(m); build(1, n, 1); while (m--) { int op, a, b; rdint(op); rdint(a); rdint(b); a++; b++; if (op == 0)upd1(1, n, 1, a, b); if (op == 1)upd2(1, n, 1, a, b); if (op == 2)upd3(1, n, 1, a, b); if (op == 3)cout << query1(1, n, 1, a, b) << endl; if (op == 4)cout << query2(1, n, 1, a, b).Lw << endl; } return 0;} EPFL - Fighting 赞 收藏 评论 分享 举报 上一篇:CF446A DZY Loves Sequences 简单dp 下一篇:A Simple Problem with Integers BZOJ3212 线段树 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 () 最热 最新 相关文章 面试必刷TOP101:39、序列化二叉树 题目请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树等遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 序列化 二叉树 字符串 .NET序列化、反序列化,包含XML、JSON、二进制,反射操作类 .NET序列化、反序列化,包含XML、JSON、二进制(一、)序列化类:JSON用的反射调用;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflection;using System.Runtime.InteropServices;using System 序列化 JSON 反射 AVL树 1、搜索二叉树可能会出现一边树很长另一边树很短的极端情况,这样的话二叉树就会退化,这时我们就引出了AVL树这样的改良版。AVL树会控制两端树的高度差的绝对值小于1。(一般为右数高度减左树高度)2、AVL树会通过平衡因子来控制,因为是右-左,所以插入左边平衡因子--,右边则++3、基本结构:其中_parent是用来找上一节点进行链接控制AVL的行为:其中除了插入函数其余函数与搜索二叉树相似。4、插入 搜索二叉树 父节点 头结点 [SCOI2010]序列操作 BZOJ1858 线段树 [SCOI2010]序列操作 BZOJ1858 线段树 题目描述lxhgww最近收 #include #define d3 BZOJ 1858 [Scoi2010]序列操作 线段树 Descriptionlxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 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 数据 i++ #define BZOJ 1858: [Scoi2010]序列操作 线段树 1858: [Scoi2010]序列操作Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 295 #include 数据 hg BZOJ 1858 SCOI2010 序列操作 线段树 题目大意:给定一个01序列,提供三种操作:0:把一段区间的所有元素都变成01:把一段区间的所有元素都变成12:把一段区间内的所有元素全都取反3:查询一段区间内1的个数4:查询一段区间内最长的一段连续的1首先如果没有操作4这就是bitset的水题。。。多了这个,我们考虑线段树线段树的每一个节点存修改标记和翻转标记,以及该区间的信息虽然查询的信息都是1 但是我们要连0一 BZOJ BZOJ1858 线段树 #define #include bzoj千题计划177:bzoj1858: [Scoi2010]序列操作 http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include git ios php #define SCOI2010 序列操作 2421 序列操作 http://codevs.cn/problem/2421/ 2010年省队选拔赛四川 2421 序列操作 http://codevs.cn/problem/2421/ 2010年省队选拔赛四川 2421 序列操作 http://codevs.cn/problem/2421/ 2 #include 子节点 线段树 数据 i++ 【BZOJ】1854: [Scoi2010]游戏 http://www.lydsy.com/JudgeOnline/problem.php?id=1854题意:n个数据,每个数据有两个属性,要求取一些数据且每个数据取一个属性使得组成连续的一段单调递增的数(从1开始),求最大能连续到多少。(nusing namespace std;const int... OI 并查集 贪心 bzoj 数据 【BZOJ1858】序列操作(SCOI2010)-线段树 测试地址:序列操作做法:这个题是很久以前做的,大概去年8月份吧,但是忘记放博客上了,今天突然想起来补档。这个题虽然很容易看出是用线段树维护,但是要维护的信息太多了......简单整理一下就是:区间内0和1的数量,左端和右端连续0和连续1的长度,区间内最长的连续0和连续... #include i++ ios 线段树 编程题目 BZOJ1858: [Scoi2010]序列操作 1858: [Scoi2010]序列操作Time Limit:10 SecMemory Limit:64 MBSubmit:1068Solved:545[Submit][Status]Descriptionlxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这... Read More splay 线段树 数据 初始状态 区间合并 bzoj1858[Scoi2010]序列操作 题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1858 十分普通的线段树。调了好久…… 记录一下0的信息,在reverse的时候比较方便。 1.把修改和pushdown里要用到的东西都写在一个函数里比较方便。别忘了改标记。 一开始没有把改标记 #include ios php 运算符 i++ bzoj 1858: [Scoi2010]序列操作【线段树】 合并中间那块的时候没取max……WAWAWA 在线段树上维护一堆东西,分别是len区间长度,sm区间内1的个数,ll0区间从左开始最长连续0,ml0区间中间最长连续0,rl0区间从右开始最长连续0,ll1区间从左开始最长连续1,ml1区间中间最长连续1,rl1区间从右开始最长连续1(起始这六个东西可 赋值 #include ios i++ 数组 【BZOJ1858】[SCOI2010] 序列操作(ODT裸题) 给你一个$01$序列,让你支持区间赋值、区间取反、区间求和以及求一段区间内最多有多少连续的$1$这些操作。 ODT #define 区间求和 赋值 c++ [bzoj1858]序列操作 考虑建立一棵线段树,维护:1.左端点的连续1和;2.右端点的连续1和;3.最长1的连续子序列;4.1的个数;5.将0和1交换后上面的四项;6.懒标记具体实现中,需要注意细节,可以看代码(比较短) 1 #include<bits/stdc++.h> 2 using namespace std; 3 # 数据结构-线段树 #define i++ c++ #include P2572 [SCOI2010]序列操作 线段树 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[a,b]区间内的所有数全部取反,也就是说把所有 #define 输入输出 优先级 输出格式 初始状态 Luogu P2572 [SCOI2010] 序列操作(线段树) 题目链接:https://www.luogu.com.cn/problem/P2572 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+11,Tree_Sz=5e5+11; 4 int n,m,a[N]; 5 6 ... #include 5e c++ IT [SCOI2010]序列操作 1858: [Scoi2010]序列操作 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a 线段树 数据 #define i++ 点修改 【[SCOI2010]序列操作】 好颓啊,我竟然来写了一道恶心的板子 旁边的魏佬嘲讽我,还用欺负我 嘤嘤嘤 那就不膜魏佬了 嘤嘤嘤 这是一道无聊的板子 看到这些操作,我们看到这些操作就知道我们需要维护的东西了 首先那个最长的连续的$1$,显然要维护一下左最长,右最长,还是区间最长 由于有非常恶心的取反操作,所以最长的连续$0$也需要 线段树 #define #include ios i++ nfs服务默认端口号 一、NFS服务介绍NFS是 Network File system的缩写分为2.3.4三个版本,2和3由sun公司起草开发,4.0开始netapp公司参与并主导开发NFS数据传输基于RPC协议:应用场景:A,B,C三台机器上需要保证被访问到的文件是一样的,A共享数据出来,B和C分别取挂载A共享的数据目录,从而B和C访问到的数据和A上的一致。NFS原理图:(NFS服务不监听任何端口,但是RPC服务中 nfs服务默认端口号 网络 开发工具 运维 客户端 银河麒麟虚拟化应用 怎么用的 任务背景因公司业务要求,需要将目前公司内k8s部署的java应用的基础镜像又linux的alpine版本替换为银河麒麟系统,即kylinv10。前置准备已从公开渠道获取了精简版镜像 kylin10-x86-sp2-flat-jdk342-limited部署JAVA服务将原有项目中DockerFile内的基础镜像替换 FROM XXXX 替换为麒麟基础镜像问题产生服务启动后,通过kubectl lo 银河麒麟虚拟化应用 怎么用的 kylin java 大数据 linux 进到docker 学习环境基于阿里云CentOS Linux release 7.8.2003 (Core) 文章目录1. Docker概述1.1 Docker是什么?1.2 Docker与Vmware1.3 Docker为什么出现?1.4 Docker能干嘛?2. Docker安装2.1 Docker的基本构成2.2 Docker安装步骤2.3 配置阿里云镜像加速2.4 Docker执行3. Docker常用 进到docker 运维 docker 大数据 linux severless容器和severless区别 serverless是什么Serverless首先是用于描述我们的应用程序是明显或充分地依赖第三方应用或服务来管理服务器端逻辑和状态,这些应用是典型的富客户端应用,比如单页Web应用或移动应用,它们使用基于云可访问的数据库比如Parse或Firebase,还有授权服务比如Auth0AWS Cognito等,这些服务类型之前曾经被描述为后端服务,下面使用Baas这一简称代表后端服务(Backend serverless java 无服务器 Server 服务器 echarts的series的label设置 功能描述如图,没有背景色的柱子(后面简称 “差值柱” ),差值柱本身是不显示 label 的,图中差值柱上方的 label 实际是紫柱的 label。 这个紫柱上方显示和绿柱相比较持平的差值柱是通过将两个柱子叠加完成的。注意差值柱上方的 label 是绑定在差值柱的data中的,这是因为如果我用紫柱的label的话,(数据是动态的)我不好判断具体会差多少,而导致的差值柱的高度我无法得知,就无法保证 ci 点击事件 数据