前天晚上的CF比赛div2的E题,很明显一个线段树,当时还在犹豫复杂度的问题,因为他是区间修改和区间查询,肯定是要用到懒惰标记。

然后昨天真的是给这道题跪了,写了好久好久,。。。我本来是写了个add标记作为累加用,因为这个题目很明显是累加型的懒惰标记,但是后来不知道脑子怎么想的,又把add标记给删了,认为只要用一个set标记标注此时该树是否是连续相同的,如果是,则值就存在setv【rt】中,然后就开始了漫长的WA的过程,很明显,我这样是采用了覆盖性的懒惰标记,每次我pushdonw下去 还要先pushdonw下一层的,。。。如果真这么写 绝壁TL,不这么写 肯定WA,。。明显一个累加型的懒惰标记,硬是给我写跪了,其实我后来意识到了要用累加型的,可是就是想沿着这个思路 改好。。最后躺在床上一想,真的只能用累加型的懒惰标记

发现线段树的懒惰标记这一块真的还不熟练,各种容易出错。。。赶紧练

#include <iostream>
#include <cstdio>
#include <cstring>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define LL __int64
using namespace std;
const int N=+;
LL d[N<<],cur[N<<],flag[N<<],add[N<<];
int n,m;
LL abs(LL x){
if (x<) return -x;
return x;
}
void build(int rt,int l,int r)
{
d[rt]=cur[rt]=flag[rt]=add[rt]=;
if (l>=r){
cur[rt]=l;
flag[rt]=;
return;
}
int mid=(l+r)>>;
build(lson);
build(rson);
}
void up(int rt,int l,int r)
{
d[rt]=d[rt<<]+d[rt<<|];
if (flag[rt<<] && flag[rt<<|] && cur[rt<<]==cur[rt<<|]){
cur[rt]=cur[rt<<];
flag[rt]=;
}
else{
flag[rt]=;
}
}
void pushdown(int rt,int l,int r)
{
if (l>=r) return;
int mid=(l+r)>>;
if (add[rt]>){
d[rt<<]+=add[rt]*(mid-l+);
d[rt<<|]+=add[rt]*(r-mid);
add[rt<<]+=add[rt];
add[rt<<|]+=add[rt];
add[rt]=;
}
if (flag[rt]>){
cur[rt<<]=cur[rt<<|]=cur[rt];
flag[rt<<]=flag[rt<<|]=;
}
}
void fix(int L,int R,LL v,int rt,int l,int r)
{
int mid=(l+r)>>;
if (L<=l && r<=R){
if (flag[rt]>){
d[rt]+=abs(v-cur[rt])*(r-l+);
add[rt]+=abs(v-cur[rt]);
cur[rt]=v;
return;
}
}
pushdown(rt,l,r);
if (L<=mid) fix(L,R,v,lson);
if (R>mid) fix(L,R,v,rson);
up(rt,l,r); }
LL query(int L,int R,int rt,int l,int r)
{
//pushdown(rt,l,r);
if (L<=l && r<=R) return d[rt];
int mid=(l+r)>>;
pushdown(rt,l,r);
LL ret1,ret2;
ret1=ret2=;
if (L<=mid) ret1=query(L,R,lson);
if (R>mid) ret2=query(L,R,rson);
return ret1+ret2;
}
int main()
{
int op,a,b;
LL c;
while (scanf("%d%d",&n,&m)!=EOF)
{
build(,,n);
while (m--)
{
scanf("%d",&op);
if (op==){
scanf("%d%d%I64d",&a,&b,&c);
fix(a,b,c,,,n);
}
else{
scanf("%d%d",&a,&b);
LL ans=query(a,b,,,n);
printf("%I64d\n",ans);
}
}
}
return ;
}

Codeforces 444C 线段树 懒惰标记的更多相关文章

  1. Transformation HDU - 4578(线段树——懒惰标记的妙用)

    Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, …, a n. The initial val ...

  2. 【HDU】4092 Nice boat(多校第四场1006) ——线段树 懒惰标记

    Nice boat Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) To ...

  3. CodeForces 444C 线段树

    想分块想了很久一点思路都没有,结果一看都是写的线段树= = ...完全忘记了还有线段树这种操作 题意:给一个数组,一种操作是改变l到r为c,还有一种操作是查询l到r的总和差 线段树记得+lazy标记 ...

  4. DZY Loves Colors CodeForces - 444C (线段树势能分析)

    大意:有$n$个格子, 初始$i$位置的颜色为$i$, 美丽值为0, 有两种操作 将区间$[l,r]$内的元素全部改为$x$, 每个元素的美丽值增加$|x-y|$, $y$为未改动时的值 询问区间$[ ...

  5. hdu-3397 Sequence operation 线段树多种标记

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3397 题目大意: 0 a b表示a-b区间置为0 1 a b表示a-b区间置为1 2 a b表示a- ...

  6. HDU 3468:A Simple Problem with Integers(线段树+延迟标记)

    A Simple Problem with Integers Case Time Limit: 2000MS Description You have N integers, A1, A2, ... ...

  7. Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论

    Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...

  8. Codeforces 1149C - Tree Generator™(线段树+转化+标记维护)

    Codeforces 题目传送门 & 洛谷题目传送门 首先考虑这个所谓的"括号树"与直径的本质是什么.考虑括号树上两点 \(x,y\),我们不妨用一个"DFS&q ...

  9. Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记

    E. A Simple Task time limit per test5 seconds memory limit per test512 megabytes inputstandard input ...

随机推荐

  1. Golang函数-递归函数

    Golang函数-递归函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  2. Linux分发版本的试用及选择工具

    https://www.forbes.com/sites/jasonevangelho/2019/06/15/how-to-test-drive-200-linux-distributions-wit ...

  3. 题解:luogu P1247

    大概没你们说得复杂吧...... \(Part\;1\) \(Nim\)游戏 大家都对异或和感到懵逼吧(排除大佬),其实很简单,用\(SG\)函数打表计算即可解决: 抛个板子: void get_sg ...

  4. 原生JS 实现 dom ready

    记录一下项目技术问题: 记得:放在head标签内的脚本,第一时间执行 var baseTools = { // dom ready ready: function( f ){ var ie = !!( ...

  5. 吴裕雄--天生自然java开发常用类库学习笔记:观察者设计模式

    import java.util.* ; class House extends Observable{ // 表示房子可以被观察 private float price ;// 价钱 public ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-cloud

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. UVA - 11354 Bond(最小生成树+LCA+瓶颈路)

    题意:N个点,M条路,每条路的危险度为路上各段中最大的危险度.多组询问,点s到点t的所有路径中最小的危险度. 分析: 1.首先建个最小生成树,则s到t的路径一定是危险度最小的. 原因:建最小生成树的最 ...

  8. Python练习题3

    1.九九乘法表 li = [1,2,3,4,5,6,7,8,9] for i in li: for j in li: if i >= j: print(i,'*',j,'=',i*j,end=& ...

  9. Oracle SQL触发器

    一.触发器 触发器是一个数据库对象,是一个特殊的过程,当特定的时间发生时隐式地执行.比如在一个表中发生插入.更新或删除的时间,或者 CREATE.ALTER 这样的数据定义语句执行时,触发器会隐式执行 ...

  10. IPv6-isis配置

    ①:ipv6 unicast-routing——开启IPv6路由功能 ②:router isis word——开启ISIS进程 ③:is-type——可以修改路由器ISIS等级 ④:进入接口 ⑤:启用 ...