博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 444 C. DZY Loves Colors(线段树)
阅读量:7036 次
发布时间:2019-06-28

本文共 2271 字,大约阅读时间需要 7 分钟。

题目大意:

1 l r x操作 讲 [l,r]上的节点涂成x颜色,而且每一个节点的值都加上 |y-x| y为涂之前的颜色

2 l r  操作,求出[l,r]上的和。

思路分析:

假设一个区间为同样的颜色。那么我们才干够合并操作。

所以我们之前找同样的区间就好。

可是问题是怎样合并操作。

那么我们定义一个val  表示这个区间每一个位置上应该加上的值。

pushdown 的时候这个值是能够相加的。

#include 
#include
#include
#include
#define maxn 100005#define lson num<<1,s,mid#define rson num<<1|1,mid+1,eusing namespace std;typedef long long LL;LL color[maxn<<2];LL sum[maxn<<2];LL val[maxn<<2];LL Abs(LL x){ return x>0?x:-x;}void pushdown(int num,int s,int e){ if(color[num]!=-1) { int mid=(s+e)>>1; sum[num<<1]+=val[num]*(mid-s+1); sum[num<<1|1]+=val[num]*(e-mid); val[num<<1]+=val[num]; val[num<<1|1]+=val[num]; color[num<<1]=color[num<<1|1]=color[num]; color[num]=-1; val[num]=0; }}void pushup(int num){ if(color[num<<1]==color[num<<1|1]) color[num]=color[num<<1]; else color[num]=-1; sum[num]=sum[num<<1]+sum[num<<1|1];}void build(int num,int s,int e){ sum[num]=0; val[num]=0; color[num]=-1; if(s==e) { color[num]=s; return; } int mid=(s+e)>>1; build(lson); build(rson);}void update(int num,int s,int e,int l,int r,LL v){ if(l<=s && r>=e) { if(color[num]!=-1) { sum[num]+=(LL)Abs(v-color[num])*(e-s+1); val[num]+=Abs(color[num]-v); color[num]=v; return; } } int mid=(s+e)>>1; pushdown(num,s,e); if(l<=mid)update(lson,l,r,v); if(r>mid)update(rson,l,r,v); pushup(num);}LL query(int num,int s,int e,int l,int r){ if(l<=s && r>=e) { return sum[num]; } int mid=(s+e)>>1; pushdown(num,s,e); if(r<=mid)return query(lson,l,r); else if(l>mid)return query(rson,l,r); else return query(lson,l,mid)+query(rson,mid+1,r);}int main(){ int n,m; scanf("%d%d",&n,&m); build(1,1,n); while(m--) { int type; scanf("%d",&type); if(type==1){ int l,r; LL x; scanf("%d%d%I64d",&l,&r,&x); update(1,1,n,l,r,x); } else { int l,r; scanf("%d%d",&l,&r); printf("%I64d\n",query(1,1,n,l,r)); } } return 0;}/*10 101 5 9 62 6 101 1 9 31 3 10 52 4 6*/

转载地址:http://bejal.baihongyu.com/

你可能感兴趣的文章
×_7_12_2013 I: Light on or off
查看>>
JIT
查看>>
巧用escalations限制Nagios报警次数 - [Nagios
查看>>
Entity SQL与LINQ TO Entity的本质区别
查看>>
python unittest 深入failfast及实际应用【示例】
查看>>
MSSQL中文排序规则设置
查看>>
30 个有关 Python 的小技巧
查看>>
CDN下nginx获取用户真实IP地址
查看>>
Jsp技术总结
查看>>
Sakai 11.x Build Failure
查看>>
面向对象+模块化设计绘制canvas星空动画
查看>>
Debian 从稳定版升级到测试版
查看>>
Elastic Search学习笔记3——集群配置
查看>>
时空表单的一些心得
查看>>
Mysql学习总结(2)——Mysql超详细Window安装教程
查看>>
gradle入门
查看>>
Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例
查看>>
HTTP简介
查看>>
static Import 的用途
查看>>
第一天
查看>>