http://vjudge.net/problem/viewProblem.action?id=51622

题目大意:

给定一列n个数字,最初赋予值1到n

两个操作:
1.将区间[l,r]内的数改为x,则这区间中所有数的改变值进行求和,即ans=abs(a[l]-x)+abs[a[l+1]-x).....abs(a[r]-x),但不要求输出

2.需要将刚才要求得到的区间改变值输出出来

这里我们利用一个color[]数组相当于给这堆数进行染色,当某个区间内的赋予的值相等时,我们可以看做有一个相同的color[]=val了,这样我们可以直接对这个区间

利用乘法求改变值。

这样的话,我们还需要一个数组del[]时刻记录每个量改变的差值

sum[]数组的话就是用来保存区间改变量的和

 #include <cstdio>
#include <cstring>
using namespace std;
#define N 100005
#define LL long long
#define L ls,x,mid
#define R rs,mid+1,y
LL color[N<<],sum[N<<],del[N<<];
LL abs(LL a)
{
return a>?a:-a;
}
void push_up(int cur)
{
if(color[cur<<]==color[cur<<|]) color[cur]=color[cur<<];
else color[cur]=;
sum[cur]=sum[cur<<]+sum[cur<<|];
}
void push_down(int cur,int x,int y)
{
int mid=(x+y)/,ls=cur<<,rs=cur<<|;
if(color[cur]){
color[ls]=color[rs]=color[cur];
del[ls]+=del[cur],del[rs]+=del[cur];
sum[ls]+=(mid-x+)*del[cur];
sum[rs]+=(y-mid)*del[cur];
del[cur]=color[cur]=;
}
}
void build(int cur,int x,int y)
{
int mid=(x+y)/,ls=cur<<,rs=cur<<|;
if(x==y){
color[cur]=x;
sum[cur]=;
return;
}
color[cur]=del[cur]=;
build(L);
build(R);
push_up(cur);
}
void update(int cur,int x,int y,int s,int t,int v)
{
int mid=(x+y)/,ls=cur<<,rs=cur<<|;
if(x>=s&&y<=t&&color[cur]){
sum[cur]+=abs(color[cur]-v)*(y-x+);
//printf("%I64d\n",abs(color[cur]-v));
del[cur]+=abs(color[cur]-v);
color[cur]=v;
return;
}
push_down(cur,x,y);
if(mid>=s) update(L,s,t,v);
if(mid<t) update(R,s,t,v);
push_up(cur);
}
void query(int cur,int x,int y,int s,int t,LL &ans)
{
int mid=(x+y)/,ls=cur<<,rs=cur<<|;
if(x>=s&&y<=t){
ans+=sum[cur];
return;
}
push_down(cur,x,y);
if(mid>=s) query(L,s,t,ans);
if(mid<t) query(R,s,t,ans);
}
int main()
{
int n,m,type,l,r,x;
scanf("%d%d",&n,&m);
build(,,n);
for(int i=;i<m;i++)
{
scanf("%d",&type);
if(type==){
scanf("%d%d%d",&l,&r,&x);
update(,,n,l,r,x);
}else{
scanf("%d%d",&l,&r);
LL ans=;
query(,,n,l,r,ans);
printf("%I64d\n",ans);
}
}
return ;
}

CodeForces 444C 节点更新求变化值的和的更多相关文章

  1. BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 10374  Solved: 4535[Subm ...

  2. HDOJ-4027(线段树+区间更新(每个节点更新的值不同))

    Can You answer these queries? HDOJ-4027 这道题目和前面做的题目略有不同.以前的题目区间更新的时候都是统一更新的,也就是更新相同的值.但是这里不一样,这里更新的每 ...

  3. [NOI2005]维修数列 Splay tree 区间反转,修改,求和,求最值

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1500 Description Input 输入文件的第1行包含两个数N和M,N表示初始时数 ...

  4. 【HDU】1754 I hate it ——线段树 单点更新 区间最值

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. 线段树&&线段树的创建线段树的查询&&单节点更新&&区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

  6. poj 2777(线段树的节点更新策略)

    /* 之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新 通过子节点的颜色情况来判断父节点的颜色情况 !这就是TLE的原因! 后来想一想没有必要 !加入[a ...

  7. c# winform TreeView NODE(节点) 重命名或获取节点修改后的值

    在程序开发过程中我们经常用到treeview,还经常要修改节点的名字.节点名字修改后还想及时更新数据库.这时问题就来了,怎样获取NODE(节点)更新后的值呢?本人试了很多方法最终分析出treeview ...

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

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

  9. WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)

    上一章节我们讲到wpf的柱状图组件,它包含了非轮询方式更新数据库变化SqlDependency的内容,但是没有详细解释,现在给大家一个比较简单的例子来说明这部分内容. 上一章节: WPF柱状图(支持数 ...

随机推荐

  1. Backbone学习记录(4)

    事件绑定  on()方法 调用格式:object.on(event, callback, [context])"change" — 当attributes变化时"chan ...

  2. qconshanghai2017

    https://2017.qconshanghai.com/schedule 第一天 (2017/10/17 星期二) 时间 日程 07:45-09:00 签到 上午 主题演讲 软件质量优化与平台创新 ...

  3. LinQ的使用

    LinQ:LinQ to Sql类 它是一个集成化的数据访问类,微软将原本需要我们自己动手去编写的一些代码,集成到了这个类中,会自动生成. LinQ的创建: 添加项——添加新项(LinQ to Sql ...

  4. AJPFX关于java中可访问控制符和非访问控制符的详细总结

    1.类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1 )公共类修饰符 pub ...

  5. Python学习日记之Python函数及方法使用总结

    1.  DocStrings 文档字符串     可以直接输出位于函数内定义的说明 # -*- coding:utf-8 -*- def printMax(x, y): '''示例: 说明文档''' ...

  6. 秒杀Sublime Text的微软开源代码编辑工具Visual Studio Code

    1. 下载链接: https://code.visualstudio.com/ 2. 秒开一个ASP.NET网站源码 3.编辑CSS颜色支持 4.Git支持 5.常用快捷键 Ctrl+Shift+P ...

  7. Oracle Recycle Bin

    开启回收站RECYCLEBIN=ON,默认开启 ALTER SYSTEM SET RECYCLEBIN=OFF SCOPE=SPFILE; 一.从回收站还原表 还原删除的表和从属对象. 如果多个回收站 ...

  8. win10忘记wifi记录

    1.点击桌面右下角无线图标 2.点击网络设置 3.点击管理WIFI设置 4.点击要管理的账户,忘记或者共享该wifi.

  9. mysql 增删查改

    非关系型数据库关系型数据库Oracle mysql sqlserver db2 Postgresql Sqlite access sqlserver 微软db2 ibm================ ...

  10. mysql 函数tree状

    // 子节点的查询 CREATE DEFINER = `root`@`%` FUNCTION `getDeptChildList`(rootId BIGINT) RETURNS longtext DE ...