CF #446C:http://codeforces.com/problemset/problem/444/C

题意:给你n个数,大小从1到n,然后又两种操作,1 a b c表示把区间a b 更新为c,那么每个数与之前的数有一个改变量|c-ai|, 2 a b 表示查询a b 之间的改变量。

题解:正解必然是线段树。但是线段树的lazy还是不会用,以及要维护的东西也不清楚,这道水线段树都不会。一个值 mul维护当前的数,ans表示总的改变量,sum表示改变量。这里只有mul!=0才开始更新,否则pushdown();

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;
const int N=*1e5+;
int n,m;
int a,b,c;
long long d,cnt;
struct Node{
int l,r;
long long ans;
long long val,mul;
long long sum;
inline int mid(){
return (l+r)/;
}
inline int len(){
return r-l+;
}
}num[N*];
void pushup(int rt){
if(num[rt<<].mul==num[rt<<|].mul)
num[rt].mul=num[rt<<].mul;
num[rt].ans=num[rt<<].ans+num[rt<<|].ans;
}
void pushdown(int rt){
if(num[rt].mul!=){
num[rt<<|].mul=num[rt<<].mul=num[rt].mul;
num[rt<<].ans+=num[rt].sum*num[rt<<].len();
num[rt<<|].ans+=num[rt].sum*num[rt<<|].len();
num[rt<<].sum+=num[rt].sum;
num[rt<<|].sum+=num[rt].sum;
num[rt].mul=num[rt].sum=;
}
}
void build(int l,int r,int rt){
num[rt].l=l;
num[rt].r=r;
num[rt].mul=num[rt].ans=num[rt].sum=;
if(l==r){
num[rt].mul=++cnt;
return;
}
int mid=(l+r)/;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
pushup(rt);
}
void update(int l,int r,int rt,long long val){
if(num[rt].l==l&&num[rt].r==r&&num[rt].mul){
num[rt].sum+=abs(num[rt].mul-val);
num[rt].ans+=abs(num[rt].mul-val)*num[rt].len();
num[rt].mul=val;
return;
}
pushdown(rt);
int mid=num[rt].mid();
if(mid>=r)update(l,r,rt<<,val);
else if(mid<l)update(l,r,rt<<|,val);
else{
update(l,mid,rt<<,val);
update(mid+,r,rt<<|,val);
}
pushup(rt);
}
long long query(int l,int r,int rt){
if(num[rt].l==l&num[rt].r==r){
return num[rt].ans;
}
pushdown(rt);
int mid=num[rt].mid();
if(mid>=r)return query(l,r,rt<<);
else if(mid<l)return query(l,r,rt<<|);
else{
return query(l,mid,rt<<)+query(mid+,r,rt<<|);
}
pushup(rt);
}
int main(){
while(~scanf("%d%d",&n,&m)){
cnt=;
build(,n,);
for(int i=;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
if(a==){
scanf("%I64d",&d);
update(b,c,,d);
}
else
printf("%I64d\n",query(b,c,));
}
}
}

DZY Loves Colors的更多相关文章

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

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

  2. Codeforces444C DZY Loves Colors(线段树)

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

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

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

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

  5. Cf 444C DZY Loves Colors(段树)

    DZY loves colors, and he enjoys painting. On a colorful day, DZY gets a colorful ribbon, which consi ...

  6. Codeforces 444 C - DZY Loves Colors

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

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

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

  8. CodeForces 445E DZY Loves Colors

    DZY Loves Colors Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...

  9. Codeforces Round #254 DZY Loves Colors

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

  10. CF444C DZY Loves Colors

    考试完之后打的第一场CF,异常惨烈呀,又只做出了一题了.A题呆滞的看了很久,领悟到了出题者的暗示,应该就是两个点的时候最大吧,不然的话这题肯定特别难敲,YY一发交上去然后就过了.然后就在不停地YY B ...

随机推荐

  1. 只对safari起作用的css hack

    下面的css代码只对safari browser 起作用: .test { width: 200px; height:50px; background-color:red; padding-top: ...

  2. 排序算法 Java实现版

    8种排序之间的关系: 1. 直接插入排序 (1)基本思想: 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序 ...

  3. C#的dictionary使用总结

    Dictionary<string, string>是一个泛型,本身有集合的功能有时候可以把它看成数组. 他的结构是这样的:Dictionary<[key], [value]> ...

  4. 小菜学习Lucene.Net(更新3.0.3版本使用)

    花了两天的时间研究了下Lucene.Net 发现确实挺好玩.... 最新版本是3.0.3 (最后更新时间2012-10) 可惜3.0.3版本的Lucene.net无法和盘古分词 (最新版为2.3.1. ...

  5. 【转】仿Android 联系人SideBar排序,根据拼音A-Z字母快速导航,以及输入搜索条件过滤,显示姓名的文字图片

    1.首先我们把这几个工具类拷贝到自己的项目中,这些都是很常见的类: CharacterParser       –这是用来把中文转成拼音的工具类 PinyinComparator   –拼音首字母的比 ...

  6. TCP/IP之分层

    网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能.一个协议族,比方T C P / I P,是一组不同层次上的多个协议的组合.T C P / I P通常被觉得是一个四层协议系统. 1.每层的 ...

  7. MyBatis报错

    1.错误描写叙述 2014-11-2 15:03:11 org.apache.catalina.core.StandardEngine start 信息: Starting Servlet Engin ...

  8. [转] Java中ArrayList类的用法

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

  9. Ext4.1 tree grid的右键菜单

    Ext4.1 tree grid的右键菜单功能其实挺简单的 只要添加一个itemcontextmenu事件,并在事件中显示出Menu就OK了. 代码: this.tree.on('itemcontex ...

  10. 99%Bug 修复方法

    以下仅支持4.0.3或之后的设备 (写在前面,这个教程需要安装两个app,且卸载后无法达到效果,所以有app drawer洁癖者慎重(你可以把它们隐藏起来么). 当然等官方rom更新或者安装最新三方r ...