题目链接:http://codeforces.com/contest/444/problem/C

给定一个长度为n的序列,初始时ai=i,vali=0(1≤i≤n).有两种操作:

  1. 将区间[L,R]的值改为x,并且当一个数从y改成x时它的权值vali会增加|x−y|.
  2. 询问区间[L,R]的权值和.

n≤10^5,1≤x≤10^6.

感觉这是一个比较好的考察线段树区间更新的性质。

当区间的a[i]一样时,区间更新即可,这是剪枝。

注意,lazy标记存的是增量。

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + ;
struct SegTree {
LL l, r, Min, Max;
LL val, lazy;
}T[N << ]; LL Abs(LL a) {
return a < ? -a : a;
} void pushup(int p) {
T[p].Min = min(T[p << ].Min, T[(p << )|].Min);
T[p].Max = max(T[p << ].Max, T[(p << )|].Max);
T[p].val = T[p << ].val + T[(p << )|].val;
} void pushdown(int p) {
if(T[p].l == T[p].r) {
return ;
} else if(T[p].lazy) {
T[p << ].lazy += T[p].lazy;
T[(p << )|].lazy += T[p].lazy;
T[p << ].val += T[p].lazy*(LL)(T[p << ].r - T[p << ].l + );
T[(p << )|].val += T[p].lazy*(LL)(T[(p << )|].r - T[(p << )|].l + );
T[p << ].Min = T[p << ].Max = T[(p << )|].Max = T[(p << )|].Min = T[p].Min;
T[p].lazy = ;
}
} void build(int p, int l, int r) {
int mid = (l + r) >> ;
T[p].l = l, T[p].r = r, T[p].lazy = ;
if(l == r) {
T[p].Max = l, T[p].Min = l;
T[p].val = ;
return ;
}
build(p << , l, mid);
build((p << )|, mid + , r);
pushup(p);
} void update(int p, int l, int r, LL add) {
int mid = (T[p].l + T[p].r) >> ;
pushdown(p);
if(l == T[p].l && T[p].r == r && T[p].Min == T[p].Max) {
T[p].val += (LL)Abs(add - T[p].Min)*(LL)(r - l + );
T[p].lazy += Abs(add - T[p].Max);
T[p].Max = T[p].Min = add;
return ;
}
if(r <= mid) {
update(p << , l, r, add);
} else if(l > mid) {
update((p << )|, l, r, add);
} else {
update(p << , l, mid, add);
update((p << )|, mid + , r, add);
}
pushup(p);
} LL query(int p, int l, int r) {
int mid = (T[p].l + T[p].r) >> ;
pushdown(p);
if(l == T[p].l && T[p].r == r) {
return T[p].val;
}
if(r <= mid) {
return query(p << , l, r);
} else if(l > mid) {
return query((p << )|, l, r);
} else {
return query(p << , l, mid) + query((p << )|, mid + , r);
}
pushup(p);
} int main()
{
int n, m, l, r, c;
LL add;
scanf("%d %d", &n, &m);
build(, , n);
while(m--) {
scanf("%d %d %d", &c, &l, &r);
if(c == ) {
scanf("%lld", &add);
update(, l, r, add);
} else {
printf("%lld\n", query(, l, r));
}
}
return ;
}

Codeforces 444 C. DZY Loves Colors (线段树+剪枝)的更多相关文章

  1. codeforces 444 C. DZY Loves Colors(线段树)

    题目大意: 1 l r x操作 讲 [l,r]上的节点涂成x颜色,而且每一个节点的值都加上 |y-x| y为涂之前的颜色 2 l r  操作,求出[l,r]上的和. 思路分析: 假设一个区间为同样的颜 ...

  2. 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 ...

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

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

  4. CF444C. DZY Loves Colors[线段树 区间]

    C. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  5. Codeforces 444 C - DZY Loves Colors

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

  6. HDU5649 DZY Loves Sorting 线段树

    题意:BC 76 div1 1004 有中文题面 然后奉上官方题解: 这是一道良心的基础数据结构题. 我们二分a[k]的值,假设当前是mid,然后把大于mid的数字标为1,不大于mid的数字标为0.然 ...

  7. Codeforces Round #254 DZY Loves Colors

    题意:输入n, m ; 有n给位置, 初始时第i个位置的color为i, colorfulness为0.      有m次操作,一种是把成段的区域color更新为x, 对于更新的区域,每个位置(令第i ...

  8. Codeforces444C DZY Loves Colors(线段树)

    题目 Source http://codeforces.com/problemset/problem/444/C Description DZY loves colors, and he enjoys ...

  9. Codeforces Round #254 (Div. 1) C. DZY Loves Colors 分块

    C. DZY Loves Colors 题目连接: http://codeforces.com/contest/444/problem/C Description DZY loves colors, ...

随机推荐

  1. Windows 8获取开发者账户

    使用PowerShell获取开发者账户,可以在本地调试Metro APP C:\PS> Show-WindowsDeveloperLicenseRegistration //安装licence ...

  2. mysql笔记(前面自己写的不标准有些地方)

    day15-MySQL 数据库 1 数据库概念(了解) 1.1 什么是数据库 数据库就是用来存储和管理数据的仓库! 数据库存储数据的优先: l  可存储大量数据: l  方便检索: l  保持数据的一 ...

  3. Fragment的知识总结

    1. Fragment概念及作用. 以下是使用Fragment提供思路 2. 创建继承于 Fragment的类:(可extends Fagment 或  ListFagment) 注意导包:如果考虑兼 ...

  4. 用 Xcode 开发 Cydia Substrate 插件(一)

    关于这方面的中文资料太少了,以至于可能很多对插件开发感兴趣的孩子们都不知从何下手,于是呢我就写了这篇文章,希望对你能有所帮助.如果你觉得文章内容有什么错误呢也请提出来. 准备开发环境 1. 从 App ...

  5. &引用的问题

    C++中&可以代表引用也代表取地址符. 引用这一方面略微有点头大. 注意: 1)引用的函数可以作为左值 一个简单的作为左值的例子 #include <iostream> using ...

  6. mysql,多表的内外连接+子查询

    表: student house course 关系:student_course 多对多 student house 多对一 需求:查询房间1 的学生 都学习了什么课程 select s.s_nam ...

  7. Files

    write public static void write(CharSequence from, File to, Charset charset) throws IOException { asC ...

  8. nginx上传目录配置,禁止执行权限

    我们经常会把网站的图片文件上传目录设置为只可上传文件但不能执行文件,就是要禁止执行权限,小编来给大家举一个上传目录配置,禁止执行权限方法,各位可参考. 如果不让有执行权限最简单的办法  代码如下 复制 ...

  9. RandomAccessFile、FileChannel、MappedByteBuffer读写文件

    s package com.nio; import java.io.Closeable; import java.io.FileNotFoundException; import java.io.IO ...

  10. Eclipse插件安装的三种方法

    转自:http://www.blogjava.net/tangzurui/archive/2008/06/30/211669.html  整理了一下格式. (前两种安装方式以多国语言包的安装为例) 1 ...