大意:有$n$个格子, 初始$i$位置的颜色为$i$, 美丽值为0, 有两种操作

  • 将区间$[l,r]$内的元素全部改为$x$, 每个元素的美丽值增加$|x-y|$, $y$为未改动时的值
  • 询问区间$[l,r]$所有元素的美丽值之和

现在给定$m$个操作, 让你输出所有操作2的询问结果.

直接线段树暴力修改, 操作2复杂度显然$O(logn)$, 考虑操作1复杂度的证明.

操作1可以看成先区间增加贡献, 之后再区间赋值, 会产生额外复杂度的只有杂色区间, 考虑杂色区间的势能.

将初值看做n次赋值操作, 不影响复杂度的证明, 现在初始是纯色的, 势能为0.

考虑$[l,r]$范围内的一次操作1, 假设$[l,r]$内杂色区间数为H.

对于区间增加贡献, 复杂度为$O(logn+H)$, 不改变势能.

对于区间赋值, 复杂度$O(logn)$, 势能会减少H, 并且最多会再增加$O(logn)$新的势能, 因为覆盖到的区间数是$O(logn)$的.

所以总复杂度$(mlogn)$.

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #define REP(i,a,n) for(int i=a;i<=n;++i)
  5. #define mid ((l+r)>>1)
  6. #define lc (o<<1)
  7. #define rc (lc|1)
  8. #define ls lc,l,mid
  9. #define rs rc,mid+1,r
  10. using namespace std;
  11. typedef long long ll;
  12.  
  13. const int N = 1e5+10;
  14. int n, m;
  15. struct _ {
  16. int c;
  17. ll sum, tag;
  18. void upd(int cc, ll x, int len) {
  19. c=cc,sum+=len*x,tag+=x;
  20. }
  21. _ operator + (const _&rhs) const {
  22. _ r;
  23. r.c = (c==rhs.c?c:0);
  24. r.sum = sum+rhs.sum;
  25. r.tag = 0;
  26. return r;
  27. }
  28. } tr[N<<2];
  29.  
  30. void pd(int o, int l, int r) {
  31. if (tr[o].tag) {
  32. tr[lc].upd(tr[o].c,tr[o].tag,mid-l+1);
  33. tr[rc].upd(tr[o].c,tr[o].tag,r-mid);
  34. tr[o].tag=0;
  35. }
  36. }
  37.  
  38. void update(int o, int l, int r, int ql, int qr, int x) {
  39. if (ql<=l&&r<=qr&&tr[o].c) return tr[o].upd(x,abs(x-tr[o].c),r-l+1);
  40. pd(o,l,r);
  41. if (mid>=ql) update(ls,ql,qr,x);
  42. if (mid<qr) update(rs,ql,qr,x);
  43. tr[o] = tr[lc]+tr[rc];
  44. }
  45. ll query(int o, int l, int r, int ql, int qr) {
  46. if (ql<=l&&r<=qr) return tr[o].sum;
  47. pd(o,l,r);
  48. ll ans = 0;
  49. if (mid>=ql) ans+=query(ls,ql,qr);
  50. if (mid<qr) ans+=query(rs,ql,qr);
  51. return ans;
  52. }
  53. void build(int o, int l, int r) {
  54. if (l==r) return tr[o].c=l,void();
  55. build(ls),build(rs);
  56. }
  57.  
  58. int main() {
  59. scanf("%d%d", &n, &m);
  60. build(1,1,n);
  61. REP(i,1,m) {
  62. int op, l, r, x;
  63. scanf("%d%d%d", &op, &l, &r);
  64. if (op==1) {
  65. scanf("%d", &x);
  66. update(1,1,n,l,r,x);
  67. } else {
  68. printf("%lld\n", query(1,1,n,l,r));
  69. }
  70. }
  71. }

DZY Loves Colors CodeForces - 444C (线段树势能分析)的更多相关文章

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

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

  2. codeforces 446C DZY Loves Fibonacci Numbers 数论+线段树成段更新

    DZY Loves Fibonacci Numbers Time Limit:4000MS     Memory Limit:262144KB     64bit IO Format:%I64d &a ...

  3. Codeforces 679E - Bear and Bad Powers of 42(线段树+势能分析)

    Codeforces 题目传送门 & 洛谷题目传送门 这个 \(42\) 的条件非常奇怪,不过注意到本题 \(a_i\) 范围的最大值为 \(10^{14}\),而在值域范围内 \(42\) ...

  4. 【CF446C】DZY Loves Fibonacci Numbers (线段树 + 斐波那契数列)

    Description ​ 看题戳我 给你一个序列,要求支持区间加斐波那契数列和区间求和.\(~n \leq 3 \times 10 ^ 5, ~fib_1 = fib_2 = 1~\). Solut ...

  5. BZOJ3542 DZY Loves March 【map + 线段树】

    题目链接 BZOJ3542 题解 线段树裸题,,对每一行每一列开线段树 由于坐标很大,用\(map\)维护根下标 化一下式子,只用维护区间和,区间平方和,区间存在的个数 #include<alg ...

  6. CodeForces 444C 线段树

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

  7. Codeforces 444C 线段树 懒惰标记

    前天晚上的CF比赛div2的E题,很明显一个线段树,当时还在犹豫复杂度的问题,因为他是区间修改和区间查询,肯定是要用到懒惰标记. 然后昨天真的是给这道题跪了,写了好久好久,...我本来是写了个add标 ...

  8. Codeforces Round #FF (Div. 2)__E. DZY Loves Fibonacci Numbers (CF447) 线段树

    http://codeforces.com/contest/447/problem/E 题意: 给定一个数组, m次操作, 1 l r 表示区间修改, 每次 a[i] +  Fibonacci[i-l ...

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

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

随机推荐

  1. 简单理解offsetleft、offsetTop、offsetParent

    先来看看offsetParent返回的是什么值 ele.offsetParent返回的是ele元素最近的并且是定位过(relative,absolute)的父元素,如果没有父元素或者是父元素中没有一个 ...

  2. html5设置全屏模式--开发游戏必备

    <!-- uc强制竖屏 --> <meta name="screen-orientation" content="portrait"> ...

  3. Applying the Kappa architecture in the telco industry

    https://www.oreilly.com/ideas/applying-the-kappa-architecture-in-the-telco-industry Kappa architectu ...

  4. ubuntu14.04无法安装Curl,需要先升级sudo apt-get update

    ubuntu14.04无法安装Curl,需要先升级sudo apt-get updatesudo apt-get updatesudo apt-get install curl------------ ...

  5. DNS视图及压力测试(四)

    Bind安全控制选项 Allow-transfer {}; #用于控制区域传送文件 Allow-query {}; #通常用于服务器是缓存名称服务器时,控制查询客户端 Allow-recursion ...

  6. SNMP学习笔记之SNMP报文协议详解

    0x00 简介 简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议.在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案:由于SNMP的简单 ...

  7. Mysql的序列

    Mysql的序列 Mysql自带的序列:字段设置为int,属性里面选上“自动增长”即可: 在插入数据的时候可以不插入该字段的值,mysql会自动处理:

  8. linux内核分析 第7章读书笔记——《深入理解计算机系统》

    第七章 链接 --<深入理解计算机系统> 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行. 一.编译器 大多数编译系统提供编译驱动 ...

  9. bzoj 1096 仓库建设 -斜率优化

    L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L先生接到气 ...

  10. SpringCloud请求响应数据转换(一)

    异常现象 近期做Spring Cloud项目,工程中对Controller添加ResponseBodyAdvice切面,在切片中将返回的结果封装到ResultMessage(自定义结构),但在Cont ...