CodeForces 444C 节点更新求变化值的和

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[]数组的话就是用来保存区间改变量的和

 

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 #define N 100005
 5 #define LL long long
 6 #define L ls,x,mid
 7 #define R rs,mid+1,y
 8 LL color[N<<2],sum[N<<2],del[N<<2];
 9 LL abs(LL a)
10 {
11     return a>0?a:-a;
12 }
13 void push_up(int cur)
14 {
15     if(color[cur<<1]==color[cur<<1|1]) color[cur]=color[cur<<1];
16     else color[cur]=0;
17     sum[cur]=sum[cur<<1]+sum[cur<<1|1];
18 }
19 void push_down(int cur,int x,int y)
20 {
21     int mid=(x+y)/2,ls=cur<<1,rs=cur<<1|1;
22     if(color[cur]){
23         color[ls]=color[rs]=color[cur];
24         del[ls]+=del[cur],del[rs]+=del[cur];
25         sum[ls]+=(mid-x+1)*del[cur];
26         sum[rs]+=(y-mid)*del[cur];
27         del[cur]=color[cur]=0;
28     }
29 }
30 void build(int cur,int x,int y)
31 {
32     int mid=(x+y)/2,ls=cur<<1,rs=cur<<1|1;
33     if(x==y){
34         color[cur]=x;
35         sum[cur]=0;
36         return;
37     }
38     color[cur]=del[cur]=0;
39     build(L);
40     build(R);
41     push_up(cur);
42 }
43 void update(int cur,int x,int y,int s,int t,int v)
44 {
45     int mid=(x+y)/2,ls=cur<<1,rs=cur<<1|1;
46     if(x>=s&&y<=t&&color[cur]){
47         sum[cur]+=abs(color[cur]-v)*(y-x+1);
48         //printf("%I64d\n",abs(color[cur]-v));
49         del[cur]+=abs(color[cur]-v);
50         color[cur]=v;
51         return;
52     }
53     push_down(cur,x,y);
54     if(mid>=s) update(L,s,t,v);
55     if(mid<t) update(R,s,t,v);
56     push_up(cur);
57 }
58 void query(int cur,int x,int y,int s,int t,LL &ans)
59 {
60     int mid=(x+y)/2,ls=cur<<1,rs=cur<<1|1;
61     if(x>=s&&y<=t){
62         ans+=sum[cur];
63         return;
64     }
65     push_down(cur,x,y);
66     if(mid>=s) query(L,s,t,ans);
67     if(mid<t) query(R,s,t,ans);
68 }
69 int main()
70 {
71     int n,m,type,l,r,x;
72     scanf("%d%d",&n,&m);
73     build(1,1,n);
74     for(int i=0;i<m;i++)
75     {
76         scanf("%d",&type);
77         if(type==1){
78             scanf("%d%d%d",&l,&r,&x);
79             update(1,1,n,l,r,x);
80         }else{
81             scanf("%d%d",&l,&r);
82             LL ans=0;
83             query(1,1,n,l,r,ans);
84             printf("%I64d\n",ans);
85         }
86     }
87     return 0;
88 }

 

转载于:https://www.cnblogs.com/CSU3901130321/p/3898384.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS之calc()使用

1.什么是calc() calc()从字面我们可以把他理解为一个函数function。其实calc是英文单词calculate(计算)的缩写&#xff0c;是css3的一个新增的功能&#xff0c;用来指定元素的长度 2.calc()能做什么&#xff1f; calc()能让你给元素的值做计算&#xff0c;你可以给一个div元…

显示当前行号、文件名和函数名

在编程时&#xff0c;有时需要知道当前的代码是在第几行&#xff0c;当前文件名是什么&#xff0c;以及当前执行的是哪个函数&#xff1f;下面的代码可以轻松地完成这种功能&#xff1a; #include <stdio.h>void test(){printf("Line:%d, File:%s, Function:%s\n&q…

百安俱乐部关于“BotNet专题讨论”资料

•BotNet专题讨论 演讲者&#xff1a;叶子 典型BotNet案件 •什么是BotNet •BotNet原理及其危害 BotNet的发展BotNet的形成 BotNet的传播 BotNet的控制 BotNet的危害•BotNet防范与处理 •BotNet的发展趋势分析 •典型BotNet程序的技术分析转载于:https://blog.51cto.com…

Vue给项目添加进度条

前言 在PC端项目的开发过程中&#xff0c;有时我们需要给项目添加一个进度条来展示界面是否已经完成加载的情况。那么如何才能成功添加进度条呢&#xff1f; 添加方式 用法1: 在拦截器中使用 1.引入插件Nprogress npm install --save nprogress 2.在main.js中引入对应的包文…

显示当前行号、文件名和函数名(二)

为了测试__FILE__, __LINE__, __FUNCTION__&#xff0c; 又写了一个C版本的测试程序&#xff0c;源码如下&#xff1a; #include <iostream> #include <string>using namespace std;class CUser { private:int m_nId;string m_sName;public:CUser(int id, string …

文件的删除和文件信息的读取

文件删除代码&#xff1a;<table border"1"> <tr> <td colspan"2" style"color: #660066;"> 删除文件&#xff1a; </td> </tr> …

vue与elementUI中给el-input绑定键盘按键--按键修饰符

vue怎么写键盘事件 vue允许将按键值作为修饰符来使用&#xff0c;如监听回车事件&#xff0c;有两种写法&#xff0c;如下代码&#xff1a; <input type"text" keyup.13"console.log($event)"></input><input type"text" keyup…

很好的理解遗传算法的样例

遗传算法的手工模拟计算演示样例 为更好地理解遗传算法的运算过程&#xff0c;以下用手工计算来简单地模拟遗传算法的各 个主要运行步骤。 例&#xff1a;求下述二元函数的最大值&#xff1a; (1) 个体编码 遗传算法的运算对象是表示个体的符号串&#xff0…

CSS之容器按比例缩放

1.对于图片&#xff0c;默认只设置图片的一个宽或高&#xff0c;那么另一个值就会按照图片真实比例缩放 图片因为本身存在宽高比&#xff0c;所以设置一个值&#xff0c;另一个值自动也就根据真实的比例对应上 2.但跟pc的不一样&#xff0c;移动端的图片很多都不是固定的宽高的…

[转载]vs2008下安装boost

vs2008下安装boost 1.下载boost_1_34_1压缩文件&#xff0c;解压缩到d&#xff1a;\boost_1_34_1\目录下 2.编译bjam 从vs2008的工具菜单进入命令提示窗口"Visual Studio 2008 Command Prompt"&#xff08;一定要从这进&#xff09;&#xff0c;cd到c:\boost_1_34_1\…

文件上传命令rz和下载命令sz的安装

一、xshell工具简介 Xshell 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。其可以在Windows界面下用来访问远端不同系统下的服务器&#xff0c;从而比较好的达到远程控制终端的目的。 二、xshell连接虚拟机 1.打开xs…

python IDE比较与推荐

我先给一个初步的表格吧&#xff0c;大家如果有什么意见&#xff0c;或有补充&#xff0c;欢迎提出。有些我没有用过&#xff0c;先不写了。以下是我使用过的python IDE:(更新与2010年1月20日)┌─────┬────┬────┬──┬────┬──┬─────┬─────…

算法系列7《CVN》

计算CVN时使用二个64位的验证密钥&#xff0c;KeyA和KeyB。 1) 计算CVN 的数据源包括&#xff1a; 主账号&#xff08;PAN&#xff09;、卡失效期和服务代码&#xff0c;从左至右顺序编排。 41234567890123458701111 2) 将上述数据源扩展成128 位二进制数据&#xff08;不足128…

CSS之Box-sizing

W3C的标准盒模型&#xff1a; IE的传统盒模型&#xff1a; 实例&#xff1a; 1.W3C 盒子模型的范围包括 margin、border、padding、content&#xff0c;并且 content 部分不包含其他部分 2.IE 盒子模型的范围也包括 margin、border、padding、content&#xff0c;和标准 W3C 盒…

javascript学习系列(9):原数组发生变化的情况

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说形…

阿里云设置域名解析到主机ip

A记录 使用场景 添加 A 记录可实现将域名指向 IP 地址。 设置方法 登录云解析DNS控制台在域名解析页面&#xff0c;全部域名页签下&#xff0c;单击域名&#xff0c;进入解析设置页面 在解析设置页面&#xff0c;单击 添加记录 按钮 添加记录会话框中各项参数的添加说明。 …

python fabric实现远程操作和部署

博客迁往&#xff1a;新地址 &#xff08;点击直达&#xff09; 新博客使用markdown维护&#xff0c;线下有版本号库&#xff0c;自己写的所以会定时更新同步&#xff0c;同一时候提供更好的导航和阅读体验 csdn对markdown支持不好&#xff0c;所以旧版不会花时间进行同步修订&…

[Windows]python+PyQT+Eric安装配置

From: http://www.cnblogs.com/lhj588/archive/2011/10/05/2198472.html 一、大纲内容&#xff1a; 1、预备PC环境&#xff1a; 2、预备安装程序: 2、1、下载Python3.2 2、2、下载PyQt4 2、3、下载Eric5 3、安装配置步骤&#xff1a; 3、1、安装Pyhon3.2 3、2、安装Py…