[Contest20180325]序列
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]序列的更多相关文章
- 【夯实PHP基础】UML序列图总结
原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...
- Windows10-UWP中设备序列显示不同XAML的三种方式[3]
阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...
- 软件工程里的UML序列图的概念和总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- BZOJ 1251: 序列终结者 [splay]
1251: 序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3778 Solved: 1583[Submit][Status][Discu ...
- 最长不下降序列nlogn算法
显然n方算法在比赛中是没有什么用的(不会这么容易就过的),所以nlogn的算法尤为重要. 分析: 开2个数组,一个a记原数,f[k]表示长度为f的不下降子序列末尾元素的最小值,tot表示当前已知的最长 ...
- [LeetCode] Sequence Reconstruction 序列重建
Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...
- [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...
- [LeetCode] Repeated DNA Sequences 求重复的DNA序列
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
随机推荐
- WordPress后台edit-tags.php里无限栏目分类实现
在 WordPress 里 http://localhost/wordpress3.6.1/wp-admin/edit-tags.php?taxonomy=category 这个链接可以显示 WP 里 ...
- Join an instance to my AWS Directory Service domain
https://amazonaws-china.com/cn/premiumsupport/knowledge-center/ec2-systems-manager-dx-domain/ https: ...
- 关于GitHub学习的地方,很明了
地址: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
- Switf与OC混合开发流程
看着身边越来越多的小伙伴转入Swift,本人也跟随潮流,转战Swift了~下面是初步写入的一个Swift项目框架. 1.创建项目,这个应该不用说了,语言swift 2.CocoaPods 导入第三方 ...
- [bzoj4515][Sdoi2016]游戏-树链剖分+李超线段树
Brief Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,A ...
- 微信小程序登录流程图
一. 官方登录时序图 官方的登录时序图 二. 简单理解 这里仅按照官方推荐的规范来 0. 前置条件 一共有三端: - 微信小程序客户端 - 第三方服务器端- 微信服务器端 1. 客户端获得code,并 ...
- Logistic函数
Logistic函数(又称sigmoid函数) Logistic函数或Logistic曲线是一种常见的S形函数,它是皮埃尔·弗朗索瓦·韦吕勒在1844或1845年在研究它与人口增长的关系 ...
- Yeelight介绍
1. 介绍 Yeelight是小米生态链中的WiFi智能灯泡,本文介绍它的接入和控制实现: Yeelight使用的是自定义的私有协议,该协议采用了类似SSDP的发现机制和基于JSON的控制命令 2. ...
- linux驱动基础系列--linux rtc子系统
前言 linux驱动子系统太多了,连时钟也搞了个子系统,这导致一般的时钟芯片的驱动也会涉及到至少2个子系统,一个是时钟芯片接口子系统(比如I2c接口的时钟芯片),一个是内核给所有时钟芯片提供的rtc子 ...
- python学习笔记 IO 文件读写
读写文件是最常见的IO操作.python内置了读写文件的函数. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统完成的,现代操作系统不允许普通的程序直接对磁盘进行操作,所以, 读写 ...