/*线段树,注意传递参数的写法*/
#include <cstdio>
#include <algorithm>
using namespace std;#define LL long longconst int maxn = 1e5 + 10;LL lazy[maxn<<2];
LL delta[maxn<<2];//代表一个根节点的历史改变量之和,解决一个区间被多次覆盖的问题
LL sum[maxn<<2];//保存答案LL cal(LL x)
{return x<0 ? -x:x;
}void build(int l,int r,int rt)
{if(l==r){lazy[rt]=l;return;}int mid=(l+r)>>1;build(l,mid,rt<<1);build(mid+1,r,rt<<1|1);lazy[rt]=0;
}void clear(int v,int l,int r,int rt)//clear函数清空当前节点的标记,并且更新维护的节点的信息
{if(lazy[rt]>0){delta[rt]+=cal(v-lazy[rt]);sum[rt]+=(r-l+1)*cal(v-lazy[rt]);}else{int mid=(l+r)>>1;clear(v,l,mid,rt<<1);//清空子结点的值并且将子结点的值更新为正确值clear(v,mid+1,r,rt<<1|1);sum[rt]=sum[rt<<1]+sum[rt<<1|1]+delta[rt]*(r-l+1);//根据更新后的子结点的值更新父节点的值}
}void update(int L,int R,int v,int l,int r,int rt)
{if(L<=l&&r<=R){clear(v,l,r,rt);//是为了在这次覆盖之前,重新结算该节点的信息,并维护子结点的信息lazy[rt]=v;return;}if(lazy[rt]>0){lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];}int mid=(l+r)>>1;if(L<=mid)  update(L,R,v,l,mid,rt<<1);if(R>mid)   update(L,R,v,mid+1,r,rt<<1|1);lazy[rt]=0;sum[rt]=sum[rt<<1]+sum[rt<<1|1]+delta[rt]*(r-l+1);
}LL query(int L,int R,int l,int r,int rt)
{if(L<=l&&r<=R){return sum[rt];//只有当节点被覆盖时才直接返回}int mid = (l+r)>>1;if(R<=mid)  return  query(L,R,l,mid,rt<<1)+delta[rt]*(R-L+1);//关键,此时对节点并不更新子结点的值,只是在不断下行的过程中,根据父节点的delta值更新答案if(L>mid)   return query(L,R,mid+1,r,rt<<1|1)+delta[rt]*(R-L+1);return query(L,mid,l,mid,rt<<1)+query(mid+1,R,mid+1,r,rt<<1|1)+delta[rt]*(R-L+1);
}int main()
{int n,m;scanf("%d%d",&n,&m);build(1,n,1);while(m--){int op;scanf("%d",&op);int l,r,x;if(op==1){scanf("%d%d%d",&l,&r,&x);update(l,r,x,1,n,1);}else{scanf("%d%d",&l,&r);printf("%lld\n",query(l,r,1,n,1));}}return 0;
}

444 C DZY Loves Colors相关推荐

  1. CodeForces 444 C DZY Loves Colors

    DZY Loves Colors 题意:有n个蛋糕,起初第i个蛋糕他的颜色值为i, 现在有2个操作, 1 x  y  c 在[x, y]的蛋糕上都加上一层颜色值为c的蛋糕片,加了这个蛋糕片之后,会产生 ...

  2. Codeforces 444 C - DZY Loves Colors

    C - DZY Loves Colors 思路: 分块,复杂度有点玄学,和普通分块不同的是在这个块被一次染色的时候暴力染整个块. 代码: #pragma GCC optimize(2) #pragma ...

  3. Codeforces 444C DZY Loves Colors 线段树区间更新

    // Codeforces 444C DZY Loves Colors 线段树区间更新// 题目链接:// http://codeforces.com/problemset/problem/444/C ...

  4. CodeForces - 444C DZY Loves Colors(线段树+剪枝)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数组 a 和计算贡献的数组 sum,需要执行 m 次操作,每次操作分为下列两种类型: 1 l r x:将区间 [ l , r ] 内的 a 用 x ...

  5. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】

    题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...

  6. Codeforces 444C DZY Loves colors(分块)

    我们维护一个标记表示区间内的数是否全相同即可. 如果全相同很容易算出 a , b a,b a,b 数组需要更新多少,打标记即可. 否则暴力修改. #include <map> #inclu ...

  7. Codeforces Round #FF 446 C. DZY Loves Fibonacci Numbers

    參考:http://www.cnblogs.com/chanme/p/3843859.html 然后我看到在别人的AC的方法里还有这么一种神方法,他预先设定了一个阈值K,当当前的更新操作数j<K ...

  8. Codeforces 447C - DZY Loves Sequences

    447C - DZY Loves Sequences 思路:dp 代码: #include<bits/stdc++.h> using namespace std; #define ll l ...

  9. Codeforces 446C —— DZY Loves Fibonacci Numbers(线段树)

    题目:DZY Loves Fibonacci Numbers 题意比較简单,不解释了. 尽管官方的题解也是用线段树,但还利用了二次剩余. 可是我没有想到二次剩余,然后写了个感觉非常复杂度的线段树,还是 ...

最新文章

  1. 斗地主程序设计c语言,C语言斗地主游戏v0.1
  2. GitLab修改用户密码
  3. idea社区版和企业版区别_IntelliJ IDEA 旗舰版与社区版有什么不同
  4. FPGA 资料搜集记录
  5. [渝粤教育] 中国地质大学 大学英语(2) 复习题
  6. mysql架设_主从mysql架设
  7. 记一次提升18倍的性能优化
  8. Python数据类型解析(基础篇)
  9. python 关闭udp端口_UDP聊天器
  10. 商品销售数据分析报告
  11. 计算机打字声音,键盘打字声音在哪设置
  12. websocket即时通讯
  13. linux ip_conntrack_max,解?Linux NAT ip_conntrack: table full的方法
  14. android手机存储空间猛增,为什么安卓手机运行内存和储存空间增长速度这么快,什么原因呢?...
  15. Vue常用经典开源项目汇总参考-海量
  16. ntohs和htons区别?
  17. Navicat Premium安装和激活
  18. 三星SM411性能参数!
  19. 数据结构与算法——链式存储(链表)的插入及删除
  20. TS学习(尚硅谷总结)

热门文章

  1. 开源多商户商城源码代码分析
  2. Mac款origin来了!还不来看看!
  3. 原生js添加动画效果
  4. 领导者与管理者有什么区别?
  5. 【python】python翻译的代码和第三方库
  6. MySQL:一个简单insert语句的大概流程
  7. Linux主分区和扩展分区的区别
  8. 复杂网络实验3:BA模型(matlab)
  9. ASP.NET中DOC模板的书签制作
  10. matlab标准正交基,标准正交基概述.pdf