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,));
}
}
}

最新文章

  1. C#------数字转中文
  2. ClearTrace
  3. Android布局属性大全
  4. IUnknown—COM和MFC
  5. React中props.children和React.Children的区别
  6. ext 文档下载地址
  7. 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)
  8. myeclipse激活+Aptana安装配置
  9. php-fpm死机解决办法,脚本后台自动重启
  10. Linux 定时任务详解
  11. 洛谷 P1450 解题报告
  12. OpenCV4.1.0实践(2) - Dlib+OpenCV人脸特征检测
  13. 卷积cnn总结
  14. java模拟http请求(代理ip)
  15. delphi 通过事务插入数据
  16. 01Flask基础
  17. consul服务发现和配置共享的软件,
  18. django -- 联合索引
  19. hdu-6324-博弈
  20. ubuntu mongodb backup/restore (备份和恢复)

热门文章

  1. pycharm-4.5.3 汉化教程(附汉化包)
  2. Android的TextView与Html相结合的用法
  3. html打印表格每页都有的表头和打印分页
  4. zoj 2112 Dynamic Rankings(主席树&amp;amp;动态第k大)
  5. Linux开发工具之Makefile(下)
  6. 优雅退出 Android 应用程序的 6 种方式
  7. Android的GridView和Gallery结合Demo
  8. 关于asp.net程序连接不了ORACLE数据库而PL/SQL可以连接的问题
  9. C#接口的使用
  10. YII数据库增删查改操作