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[]数组的话就是用来保存区间改变量的和
- #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 节点更新求变化值的和的更多相关文章
- BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 10374 Solved: 4535[Subm ...
- HDOJ-4027(线段树+区间更新(每个节点更新的值不同))
Can You answer these queries? HDOJ-4027 这道题目和前面做的题目略有不同.以前的题目区间更新的时候都是统一更新的,也就是更新相同的值.但是这里不一样,这里更新的每 ...
- [NOI2005]维修数列 Splay tree 区间反转,修改,求和,求最值
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1500 Description Input 输入文件的第1行包含两个数N和M,N表示初始时数 ...
- 【HDU】1754 I hate it ——线段树 单点更新 区间最值
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 线段树&&线段树的创建线段树的查询&&单节点更新&&区间更新
目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...
- poj 2777(线段树的节点更新策略)
/* 之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新 通过子节点的颜色情况来判断父节点的颜色情况 !这就是TLE的原因! 后来想一想没有必要 !加入[a ...
- c# winform TreeView NODE(节点) 重命名或获取节点修改后的值
在程序开发过程中我们经常用到treeview,还经常要修改节点的名字.节点名字修改后还想及时更新数据库.这时问题就来了,怎样获取NODE(节点)更新后的值呢?本人试了很多方法最终分析出treeview ...
- Codeforces 444C DZY Loves Colors(线段树)
题目大意:Codeforces 444C DZY Loves Colors 题目大意:两种操作,1是改动区间上l到r上面德值为x,2是询问l到r区间总的改动值. 解题思路:线段树模板题. #inclu ...
- WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)
上一章节我们讲到wpf的柱状图组件,它包含了非轮询方式更新数据库变化SqlDependency的内容,但是没有详细解释,现在给大家一个比较简单的例子来说明这部分内容. 上一章节: WPF柱状图(支持数 ...
随机推荐
- redis本地安装与开发
一.安装(MAC) https://redis.io sudo mv redis-4.0.11.tar.gz /usr/localcd /usr/localsudo tar -zxf redis-4. ...
- JVM线程与Linux内核线程的映射[转]
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...
- objectbox基础
objectbox基础 参考链接 官网地址 http://objectbox.io github地址 https://github.com/objectbox/objectbox-java https ...
- IP查询系统的异步回调案例
package com.lxj.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.Inpu ...
- Win10 系统安装Sql Server2008 R2 数据库遇到的问题及解决办法总结!
1.开始安装时,提示要先安装 “.NET Framework 3.5(包括.NET 2.0和3.0)”,之前已经下载好.NET Framework 3.5 sp1,安装时还是提示要先安装 “.NET ...
- java 读取txt,java读取大文件
java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File;import java.io.RandomAccessFile;i ...
- 几个windows使用小技巧
windows使用技巧 保存网页上图片时,可以按住左键把图片拖到右下角(win+D,双屏幕直接拖动)然后就可以放在桌面啦 放大镜-->Win+加号或者减号(放大或缩小).Win + Esc(退出 ...
- (转)使用JDK中的Proxy技术实现AOP功能
http://blog.csdn.net/yerenyuan_pku/article/details/52863780 AOP技术在企业开发中或多或少都会用到,但用的最多的大概就是做权限系统时,在做权 ...
- Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现)
1. 为什么需要多线程下载? 服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...
- HDU 5768Lucky7(多校第四场)容斥+中国剩余定理(扩展欧几里德求逆元的)+快速乘法
地址:http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Time Limit: 2000/1000 MS (Java/Others) M ...