BZOJ4355: Play with sequence

https://lydsy.com/JudgeOnline/problem.php?id=4355

分析:

  • 模板题。
  • 把\(2\)操作看成先区间加再区间取\(max\)。
  • 查询转化成求最小值个数。
  • 需要维护\(3\)个标记。
  • 这里我比较naive地维护了三个标记,多维护了一个最小值需要加的值。
  • 然后下传的时候对左右儿子判断是否应该下传。
  • 实际上不需要,直接修改最小值即可。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
#define N 1200050
#define ls p<<1
#define rs p<<1|1
typedef long long ll;
const ll inf = 1ll<<60;
int n,m;
ll a[N],mn[N],ci[N],tag1[N],tag2[N],tag3[N];
int cnt[N],len[N];
void giv1(int p,ll v) {tag1[p]=v; tag2[p]=0;tag3[p]=0;mn[p]=v; ci[p]=inf;cnt[p]=len[p];
}
void giv2(int p,ll v) {tag2[p]+=v;mn[p]+=v;ci[p]+=v;
}
void giv3(int p,ll v) {tag3[p]+=v; mn[p]+=v;
}
void pushdown(int p) {if(tag1[p]!=-1) giv1(ls,tag1[p]),giv1(rs,tag1[p]),tag1[p]=-1;if(tag2[p]) giv2(ls,tag2[p]),giv2(rs,tag2[p]),tag2[p]=0;if(tag3[p]) {if(mn[ls]+tag3[p]==mn[p]) giv3(ls,tag3[p]);if(mn[rs]+tag3[p]==mn[p]) giv3(rs,tag3[p]);tag3[p]=0;}
}
void pushup(int p) {mn[p]=min(mn[ls],mn[rs]);if(mn[ls]==mn[rs]) ci[p]=min(ci[ls],ci[rs]),cnt[p]=cnt[ls]+cnt[rs];else {if(mn[ls]<mn[rs]) ci[p]=min(ci[ls],mn[rs]),cnt[p]=cnt[ls];else ci[p]=min(ci[rs],mn[ls]),cnt[p]=cnt[rs];}
}
void build(int l,int r,int p) {tag1[p]=-1;len[p]=r-l+1;if(l==r) {mn[p]=a[l];ci[p]=inf;cnt[p]=1;return ;}int mid=(l+r)>>1;build(l,mid,ls); build(mid+1,r,rs);pushup(p);
}
void updadd(int l,int r,int x,int y,int v,int p) {if(x<=l&&y>=r) {giv2(p,v); return ;     }int mid=(l+r)>>1;pushdown(p);if(x<=mid) updadd(l,mid,x,y,v,ls);if(y>mid) updadd(mid+1,r,x,y,v,rs);pushup(p);
}
void updcov(int l,int r,int x,int y,int v,int p) {if(x<=l&&y>=r) {giv1(p,v); return ;}int mid=(l+r)>>1;pushdown(p);if(x<=mid) updcov(l,mid,x,y,v,ls);if(y>mid) updcov(mid+1,r,x,y,v,rs);pushup(p);
}
void updmax(int l,int r,int x,int y,int p) {if(mn[p]>=0) return ;if(x<=l&&y>=r&&ci[p]>0) {giv3(p,-mn[p]); return ;}if(l==r) {giv1(p,0); return ;}int mid=(l+r)>>1;pushdown(p);if(x<=mid) updmax(l,mid,x,y,ls);if(y>mid) updmax(mid+1,r,x,y,rs);pushup(p);
}
int query(int l,int r,int x,int y,int p) {if(x<=l&&y>=r) return (mn[p]==0)*cnt[p];int mid=(l+r)>>1,re=0;pushdown(p);if(x<=mid) re+=query(l,mid,x,y,ls);if(y>mid) re+=query(mid+1,r,x,y,rs);return re;
}
int main() {scanf("%d%d",&n,&m);int i,opt,x,y,z;for(i=1;i<=n;i++) scanf("%lld",&a[i]);build(1,n,1);while(m--) {scanf("%d%d%d",&opt,&x,&y);if(opt==1) {scanf("%d",&z);updcov(1,n,x,y,z,1);}else if(opt==2) {scanf("%d",&z);updadd(1,n,x,y,z,1);updmax(1,n,x,y,1);}else {printf("%d\n",query(1,n,x,y,1));}}
}

转载于:https://www.cnblogs.com/suika/p/10204775.html

BZOJ4355: Play with sequence相关推荐

  1. [BZOJ4355] Play with sequence(线段树)

    题意 给你一个序列,有三种操作, 111是区间赋值,222是区间加法后区间取对000取maxmaxmax,333是询问区间内000的个数. 首先111操作可以转化为区间加上−inf-inf−inf后取 ...

  2. 2018.07.30 bzoj4355: Play with sequence(线段树)

    传送门 维护区间覆盖成非负数,区间变成max(xi+a,0)max(xi+a,0),询问区间中00的个数. 由于每次操作之后区间中都是非负数,因此相当于只用维护最小值和最小值的个数. 对于将一个区间变 ...

  3. 势能线段树/吉司机线段树-我没有脑子

    势能线段树/吉司机线段树 BZOJ3211 花神游历各国 BZOJ5312 冒险 BZOJ4355 Play with sequence BZOJ4695 最假女选手 \(A_i = max(A_i, ...

  4. Segment Tree Beats 区间最值问题

    Segment Tree Beats 区间最值问题 线段树一类特殊技巧! 引出:CF671C Ultimate Weirdness of an Array 其实是考试题,改题的时候并不会区间取最值,区 ...

  5. 【BZOJ4355】Play with sequence 线段树

    [BZOJ4355]Play with sequence Description 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a ...

  6. 【bzoj4355】Play with sequence 线段树区间最值操作

    题目描述 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C. 2)给出参数U,V,C,对于区间[U,V]里的每个数 ...

  7. Bi-LSTM-CRF for Sequence Labeling

    做了一段时间的Sequence Labeling的工作,发现在NER任务上面,很多论文都采用LSTM-CRFs的结构.CRF在最后一层应用进来可以考虑到概率最大的最优label路径,可以提高指标. 一 ...

  8. Oracle 12C -- 基于sequence的列的默认值

    12C支持先创建一个sequence,然后再将该sequence指定为某个列的值的默认表达式. 和"identity column"具有以下不同点: ·对列的个数没有限制 ·seq ...

  9. DP UVALive 6506 Padovan Sequence

    题目传送门 /*题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + a[ ...

最新文章

  1. iOS NSNotificationCenter详解
  2. C++11强类型枚举,override/final
  3. Python协程--生成器(通过异常来判断生成器已经结束)
  4. Silverlight 中文教程第四部分:使用 Style 元素更好地封装观感 (木野狐译)
  5. 身为前端工程师,对你来说,你认为最重要的是什么?
  6. 搜索引擎的那些事(网页下载)
  7. maven配置(myeclipse版)
  8. 打造最舒适的webview调试环境 1
  9. EnableQ在企业员工满意度调查上的贡献
  10. unity播放视频代码
  11. DTcms Core项目发布到IIS教程
  12. excel建立层级_Power Pivot财务科目(层级深度amp;筛选深度)
  13. 用nodejs搭建代理服务器
  14. iis下屏蔽php notice,apache、iis规则屏蔽拦截蜘蛛抓取
  15. Infor和C3 AI建立战略合作伙伴关系,提供可扩展的企业AI行业应用
  16. BiLSTM文本分类实践
  17. 《关键对话》如何高效能沟通之何谓关键对话
  18. 相亲遇到喜欢的IT男有感
  19. 小米打开或关闭MIUI9开发者选项
  20. 【优化选址】基于人工蜂群算法求解无线网络传感覆盖优化问题含Matlab源码

热门文章

  1. 未来拟投10亿!保乐力加峨眉山威士忌酒厂正式揭幕;欧舒丹收购美国护理品牌约83%间接股权 | 美通社头条...
  2. [淘宝客技术篇006]如何登录阿里妈妈-《登录淘宝网·二维码实现法》(下)
  3. linux怎样通过手机上网,Linux系统通过手机GPRS上网的设置教程
  4. 基于大数据的优质服务 微车将构建汽车互联网新生态
  5. javaWeb登录验证码第一次验证失败,刷新验证码后验证成功问题
  6. 第二次作业助教博客 —— 撰写第三周课程总结及实验报告(一)
  7. 问题 J: 古罗马数字2
  8. JavaSearch搜索引擎
  9. 苹果mac笔记本部分按键失灵怎么办,5连option键即可解决
  10. Excel中最精确的计算年龄的公式