题目链接:CF Round #254 div1 C

题目分析

这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值。

如果直接使用普通的线段树区间赋值的方法,当一个节点表示的区间完全被要求修改的区间包含时,就直接打上赋值的标记然后 return 。但是这样这个节点中每个位置原先的值不同,需要进行的属性权值修改也就不同,是不能直接实现的。如果我们在节点表示的区间被修改的区间包含时,并不直接打标记 return ,而是当节点表示的区间被修改的区间完全包含而且这个节点中的每个位置的颜色相同时,才直接打标记然后 return ,否则就继续递归下去。这样就可以直接打标记修改属性权值了。但是这样看起来是会使复杂度退化的,但是实际上通过一些我不懂的势能分析,这样修改复杂度还是 O(log n) 的。所以这样这道题就变成线段树水题了。

需要维护一下每个节点表示的区间是否颜色相同。

区间赋值的题目就可以使用这种修改方式。

代码

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>using namespace std;typedef long long LL;inline int Abs(int x) {return x < 0 ? -x : x;}const int MaxN = 100000 + 5;int n, m;
int Col[MaxN * 4], Len[MaxN * 4], Pc[MaxN * 4];LL T[MaxN * 4], D[MaxN * 4];bool Same[MaxN * 4];inline void Update(int x)
{Same[x] = Same[x << 1] && Same[x << 1 | 1] && Col[x << 1] == Col[x << 1 | 1];if (Same[x]) Col[x] = Col[x << 1]; T[x] = T[x << 1] + T[x << 1 | 1];Len[x] = Len[x << 1] + Len[x << 1 | 1];
}inline void Add(int x, LL Num)
{D[x] += Num;T[x] += (LL)Len[x] * Num;
}inline void PushDown(int x)
{if (D[x] != 0){Add(x << 1, D[x]);Add(x << 1 | 1, D[x]);D[x] = 0;}if (Pc[x] != 0){Col[x << 1] = Pc[x << 1] = Pc[x];Col[x << 1 | 1] = Pc[x << 1 | 1] = Pc[x];Pc[x] = 0;}
}void Build(int x, int s, int t)
{   if (s == t){Same[x] = true;Col[x] = s;T[x] = D[x] = Pc[x] = 0;Len[x] = 1;return;}int m = (s + t) >> 1;Build(x << 1, s, m);Build(x << 1 | 1, m + 1, t);Update(x);
}void Change(int x, int s, int t, int l, int r, int Num)
{if (l <= s && r >= t && Same[x]){int Temp = Abs(Col[x] - Num);D[x] += (LL)Temp;T[x] += (LL)Temp * (LL)Len[x];Col[x] = Pc[x] = Num;      return;}PushDown(x);int m = (s + t) >> 1;if (l <= m) Change(x << 1, s, m, l, r, Num);if (r >= m + 1) Change(x << 1 | 1, m + 1, t, l, r, Num);Update(x);
}LL Query(int x, int s, int t, int l, int r)
{if (l <= s && r >= t) return T[x];PushDown(x);int m = (s + t) >> 1;LL ret = 0;if (l <= m) ret += Query(x << 1, s, m, l, r);if (r >= m + 1) ret += Query(x << 1 | 1, m + 1, t, l, r);return ret;
}int main()
{scanf("%d%d", &n, &m);   Build(1, 1, n); int f, l, r, Num;for (int i = 1; i <= m; ++i){scanf("%d%d%d", &f, &l, &r);if (f == 1) {scanf("%d", &Num);Change(1, 1, n, l, r, Num);}else printf("%I64d\n", Query(1, 1, n, l, r));}return 0;
}

  

转载于:https://www.cnblogs.com/JoeFan/p/4531606.html

[Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】相关推荐

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

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

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

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

  3. Codeforces Round #352 div1 C D (智商+线段树)

    Ultimate Weirdness of an Array 题意:给一个数列ai, f(i,j) 定义为除去i到j之间的数后最大gcd(ai, aj)的值, 求所有f(i,j)之和 #include ...

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

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

  5. Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑最终的序列是什么鸭子的,首先序列肯定单调不降,也就是a1≤a2≤a3≤...≤ana_1\le a_2\le a_3\le ...\le a_na ...

  6. Codeforces Round #727 (Div. 2) F. Strange Array 线段树 + 区间合并 + 排序优化

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的数组,对每个位置iii求一个最大价值,价值计算方式如下:选择一个包含iii的[l,r][l,r][l,r],让后将其拿出来排序,之后价值 ...

  7. Codeforces Round #723 (Div. 2) D. Kill Anton 线段树 + 暴力

    传送门 文章目录 题意: 思路: 题意: 给你一个只有ANTOANTOANTO四个字母的字符串,你每次可以交换相邻两个,花费为111,让后让你打乱字符串,使得将打乱的字符串还原为原来的字符串的花费最小 ...

  8. Codeforces Round #654 (Div. 2) F.Raging Thunder(线段树/区间合并)

    题目 一个长为n(n<=5e5)的仅由'>"和'<'构成的字符串, 代表球桌上在1到n的位置,有n个转换器, 此外,球桌上还有0到n,共n+1个球洞,假设此时球碰到i位置的 ...

  9. CodeForces 444 C DZY Loves Colors

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

最新文章

  1. Chrome v28 会在pwd目录下生成libpeerconnection.log文件
  2. centos 查找nginx_centos7肿么查看已经安装nginx
  3. 重言式判别c语言中文网,重言式判别 重言式判别源码及课程设计 c语言版.doc
  4. visual-studio – 使用TFS 2010防止在Visual Studio 2012上签入pdb文件
  5. delphi query 存储为dbf_Delphi 代码审计项目实战 1
  6. 记录java对象修改过的字段_Java垃圾回收器与内存回收策略
  7. 疫情政务问答助手算法冠军开源
  8. Latex 排版第一页出现空白页
  9. 午夜时分的51CTO博客与白天有什么不同?
  10. (四)BP神经网络预测(上)
  11. 山东泰开集团 工业机器人_泰开机器人有限公司
  12. 用C语言程序求两个正整数的最大公约数
  13. 【WIFI专题】Wifi 2.4G及5G频段各信道的中心频率及主要国家的分布情况
  14. 【c++STL——第四讲】stack系列 (常用知识点总结)
  15. 培训2022年6月22日
  16. SpringBoot快速上手
  17. 华为手机word插件加载失败_c#调用word的组件时失败解决方法
  18. ps 证件照(1,2寸)
  19. 品牌推广方法大全(收藏日后必有用处)
  20. 【车辆计数】基于matlab光流法行驶车辆检测计数【含Matlab源码 627期】

热门文章

  1. Python笔记-U2解锁手机九宫格
  2. MySQL笔记-左连接的使用(left join有关联的多表查询)
  3. 系统架构师学习笔记-论文摘要部分的写法
  4. html js 控制span值,根据显示/隐藏span标签/ Javascript组设置span文本?
  5. linux ded编译,重新编译deb包
  6. php输入数据提交排序,排序php数据var
  7. windows7官方原版_从零开始学装系统——微软官方原版windows7详细安装流程
  8. zemax验证高斯公式_ZEMAX 实验讲义
  9. springboot mongo查询固定字段_你真的会用索引么?[Mongo]
  10. 3-2:常见任务和主要工具之存储介质