题目链接

一 核心:

f(x)=91 (x<=100)

f(x)=x-10 (x>100)

那么同一区间就可能不同的操作,那么该怎么解决呢?

我门直到同一区间的数据属于同一类别的时候再进行懒惰标记

区间记录最大值_max  最小值_min(同时应该有两个懒惰标记)

1) 最大值大于100 全部减去10

2)最小值小于等于100 全部变成91

注意懒惰标记的顺序,(2)应该在后面,想一想啊!

二 代码

 /*
f(x)=91 (x<=100)
f(x)=x-10 (x>101)
*/
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt*2
#define rson m+1,r,rt*2+1
const int N=1e5+;
int sum[N*],s[*N],b[*N];
int t1[N*],t2[N*];
int n,q;
void pushup (int rt) {
sum[rt]=sum[rt*]+sum[rt*+];
s[rt]=min (s[rt*],s[rt*+]);
b[rt]=max (b[rt*],b[rt*+]);
}
void cover (int r1,int r2,int k) {
t1[r2]+=t1[r1];
sum[r2]-=k**t1[r1];
s[r2]-=*t1[r1]; b[r2]-=*t1[r1];
}
void c2 (int r1,int r2,int k) {
t2[r2]=;
sum[r2]=*k;
s[r2]=b[r2]=;
}
void pushdown (int rt,int l,int r) {
int m=(l+r)/;
if (t1[rt]) {
cover (rt,rt*,m-l+);
cover (rt,rt*+,r-m);
t1[rt]=;
}
if (t2[rt]) {
c2 (rt,rt*,m-l+);
c2 (rt,rt*+,r-m);
t2[rt]=;
}
return ;
}
void build (int l,int r,int rt) {
if (l==r) {
scanf ("%d",&sum[rt]);
s[rt]=b[rt]=sum[rt];
return ;
}
int m=(l+r)/;
build (lson);
build (rson);
pushup(rt);
return ;
}
void update (int L,int R,int l,int r,int rt) {
if (l>R||r<L) return ;
if (l>=L&&r<=R&&(s[rt]>||b[rt]<=)) {
if (s[rt]>) {
sum[rt]-=(r-l+)*;
s[rt]-=; b[rt]-=;
t1[rt]++;
}
else if (b[rt]<=) {
sum[rt]=(r-l+)*;
s[rt]=b[rt]=;
t2[rt]=;
}
return ;
}
int m=(l+r)/;
pushdown (rt,l,r);
update (L,R,lson);
update (L,R,rson);
pushup (rt);
}
int query (int L,int R,int l,int r,int rt) {
if (r<L||l>R) return ;
if (l>=L&&r<=R) return sum[rt];
int m=(l+r)/;
pushdown (rt,l,r);
return query (L,R,lson)+query (L,R,rson);
}
int main ()
{
while (~scanf ("%d",&n)) {
memset (t1,,sizeof(t1 ));
memset (t2,,sizeof(t2));
build (,n,);
scanf ("%d",&q);
for (int i=;i<=q;i++) {
int op,l,r;
scanf ("%d %d %d",&op,&l,&r);
if (op==) printf ("%d\n",query(l,r,,n,));
else update (l,r,,n,);
}
}
return ;
}

xdoj-1279(有趣的线段树--吉司机?!)的更多相关文章

  1. bzoj4695 最假女选手(势能线段树/吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)给一个区间\([L,R]\) 加上一个数\(x\) \(2.\)把一个区间\([L,R]\) 里小于\(x\) 的数变成\(x\) \(3.\ ...

  2. 有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)

    线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来, ...

  3. HDU - 5306 Gorgeous Sequence (吉司机线段树)

    题目链接 吉司机线段树裸题... #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3 ...

  4. UVALive - 4108 SKYLINE (吉司机线段树)

    题目链接 题意:在一条直线上依次建造n座建筑物,每座建筑物建造完成后询问它在多长的部分是最高的. 比较好想的方法是用线段树分别维护每个区间的最小值mi和最大值mx,当建造一座高度为x的建筑物时,若mi ...

  5. BZOJ4355: Play with sequence(吉司机线段树)

    题意 题目链接 Sol 传说中的吉司机线段树??感觉和BZOJ冒险那题差不多,就是强行剪枝... 这题最坑的地方在于对于操作1,$C >= 0$, 操作2中需要对0取max,$a[i] > ...

  6. bzoj4355 Play with sequence(吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 赋值为\(x\) \(2.\)区间\([L,R]\) 赋值为\(max(a[i] + x, 0)\) \(3.\)区间 ...

  7. bzoj5312 冒险(吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 按位与\(x\) \(2.\)区间\([L,R]\) 按位或\(x\) \(3.\)区间\([L,R]\) 询问最大值 ...

  8. HDU - 6315 吉司机线段树

    题意:给出a,b数组,区间上两种操作,给\(a[L,R]\)+1s,或者求\(\sum_{i=l}^{r}a_i/b_i\) 一看就知道是吉司机乱搞型线段树(低配版),暴力剪枝就好 维护区间a的最大值 ...

  9. 【BZOJ-4127】Abs 树链剖分 + 线段树 (有趣的姿势)

    4127: Abs Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 381  Solved: 132[Submit][Status][Discuss] ...

随机推荐

  1. 整合elk(1)(十二)

    elk 简介 Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等. Logstash是 ...

  2. vm安装diagram

        xxx1234ZZ   xxx1234ZZ@    

  3. 在用mybatis向MySQL数据库中插入时间时报错:Incorrect datetime value: '' for column '' at row 1

    问题说明:使用的MySQL是5.1.37版本,用的mysql-connector-java-5.0.4.jar版本,在java文件中定义的字段是Date类型,MySQL中定义的字段类型是datetim ...

  4. hash与平衡二叉树的区别

    哈希表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方 https://blog.csdn.net/duan19920101/article/det ...

  5. react router @4 和 vue路由 详解(二)react-router @4用法

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 2.react-router @4用法 a.大概目录      不需要像vue那样麻烦的 ...

  6. 跨域 jsonp 和 CORS 资料

    http://mp.weixin.qq.com/s/iAShnqvsOyV-Xd0Ft7Nl2Q HTML5安全:CORS(跨域资源共享)简介...ie67不要想了... http://www.cnb ...

  7. java唯一ID生成

    有时我们不依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,这时就需要用程序来生成一个唯一的全局ID,然后在数据库事务中同时插入到多章表中实现同步. 在java中有个类工 ...

  8. bzoj4698

    题解: 后缀数组 对所有序列差分一下 公共串的长度+1就是答案了 二分 扫一遍height即可,.. 代码: #include <bits/stdc++.h> using namespac ...

  9. zookeeper集群环境搭建(纯zookeeper)

    1.首先在三台机子上放上zookeeper的解压包,解压. 然后的话zookeeper是依赖于jdk的,那么也应该安装jdk,这里不详细说明了. mv zookeeper-3.4.5 zookeepe ...

  10. JDBC:随机生成车牌号,批量插入数据库

    package InsertTest; /* * 单客户端:批量插入 */ import java.sql.Connection; import java.sql.DriverManager; imp ...