[Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】
题目链接: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;
}
[Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】的更多相关文章
- Codeforces Round #254 (Div. 1) C. DZY Loves Colors 线段树
题目链接: http://codeforces.com/problemset/problem/444/C J. DZY Loves Colors time limit per test:2 secon ...
- Codeforces 444C DZY Loves Colors(线段树)
题目大意:Codeforces 444C DZY Loves Colors 题目大意:两种操作,1是改动区间上l到r上面德值为x,2是询问l到r区间总的改动值. 解题思路:线段树模板题. #inclu ...
- CF444C. DZY Loves Colors[线段树 区间]
C. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 444 C. DZY Loves Colors (线段树+剪枝)
题目链接:http://codeforces.com/contest/444/problem/C 给定一个长度为n的序列,初始时ai=i,vali=0(1≤i≤n).有两种操作: 将区间[L,R]的值 ...
- Codeforces Round #254 (Div. 2) DZY Loves Chemistry【并查集基础】
一开始不知道题意是啥意思,迟放进去反应和后放进去反应有什么区别 对于第三组数据不是很懂,为啥312,132的组合是不行的 后来发现这是一道考察并查集的题目 QAQ 怒贴代码: #include < ...
- codeforces 444 C. DZY Loves Colors(线段树)
题目大意: 1 l r x操作 讲 [l,r]上的节点涂成x颜色,而且每一个节点的值都加上 |y-x| y为涂之前的颜色 2 l r 操作,求出[l,r]上的和. 思路分析: 假设一个区间为同样的颜 ...
- Codeforces #254 div1 B. DZY Loves FFT 暴力乱搞
B. DZY Loves FFT 题目连接: http://codeforces.com/contest/444/problem/B Description DZY loves Fast Fourie ...
- Codeforces Round #FF 446 C. DZY Loves Fibonacci Numbers
參考:http://www.cnblogs.com/chanme/p/3843859.html 然后我看到在别人的AC的方法里还有这么一种神方法,他预先设定了一个阈值K,当当前的更新操作数j<K ...
- Codeforces Round #603 (Div. 2) E. Editor(线段树)
链接: https://codeforces.com/contest/1263/problem/E 题意: The development of a text editor is a hard pro ...
随机推荐
- 加速Android Studio/Gradle构建
已经使用Android Studio进行开发超过一年,随着项目的增大,依赖库的增多,构建速度越来越慢,现在最慢要6分钟才能build一个release的安装包,在网上查找资料,发现可以通过一些配置可以 ...
- Android开发之从网络URL上下载JSON数据
网络下载拉取数据中,json数据是一种格式化的xml数据,非常轻量方便,效率高,体验好等优点,下面就android中如何从给定的url下载json数据给予解析: 主要使用http请求方法,并用到Htt ...
- Android开发之处理崩溃异常
众所周知,android的设备千差万别,难免会发生崩溃异常等现象,这个时候就需要捕获哪些崩溃异常了,也就是捕获崩溃异常的相关信息,并记录下来,这样一来方便开发人员和测试人员的分析与调试. 1.首先我们 ...
- R-大数据分析挖掘(3-R作图)
R语言绘图功能: 提供实例: demo(graphics)
- HDU-1034(简单模拟)
Candy Sharing Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- Android 设计随便说说之简单实践(消息流动)
在上面两篇分别说明了设计中较为简单也是很关键的实践点. 第一模块划分,它是根据每个模块所承载的业务,进行划分,是应用程序一个静态的描述. 第二合理组合,它是是将每个模块调动起来,共同实现业务,是一个准 ...
- Android手机出现"已安装了存在签名冲突的同名数据包"的原因及解决办法
http://blog.csdn.net/dyllove98/article/details/8830264 如果你不是开发者:如果你在android上更新一个已经安装过较早版本软件时,安装到最后一步 ...
- 常见错误总结_1_对java类进行修改后,无法按修改的类型加载
1.这是因为没有run的原因,对类进行修改一定要run一遍 2.至于要不要重新tomcat部署,取决于你是修改了变量还是方法,拿不定的时候都重新加载一遍看看.
- iOS 计算两个日期之间的天数问题
//获取当前时间若干年.月.日之后的时间 + (NSDate *)dateWithFromDate:(NSDate *)date years:(NSInteger)years months:(NSIn ...
- Codevs 1958 刺激
1958 刺激 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description saffah的一个朋友S酷爱滑雪,并且追求刺激(exitement, ...