HDU 3397 线段树 双懒惰标记

这个是去年遗留历史问题,之前思路混乱,搞了好多发都是WA,就没做了

自从上次做了大白书上那个双重懒惰标记的题目,做这个就思路很清晰了

跟上次大白上那个差不多,这个也是有一个sets标记,代表这个区间全部置为0或者1,没有置位的时候为-1

还有个rev标记,代表翻转操作,0代表当前不翻,1代表当前翻

要注意一下优先级,发现有不同的弄法,我是这个弄得,有set操作的时候,set标记设值,并把当前节点的rev标记设为0,因为不管要不要rev,当前set操作肯定直接覆盖了

rev操作不改变set操作,在pushdown的时候,先考虑set标记再弄rev标记,这也是很好理解的,因为一旦rev和set共存,肯定是rev在set后面。

有几个细节要注意一下,一开始行云流水一气呵成,发现还是WA了,就是这几个地方,

1.除了set的时候强制给rev弄成0,其他任何时候对rev标记操作都是^1,取反,这个也很好理解,之前在pushdown里面我就是直接传值,肯定不对嘛

2.在pushdown里面的set下传操作也要记得把子树的rev标记抹除,一开始只在主修改函数里写了,这里没写,WA的不明不白,理由跟上面的一样

然后就基本上没问题了

#include <iostream>
#include <cstdio>
#include <cstring>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
using namespace std;
const int N=100000+10;
int d[N*3],maxc[N*3],lc[N*3],rc[N*3],maxc0[N*3],lc0[N*3],rc0[N*3];
int sets[N*3],rev[N*3];
int n,Q;
int A[N];
void up(int rt,int l,int r)
{int mid=(l+r)>>1;d[rt]=d[rt<<1]+d[rt<<1|1];maxc[rt]=max(maxc[rt<<1],maxc[rt<<1|1]);maxc[rt]=max(maxc[rt],lc[rt<<1|1]+rc[rt<<1]);lc[rt]=lc[rt<<1];rc[rt]=rc[rt<<1|1];if (lc[rt<<1]==mid-l+1) lc[rt]+=lc[rt<<1|1];if (rc[rt<<1|1]==r-mid) rc[rt]+=rc[rt<<1];maxc0[rt]=max(maxc0[rt<<1],maxc0[rt<<1|1]);maxc0[rt]=max(maxc0[rt],lc0[rt<<1|1]+rc0[rt<<1]);lc0[rt]=lc0[rt<<1];rc0[rt]=rc0[rt<<1|1];if (lc0[rt<<1]==mid-l+1) lc0[rt]+=lc0[rt<<1|1];if (rc0[rt<<1|1]==r-mid) rc0[rt]+=rc0[rt<<1];
}
void build(int rt,int l,int r)
{sets[rt]=-1;rev[rt]=0;if (l>=r){d[rt]=maxc[rt]=A[l];lc[rt]=rc[rt]=A[l];lc0[rt]=rc0[rt]=maxc0[rt]=1-A[l];return;}int mid=(l+r)>>1;build(lson);build(rson);up(rt,l,r);
}
void pushdown(int rt,int l,int r)
{if (l>=r) return;int mid=(l+r)>>1;if (sets[rt]>=0){maxc[rt<<1]=lc[rt<<1]=rc[rt<<1]=d[rt<<1]=(mid-l+1)*sets[rt];maxc[rt<<1|1]=lc[rt<<1|1]=rc[rt<<1|1]=d[rt<<1|1]=(r-mid)*sets[rt];maxc0[rt<<1]=lc0[rt<<1]=rc0[rt<<1]=(mid-l+1)*(1-sets[rt]);maxc0[rt<<1|1]=lc0[rt<<1|1]=rc0[rt<<1|1]=(r-mid)*(1-sets[rt]);sets[rt<<1]=sets[rt<<1|1]=sets[rt];rev[rt<<1]=rev[rt<<1|1]=0;sets[rt]=-1;}if (rev[rt]>0){d[rt<<1]=(mid-l+1)-d[rt<<1];d[rt<<1|1]=(r-mid)-d[rt<<1|1];int t1,t2,t3;t1=maxc[rt<<1];t2=lc[rt<<1];t3=rc[rt<<1];maxc[rt<<1]=maxc0[rt<<1];lc[rt<<1]=lc0[rt<<1];rc[rt<<1]=rc0[rt<<1];maxc0[rt<<1]=t1;lc0[rt<<1]=t2;rc0[rt<<1]=t3;t1=maxc[rt<<1|1];t2=lc[rt<<1|1];t3=rc[rt<<1|1];maxc[rt<<1|1]=maxc0[rt<<1|1];lc[rt<<1|1]=lc0[rt<<1|1];rc[rt<<1|1]=rc0[rt<<1|1];maxc0[rt<<1|1]=t1;lc0[rt<<1|1]=t2;rc0[rt<<1|1]=t3;rev[rt<<1]^=1;rev[rt<<1|1]^=1;rev[rt]=0;}
}
void change(int val,int L,int R,int rt,int l,int r)
{if (L<=l && r<=R){d[rt]=(r-l+1)*val;lc[rt]=rc[rt]=(r-l+1)*val;maxc[rt]=(r-l+1)*val;lc0[rt]=rc0[rt]=maxc0[rt]=(r-l+1)*(1-val);sets[rt]=val;rev[rt]=0;return;}pushdown(rt,l,r);int mid=(l+r)>>1;if (L>mid) change(val,L,R,rson);elseif (R<=mid) change(val,L,R,lson);else{change(val,L,R,rson);change(val,L,R,lson);}up(rt,l,r);
}
void revers(int L,int R,int rt,int l,int r)
{if (L<=l && r<=R){d[rt]=(r-l+1)-d[rt];int t1,t2,t3;t1=maxc[rt];t2=lc[rt];t3=rc[rt];maxc[rt]=maxc0[rt];lc[rt]=lc0[rt];rc[rt]=rc0[rt];maxc0[rt]=t1;lc0[rt]=t2;rc0[rt]=t3;rev[rt]^=1;return;}pushdown(rt,l,r);int mid=(l+r)>>1;if (R<=mid) revers(L,R,lson);elseif (L>mid) revers(L,R,rson);else{revers(L,R,lson);revers(L,R,rson);}up(rt,l,r);
}
int output(int op,int L,int R,int rt,int l,int r)
{if (L==l && r==R){if (op==3) return d[rt];else  return maxc[rt];}pushdown(rt,l,r);int mid=(l+r)>>1;if (L>mid) return output(op,L,R,rson);elseif (R<=mid) return output(op,L,R,lson);else{int ret1=output(op,L,mid,lson);int ret2=output(op,mid+1,R,rson);if (op==3) return ret1+ret2;else{int ret=max(ret1,ret2);int t1=min(rc[rt<<1],mid-L+1);int t2=min(lc[rt<<1|1],R-mid);ret=max(ret,t1+t2);return ret;}}
}
int main()
{int t,op,a,b;scanf("%d",&t);while (t--){scanf("%d%d",&n,&Q);for (int i=1;i<=n;i++) scanf("%d",&A[i]);build(1,1,n);while (Q--){scanf("%d%d%d",&op,&a,&b);a++;b++;if (op<=1){change(op,a,b,1,1,n);}elseif (op==2){revers(a,b,1,1,n);}else{int ans=output(op,a,b,1,1,n);printf("%d\n",ans);}}}return 0;
}

  

转载于:https://www.cnblogs.com/kkrisen/p/3864311.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql接口可以重载吗_php 到底可不可以重载

展开全部php 作为一种弱类型语言&#xff0c;本身不能像强类型如java &#xff0c;c那样&#xff0c;直接的实现重载。不过可e68a84e8a2ad62616964757a686964616f31333337393539以通过一些方法&#xff0c;间接的实现重载。使用一个统一的函数来实现重载。该方法要使用func_get…

SQL Server :理解数据记录结构

原文:SQL Server &#xff1a;理解数据记录结构在SQL Server &#xff1a;理解数据页结构我们提到每条记录都有7 bytes的系统行开销&#xff0c;那这个7 bytes行开销到底是一个什么样的结构&#xff0c;我们一起来看下。 数据记录存储我们具体的数据&#xff0c;换句话说&#…

京东云擎提供了免费的wordpress一键安装功能了

1. 京东云擎(http://jae.jd.com)提供了免费的个人博客WordPress一键安装功能了&#xff0c;如下图&#xff0c;给开发者分享福利&#xff01; 免费的应用&#xff0c;提供了源码&#xff0c;提供了数据库&#xff1a; 我之前把文章发到首页&#xff0c;遭到了封杀&#xff01;本…

java 对象加密_java.security包实现对象加密

Java原生支持常见的加密算法&#xff0c;例如DES、RSA。随便写点关于Java安全包的东西。Java.security.Provider对象官方的解释是&#xff1a;实现了 Java 安全性的一部分或者全部。provider 可能实现的服务包括&#xff1a;算法(如 DSA、RSA、MD5 或 SHA-1)&#xff0c;密钥的…

ajax请求模拟登录

前台 if (Session["username"] ! null){<div class"login"><span style"width:155px;height:85px;display:inline-block;margin-left:50px;margin-top:25px;text-align:center">(Session["username"]) 您好&#xff01;&…

Distinct源码分析

以前比较两个List数据&#xff0c;筛选出所需要的数据时候&#xff0c;一直套两层for循环来执行。用到去重(Distinct)的时候&#xff0c;这两个需求其实都是一样的&#xff0c;都是需要比较两个集合&#xff0c;查看了下它的源码&#xff0c;里面确实有值得借鉴的地方。 先附上…

python3图片转代码_python3图片转换二进制存入mysql示例代码

python3图片转换二进制存入mysql示例代码发布于 2014-09-29 18:00:01 | 198 次阅读 | 评论: 0 | 来源: 网友投递Python编程语言Python 是一种面向对象、解释型计算机程序设计语言&#xff0c;由Guido van Rossum于1989年底发明&#xff0c;第一个公开发行版发行于1991年。Pytho…

oracle面试题[关于case when的用法]

表中有A B C三列,用SQL语句实现&#xff1a;当A列大于B列时选择A列否则选择B列&#xff0c;当B列大于C列时选择B列否则选择C列declare v_sal number:2000; v_tax number; begin case when v_salv_tax:v_sal*0.03; when v_salv_tax:v_sal*0.04; when v_salv_tax:v_sal*0.05; whe…

Javascript面向对象研究心得

这段时间正好公司项目须要&#xff0c;须要改动fullcalendar日历插件&#xff0c;有机会深入插件源代码。正好利用这个机会&#xff0c;我也大致学习了下面JS的面向对象编程&#xff0c;感觉收获还是比較多的。 所以写了以下这篇文章希望跟大家探讨探讨JS的面向对象&#xff0c…

矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence

题目传送门 1 /*2 题意&#xff1a;加上适当的括号&#xff0c;改变计算顺序使得总的计算次数最少3 矩阵连乘积问题&#xff0c;DP解决&#xff1a;状态转移方程&#xff1a;4 dp[i][j] min (dp[i][k] dp[k1][j] p[i-1] * p[k] * p[j]) (i<k<j)5 s…

md5加密java实现_MD5加密(java实现)

java实现MD5加密:import java.security.MessageDigest;import sun.misc.BASE64Encoder;public class Tools {/** md5加密算法* return:结果为16进制的字符串长度为32位*/public static String getMd5String(String str) throws Exception{StringBuilder md5Code new StringBui…

POJ 1273 Drainage Ditches 最大流

很裸的最大流问题&#xff0c;不过注意会有重边&#xff0c;o(╯□╰)o&#xff0c;被阴了WA了一发 还有就是要用long long #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <stri…

java语言 编译原理_【Java学习】深入分析Java的编译原理

在《Java代码的编译与反编译》中&#xff0c;有过关于Java语言的编译和反编译的介绍。我们可以通过javac命令将Java程序的源代码编译成Java字节码&#xff0c;即我们常说的class文件。这是我们通常意义上理解的编译。但是&#xff0c;字节码并不是机器语言&#xff0c;要想让机…

javaSE_base04_集合框架

四、集合框架1&#xff1a;String类&#xff1a;字符串(重点) (1)多个字符组成的一个序列&#xff0c;叫字符串。 生活中很多数据的描述都采用的是字符串的。而且我们还会对其进行操作。 所以&#xff0c;java就提供了这样的一个类供我们使用。 (2)创建字…

火狐浏览器中打开java_将Firefox浏览器嵌入Java Swing中

小编典典这是一些示例代码import java.awt.Color;import java.awt.Component;import java.awt.Container;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.FileNotFoundException;import java.io.File;imp…

实验 使用 vivado zedboard GPIO 开关 开控制 LED

前面我做了几个实验 都没有用过 开关&#xff0c;这一次用一用 发现 vivado 真的挺方便 所以 使用 vivado 开发 1.建工程 我使用 vivado 2013.4 创建新工程 –》 next –》next 勾选 Do not specify sources at this time //这样跳过后面两个添加文件页面 选择 board –》 ze…

java 最优化_java-多维度求最优解

拿出11条数据//条件每个位置(position)的人数限制每队(team)人数不能超过7人credits的总和在100分之内(包含100)总分(points)最高//位置人数限制position-1 : 1 position-2 : 3-5 position-3 : 1-3 position-4 : 3-5//模拟数据{points credits position team56 9.0 1 t154 9.1 …

polymer web componets 大前端

大前端 东南水乡 一叶小舟拂过水面 船上两位大侠把酒言欢 一位是玉真人 另一位是张真人 两人喝到开心处 变作对联起来 上联 前端研究&#xff0c;研究个屁~ 下联 前端设计&#xff0c;设计个屁~ 横批 前端sb特色 polymer 提供创建自定义和标准dom元素类似的自定义元素功能 可以…

citespace安装如何配置JAVA_citespace超详细安装教程

想用citespace写篇量化的文献综述但是试了很多次一直运行不了&#xff0c;无奈因为要分析的论文太多&#xff0c;只能继续学着下载……在踩了很多坑之后终于搞定了&#xff01;&#xff01;我参考了知乎大神们写的学习指南&#xff0c;但在下载过程中还是会遇到一点点小问题&am…

Ubuntu下安装配置JDK

第一步&#xff1a;下载jdk-7-linux-i586.tar.gz wget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586.tar.gz 若失败&#xff0c;则自行下载即可。 第二步&#xff1a;解压安装 sudo tar zxvf ./jdk-7-linux-i586.tar.gz -C /usr/lib/jvm cd /usr/lib/…