[bzoj1858]序列操作
考虑建立一棵线段树,维护:1.左端点的连续1和;2.右端点的连续1和;3.最长1的连续子序列;4.1的个数;5.将0和1交换后上面的四项;6.懒标记
具体实现中,需要注意细节,可以看代码(比较短)

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 struct ji{
8 int sum,ls,rs,ans;
9 }f0[N<<2],f1[N<<2];
10 int n,m,p,x,y,laz[N<<2];
11 ji merge(ji x,ji y){
12 if (x.sum<0)return y;
13 if (y.sum<0)return x;
14 ji z;
15 z.sum=x.sum+y.sum;
16 z.ls=x.ls+((x.ls==x.sum)&&(x.rs==x.sum)&&(x.sum))*y.ls;
17 z.rs=y.rs+((y.rs==y.sum)&&(y.ls==y.sum)&&(y.sum))*x.rs;
18 z.ans=max(max(x.ans,y.ans),x.rs+y.ls);
19 return z;
20 }
21 int merge(int x,int y){
22 if ((x<0)||(y<0))return x+y+1;
23 if ((x==2)&&(y==2))return -1;
24 if (x==2)return y^1;
25 return x;
26 }
27 void upd(int k,int l,int r,int x){
28 if (x<0)return;
29 if (x<2){
30 laz[k]=x;
31 f0[k].sum=f0[k].ls=f0[k].rs=f0[k].ans=(x^1)*(r-l+1);
32 f1[k].sum=f1[k].ls=f1[k].rs=f1[k].ans=x*(r-l+1);
33 return;
34 }
35 swap(f0[k],f1[k]);
36 if (laz[k]<0)laz[k]=2;
37 else
38 if (laz[k]>1)laz[k]=-1;
39 else laz[k]^=1;
40 }
41 void up(int k,int l,int r){
42 f0[k]=merge(f0[L],f0[R]);
43 f1[k]=merge(f1[L],f1[R]);
44 upd(k,l,r,-1);
45 }
46 void down(int k,int l,int r){
47 if (laz[k]<0)return;
48 upd(L,l,mid,laz[k]);
49 upd(R,mid+1,r,laz[k]);
50 laz[k]=-1;
51 }
52 void update(int k,int l,int r,int x,int y,int z){
53 if ((l>y)||(x>r))return;
54 if ((x<=l)&&(r<=y)){
55 upd(k,l,r,z);
56 return;
57 }
58 down(k,l,r);
59 update(L,l,mid,x,y,z);
60 update(R,mid+1,r,x,y,z);
61 up(k,l,r);
62 }
63 ji query(int k,int l,int r,int x,int y){
64 if ((l>y)||(x>r))return ji{-1,0,0,0};
65 if ((x<=l)&&(r<=y))return f1[k];
66 down(k,l,r);
67 return merge(query(L,l,mid,x,y),query(R,mid+1,r,x,y));
68 }
69 int main(){
70 scanf("%d%d",&n,&m);
71 for(int i=1;i<=n;i++){
72 scanf("%d",&x);
73 update(1,1,n,i,i,x);
74 }
75 for(int i=1;i<=m;i++){
76 scanf("%d%d%d",&p,&x,&y);
77 x++,y++;
78 if (p<3)update(1,1,n,x,y,p);
79 else{
80 ji o=query(1,1,n,x,y);
81 if (p==3)printf("%d\n",o.sum);
82 if (p==4)printf("%d\n",o.ans);
83 }
84 }
85 }
[bzoj1858]序列操作的更多相关文章
- scoi2010&&bzoj1858序列操作
[题目描述] lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a ...
- 【BZOJ1858】序列操作(线段树)
[BZOJ1858]序列操作(线段树) 题面 BZOJ 题解 这题思路很简单,细节很烦,很码 维护区间翻转和区间赋值标记 当打到区间赋值标记时直接覆盖掉翻转标记 下放标记的时候先放赋值标记再放翻转标记 ...
- 【BZOJ-1858】序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1961 Solved: 991[Submit][Status ...
- bzoj1858[Scoi2010]序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 3079 Solved: 1475[Submit][Statu ...
- BZOJ1858 [Scoi2010]序列操作(线段树)
题目链接 [Scoi2010]序列操作 考验代码能力的一道好题. 思想还是很简单的(直接上线段树),但是比较难写. #include <bits/stdc++.h> using names ...
- Python通用序列操作
1.序列概览 1.数据结构 序列.容器 Python中最基本的数据结构是序列,其有索引(从左到右第一个索引为0,从右到左第一个索引为-1). Python包含6中内建的序列: 列表 元组 字符串 Un ...
- 【BZOJ-2962】序列操作 线段树 + 区间卷积
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 678 Solved: 246[Submit][Status][Discuss] ...
- bzoj 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...
- BZOJ 1858: [Scoi2010]序列操作( 线段树 )
略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...
随机推荐
- Java(32)File类的介绍
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228444.html 博客主页:https://www.cnblogs.com/testero ...
- Java:String对象小记
Java:String对象小记 对 Java 中的 String 对象,做一个微不足道的小小小小记 字节和字符的区别 字节 byte: 一个字节包含8个位(bit),因此byte的取值范围为-128~ ...
- [no_code]OCR表格处理——技术规格说明书
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 技术规格说明书 我们在这个课程的目标是 远程协同工作,采用最新技术开发软件 这个作业在哪个具体方面 ...
- spring session实现session统一管理(jdbc实现)
最近在看一些关于spring session 的知识,特做一个笔记记录一下. 在项目中经常会遇到这么一种情况,同一个web项目有时需要部署多份,然后使用nginx实现负载均衡,那么遇到的问题就是,部署 ...
- NOIP模拟84(多校17)
T1 宝藏 解题思路 考场上一眼出 \(nlog^2\) 做法,然后没看见是 1s 3e5 的数据,我竟然以为自己切了?? 考完之后尝试着把二分改为指针的移动,然后就过了??或许是数据水吧,感觉自己的 ...
- 震惊,hzoi的分差竟然折磨大,活到爆!
众所周知,hzoi的分差非常"大",那么究竟有多大呢?最近,一位外国小哥开发出了hzoi的分差竟然折磨大,活到爆!的方法,这究竟是怎么一回事呢?快和小编一起来看看吧- 竟然1分就可 ...
- 安装hexo博客
前言 ** 跟着步骤一步一步来进行安装 ** 准备环境:node.js和包管理器npm 1:查看包文件 接着安装 淘宝镜像源 sudo这个需要添加获取文件夹访问权限 sudo npm install ...
- 从零开始的DIY智能家居 - 基于 ESP32 的智能浇水器
前言 上次 土壤湿度传感器 完成之后,就立下一个 flag 要搭建一个智慧浇水的智能场景,现在终于有时间填坑了!(o゚▽゚)o 智慧浇水场景的核心设备有三个: 检测土壤状态的:土壤湿度传感器 通过这个 ...
- DH密钥交换
DH密钥交换 密模运算 所谓幂模,就是先做一次幂运算,再做一次模运算. 模运算有以下性质: 也就是说,先模再乘和先乘再模,只要最后都模了同一个模数,结果都是一样. 有了这个性质,我们首先得到幂模运算的 ...
- 有关fgetc配合feof逐行读取文件最后一行读取两遍的错觉?
最近在做一个wifiap设置的接口,用户首先获取到当前wifi 热点的ssid 和pwd,然后修改,保存. 获取信息的时候是fopen对应的hostapd.conf文件,逐行读取,查找匹配的参数. 修 ...