Hogura有一个序列$a$,她希望你帮她维护下面的这些操作。

$1\ l\ r\ x$对$l\leq i\leq r$的$a_i$执行$a_i=a_i+x$

$2\ l\ r\ x$对$l\leq i\leq r$的$a_i$执行$a_i=\min\left(a_i,x\right)$。

$3\ l\ r$在$a_{l\cdots r}$中寻找一个子序列$b_{1\cdots k}$,使$\prod\limits_{i=2}^k\binom{b_{i-1}}{b_i}=0$,求出这个$k$的最大值。Hogura认为$k=1$的序列也是满足条件的。

询问就是问是否存在$a_{i-1}\lt a_i$,答案要么就是$1$要么就是区间长度

直接上线段树,假设节点代表的区间是$[l,r]$,每个节点维护$t_0,t_1,lest,rest,minp$

$t_0,t_1$表示赋值标记:$x'=\min(t_0,x)+t_1$,没有标记时应该置$t_0=+\infty,t_1=0$

$lest,rest$分别表示子树中最左和最右的权值

$minp$表示在$i\in[l,r)$中最小的$a_i$使得$a_i\lt a_{i+1}$,如果没有,置为$+\infty$

$\text{pushup}(x)$最简单,只需直接更新,再比较$lson_x.rest$和$rson_x.lest$判断是否要更新$minp$

为了写$\text{pushdown}(x)$,我们先解决这样一个问题,给$x$加上一个标记$(t_0',t_1')$

$lest$和$rest$可直接更新

如果$t_0'\leq minp$,那么置$minp$为$+\infty$(根据$minp$的定义,加上新标记后没有满足这种要求的$a_i$)否则将$minp$加上$t_1'$

$x'=\min\left(t_0',\min\left(t_0,x\right)+t_1\right)+t_1'=\min\left(\min\left(t_0,t_0'-t_1\right),x\right)+t_1+t_1'$

然后就可以写出$\text{pushdown}$了

操作$1$就是打$(+\infty,x)$的标记,操作$2$就是打$(x,0)$的标记,查询直接看对应区间的$minp$

#include<stdio.h>
const int inf=2147483647;
struct seg{
	int l,r,t0,t1,p;
	seg(){l=r=t1=0;p=t0=inf;}
}t[400010];
int a[100010];
int min(int a,int b){return a<b?a:b;}
void gao(int x,int t0,int t1){
	t[x].l=min(t0,t[x].l)+t1;
	t[x].r=min(t0,t[x].r)+t1;
	if(t0<=t[x].p)
		t[x].p=inf;
	else
		t[x].p+=t1;
	t[x].t0=min(t0-t[x].t1,t[x].t0);
	t[x].t1+=t1;
}
seg merge(seg a,seg b){
	seg c;
	c.l=a.l;
	c.r=b.r;
	c.p=min(a.p,b.p);
	if(a.r<b.l)c.p=min(c.p,a.r);
	return c;
}
void pushdown(int x){
	gao(x<<1,t[x].t0,t[x].t1);
	gao(x<<1|1,t[x].t0,t[x].t1);
	t[x].t0=inf;
	t[x].t1=0;
}
void pushup(int x){t[x]=merge(t[x<<1],t[x<<1|1]);}
void build(int l,int r,int x){
	if(l==r){
		t[x].l=t[x].r=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,x<<1);
	build(mid+1,r,x<<1|1);
	pushup(x);
}
void modify(int L,int R,int t0,int t1,int l,int r,int x){
	if(L<=l&&r<=R)return gao(x,t0,t1);
	pushdown(x);
	int mid=(l+r)>>1;
	if(L<=mid)modify(L,R,t0,t1,l,mid,x<<1);
	if(mid<R)modify(L,R,t0,t1,mid+1,r,x<<1|1);
	pushup(x);
}
seg query(int L,int R,int l,int r,int x){
	if(L<=l&&r<=R)return t[x];
	pushdown(x);
	int mid=(l+r)>>1;
	if(R<=mid)return query(L,R,l,mid,x<<1);
	if(mid<L)return query(L,R,mid+1,r,x<<1|1);
	return merge(query(L,R,l,mid,x<<1),query(L,R,mid+1,r,x<<1|1));
}
int main(){
	int n,m,i,x,y,z;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)scanf("%d",a+i);
	build(1,n,1);
	while(m--){
		scanf("%d%d%d",&i,&x,&y);
		if(i!=3)scanf("%d",&z);
		if(i==1)modify(x,y,inf,z,1,n,1);
		if(i==2)modify(x,y,z,0,1,n,1);
		if(i==3)printf("%d\n",query(x,y,1,n,1).p<inf?y-x+1:1);
	}
}

[Contest20180325]序列的更多相关文章

  1. 【夯实PHP基础】UML序列图总结

    原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...

  2. Windows10-UWP中设备序列显示不同XAML的三种方式[3]

    阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...

  3. 软件工程里的UML序列图的概念和总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...

  4. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  5. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  6. 最长不下降序列nlogn算法

    显然n方算法在比赛中是没有什么用的(不会这么容易就过的),所以nlogn的算法尤为重要. 分析: 开2个数组,一个a记原数,f[k]表示长度为f的不下降子序列末尾元素的最小值,tot表示当前已知的最长 ...

  7. [LeetCode] Sequence Reconstruction 序列重建

    Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...

  8. [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

  9. [LeetCode] Repeated DNA Sequences 求重复的DNA序列

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

随机推荐

  1. 从零开始学习MXnet(四)计算图和粗细粒度以及自动求导

    这篇其实跟使用MXnet的关系不大,但对于我们理解深度学习的框架设计还是很有帮助的. 首先还是对promgramming models的一个简单介绍,这个东西实际上是在编译里面经常出现的东西,我们在编 ...

  2. Java中文乱码问题(转)

    解决JSP中文乱码问题 大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着大家,现把JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考.首先了解一下Java中文问题的由来: Ja ...

  3. python异常之with

    1.基本语法 with expression [as target]: with_body 参数说明: expression:是一个需要执行的表达式: target:是一个变量或者元组,存储的是exp ...

  4. 模拟实现jdk动态代理

    实现步骤 1.生成代理类的源代码 2.将源代码保存到磁盘 3.使用JavaCompiler编译源代码生成.class字节码文件 4.使用JavaCompiler编译源代码生成.class字节码文件 5 ...

  5. [BZOJ2453]维护队列|分块

    Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会 ...

  6. [转载]C#用正则表达式 获取网页源代码标签的属性或值

    最近调试程序需要用到获取网页指定标签的属性和值,找到了一个比较好的正则匹配方法,特此备份. [原]C#用正则表达式 获取网页源代码标签的属性或值 整理两个 在C#中,用正则表达式 获取网页源代码标签的 ...

  7. mobius反演讲解

    mobius反演的基本形式为,假设知道函数F(x)=Σf(d) d|x,那么我们可以推出f(x)=Σmiu(d)*F(x/d) d|x,另一基本形式为假设知道函数F(x)=Σf(d) x|d,那么我们 ...

  8. C# MVC 页面面包屑以及相应的权限验证操作

    一.特性类 /// <summary> /// 访问权限控制属性. /// </summary> [AttributeUsage(AttributeTargets.Method ...

  9. javascript批量输入表单

    void((function(){ x=document.getElementsByTagName("a"); y = x[1] y.click() })()) void((fun ...

  10. LCD实验学习笔记(二):head.S

    ARM加电后从0地址开始取指执行. 连接为bin文件时时,连接脚本lcd.lds指定将head.o放在开头,所以head.S就是系统起步的地方. head.S开头就是异常向量定义,0地址就是reset ...