http://vjudge.net/problem/viewProblem.action?id=51622

题目大意:

给定一列n个数字,最初赋予值1到n

两个操作:
1.将区间[l,r]内的数改为x,则这区间中所有数的改变值进行求和,即ans=abs(a[l]-x)+abs[a[l+1]-x).....abs(a[r]-x),但不要求输出

2.需要将刚才要求得到的区间改变值输出出来

这里我们利用一个color[]数组相当于给这堆数进行染色,当某个区间内的赋予的值相等时,我们可以看做有一个相同的color[]=val了,这样我们可以直接对这个区间

利用乘法求改变值。

这样的话,我们还需要一个数组del[]时刻记录每个量改变的差值

sum[]数组的话就是用来保存区间改变量的和

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. #define N 100005
  5. #define LL long long
  6. #define L ls,x,mid
  7. #define R rs,mid+1,y
  8. LL color[N<<],sum[N<<],del[N<<];
  9. LL abs(LL a)
  10. {
  11. return a>?a:-a;
  12. }
  13. void push_up(int cur)
  14. {
  15. if(color[cur<<]==color[cur<<|]) color[cur]=color[cur<<];
  16. else color[cur]=;
  17. sum[cur]=sum[cur<<]+sum[cur<<|];
  18. }
  19. void push_down(int cur,int x,int y)
  20. {
  21. int mid=(x+y)/,ls=cur<<,rs=cur<<|;
  22. if(color[cur]){
  23. color[ls]=color[rs]=color[cur];
  24. del[ls]+=del[cur],del[rs]+=del[cur];
  25. sum[ls]+=(mid-x+)*del[cur];
  26. sum[rs]+=(y-mid)*del[cur];
  27. del[cur]=color[cur]=;
  28. }
  29. }
  30. void build(int cur,int x,int y)
  31. {
  32. int mid=(x+y)/,ls=cur<<,rs=cur<<|;
  33. if(x==y){
  34. color[cur]=x;
  35. sum[cur]=;
  36. return;
  37. }
  38. color[cur]=del[cur]=;
  39. build(L);
  40. build(R);
  41. push_up(cur);
  42. }
  43. void update(int cur,int x,int y,int s,int t,int v)
  44. {
  45. int mid=(x+y)/,ls=cur<<,rs=cur<<|;
  46. if(x>=s&&y<=t&&color[cur]){
  47. sum[cur]+=abs(color[cur]-v)*(y-x+);
  48. //printf("%I64d\n",abs(color[cur]-v));
  49. del[cur]+=abs(color[cur]-v);
  50. color[cur]=v;
  51. return;
  52. }
  53. push_down(cur,x,y);
  54. if(mid>=s) update(L,s,t,v);
  55. if(mid<t) update(R,s,t,v);
  56. push_up(cur);
  57. }
  58. void query(int cur,int x,int y,int s,int t,LL &ans)
  59. {
  60. int mid=(x+y)/,ls=cur<<,rs=cur<<|;
  61. if(x>=s&&y<=t){
  62. ans+=sum[cur];
  63. return;
  64. }
  65. push_down(cur,x,y);
  66. if(mid>=s) query(L,s,t,ans);
  67. if(mid<t) query(R,s,t,ans);
  68. }
  69. int main()
  70. {
  71. int n,m,type,l,r,x;
  72. scanf("%d%d",&n,&m);
  73. build(,,n);
  74. for(int i=;i<m;i++)
  75. {
  76. scanf("%d",&type);
  77. if(type==){
  78. scanf("%d%d%d",&l,&r,&x);
  79. update(,,n,l,r,x);
  80. }else{
  81. scanf("%d%d",&l,&r);
  82. LL ans=;
  83. query(,,n,l,r,ans);
  84. printf("%I64d\n",ans);
  85. }
  86. }
  87. return ;
  88. }

CodeForces 444C 节点更新求变化值的和的更多相关文章

  1. BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 10374  Solved: 4535[Subm ...

  2. HDOJ-4027(线段树+区间更新(每个节点更新的值不同))

    Can You answer these queries? HDOJ-4027 这道题目和前面做的题目略有不同.以前的题目区间更新的时候都是统一更新的,也就是更新相同的值.但是这里不一样,这里更新的每 ...

  3. [NOI2005]维修数列 Splay tree 区间反转,修改,求和,求最值

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1500 Description Input 输入文件的第1行包含两个数N和M,N表示初始时数 ...

  4. 【HDU】1754 I hate it ——线段树 单点更新 区间最值

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. 线段树&&线段树的创建线段树的查询&&单节点更新&&区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

  6. poj 2777(线段树的节点更新策略)

    /* 之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新 通过子节点的颜色情况来判断父节点的颜色情况 !这就是TLE的原因! 后来想一想没有必要 !加入[a ...

  7. c# winform TreeView NODE(节点) 重命名或获取节点修改后的值

    在程序开发过程中我们经常用到treeview,还经常要修改节点的名字.节点名字修改后还想及时更新数据库.这时问题就来了,怎样获取NODE(节点)更新后的值呢?本人试了很多方法最终分析出treeview ...

  8. Codeforces 444C DZY Loves Colors(线段树)

    题目大意:Codeforces 444C DZY Loves Colors 题目大意:两种操作,1是改动区间上l到r上面德值为x,2是询问l到r区间总的改动值. 解题思路:线段树模板题. #inclu ...

  9. WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)

    上一章节我们讲到wpf的柱状图组件,它包含了非轮询方式更新数据库变化SqlDependency的内容,但是没有详细解释,现在给大家一个比较简单的例子来说明这部分内容. 上一章节: WPF柱状图(支持数 ...

随机推荐

  1. redis本地安装与开发

    一.安装(MAC) https://redis.io sudo mv redis-4.0.11.tar.gz /usr/localcd /usr/localsudo tar -zxf redis-4. ...

  2. JVM线程与Linux内核线程的映射[转]

    Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...

  3. objectbox基础

    objectbox基础 参考链接 官网地址 http://objectbox.io github地址 https://github.com/objectbox/objectbox-java https ...

  4. IP查询系统的异步回调案例

    package com.lxj.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.Inpu ...

  5. Win10 系统安装Sql Server2008 R2 数据库遇到的问题及解决办法总结!

    1.开始安装时,提示要先安装 “.NET Framework 3.5(包括.NET 2.0和3.0)”,之前已经下载好.NET Framework 3.5 sp1,安装时还是提示要先安装 “.NET  ...

  6. java 读取txt,java读取大文件

    java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File;import java.io.RandomAccessFile;i ...

  7. 几个windows使用小技巧

    windows使用技巧 保存网页上图片时,可以按住左键把图片拖到右下角(win+D,双屏幕直接拖动)然后就可以放在桌面啦 放大镜-->Win+加号或者减号(放大或缩小).Win + Esc(退出 ...

  8. (转)使用JDK中的Proxy技术实现AOP功能

    http://blog.csdn.net/yerenyuan_pku/article/details/52863780 AOP技术在企业开发中或多或少都会用到,但用的最多的大概就是做权限系统时,在做权 ...

  9. Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现)

    1. 为什么需要多线程下载?     服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...

  10. HDU 5768Lucky7(多校第四场)容斥+中国剩余定理(扩展欧几里德求逆元的)+快速乘法

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Time Limit: 2000/1000 MS (Java/Others)    M ...