Codeforces 444C 线段树 懒惰标记
前天晚上的CF比赛div2的E题,很明显一个线段树,当时还在犹豫复杂度的问题,因为他是区间修改和区间查询,肯定是要用到懒惰标记。
然后昨天真的是给这道题跪了,写了好久好久,。。。我本来是写了个add标记作为累加用,因为这个题目很明显是累加型的懒惰标记,但是后来不知道脑子怎么想的,又把add标记给删了,认为只要用一个set标记标注此时该树是否是连续相同的,如果是,则值就存在setv【rt】中,然后就开始了漫长的WA的过程,很明显,我这样是采用了覆盖性的懒惰标记,每次我pushdonw下去 还要先pushdonw下一层的,。。。如果真这么写 绝壁TL,不这么写 肯定WA,。。明显一个累加型的懒惰标记,硬是给我写跪了,其实我后来意识到了要用累加型的,可是就是想沿着这个思路 改好。。最后躺在床上一想,真的只能用累加型的懒惰标记
发现线段树的懒惰标记这一块真的还不熟练,各种容易出错。。。赶紧练
#include <iostream>
#include <cstdio>
#include <cstring>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define LL __int64
using namespace std;
const int N=+;
LL d[N<<],cur[N<<],flag[N<<],add[N<<];
int n,m;
LL abs(LL x){
if (x<) return -x;
return x;
}
void build(int rt,int l,int r)
{
d[rt]=cur[rt]=flag[rt]=add[rt]=;
if (l>=r){
cur[rt]=l;
flag[rt]=;
return;
}
int mid=(l+r)>>;
build(lson);
build(rson);
}
void up(int rt,int l,int r)
{
d[rt]=d[rt<<]+d[rt<<|];
if (flag[rt<<] && flag[rt<<|] && cur[rt<<]==cur[rt<<|]){
cur[rt]=cur[rt<<];
flag[rt]=;
}
else{
flag[rt]=;
}
}
void pushdown(int rt,int l,int r)
{
if (l>=r) return;
int mid=(l+r)>>;
if (add[rt]>){
d[rt<<]+=add[rt]*(mid-l+);
d[rt<<|]+=add[rt]*(r-mid);
add[rt<<]+=add[rt];
add[rt<<|]+=add[rt];
add[rt]=;
}
if (flag[rt]>){
cur[rt<<]=cur[rt<<|]=cur[rt];
flag[rt<<]=flag[rt<<|]=;
}
}
void fix(int L,int R,LL v,int rt,int l,int r)
{
int mid=(l+r)>>;
if (L<=l && r<=R){
if (flag[rt]>){
d[rt]+=abs(v-cur[rt])*(r-l+);
add[rt]+=abs(v-cur[rt]);
cur[rt]=v;
return;
}
}
pushdown(rt,l,r);
if (L<=mid) fix(L,R,v,lson);
if (R>mid) fix(L,R,v,rson);
up(rt,l,r); }
LL query(int L,int R,int rt,int l,int r)
{
//pushdown(rt,l,r);
if (L<=l && r<=R) return d[rt];
int mid=(l+r)>>;
pushdown(rt,l,r);
LL ret1,ret2;
ret1=ret2=;
if (L<=mid) ret1=query(L,R,lson);
if (R>mid) ret2=query(L,R,rson);
return ret1+ret2;
}
int main()
{
int op,a,b;
LL c;
while (scanf("%d%d",&n,&m)!=EOF)
{
build(,,n);
while (m--)
{
scanf("%d",&op);
if (op==){
scanf("%d%d%I64d",&a,&b,&c);
fix(a,b,c,,,n);
}
else{
scanf("%d%d",&a,&b);
LL ans=query(a,b,,,n);
printf("%I64d\n",ans);
}
}
}
return ;
}
Codeforces 444C 线段树 懒惰标记的更多相关文章
- Transformation HDU - 4578(线段树——懒惰标记的妙用)
Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, …, a n. The initial val ...
- 【HDU】4092 Nice boat(多校第四场1006) ——线段树 懒惰标记
Nice boat Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...
- CodeForces 444C 线段树
想分块想了很久一点思路都没有,结果一看都是写的线段树= = ...完全忘记了还有线段树这种操作 题意:给一个数组,一种操作是改变l到r为c,还有一种操作是查询l到r的总和差 线段树记得+lazy标记 ...
- DZY Loves Colors CodeForces - 444C (线段树势能分析)
大意:有$n$个格子, 初始$i$位置的颜色为$i$, 美丽值为0, 有两种操作 将区间$[l,r]$内的元素全部改为$x$, 每个元素的美丽值增加$|x-y|$, $y$为未改动时的值 询问区间$[ ...
- hdu-3397 Sequence operation 线段树多种标记
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3397 题目大意: 0 a b表示a-b区间置为0 1 a b表示a-b区间置为1 2 a b表示a- ...
- HDU 3468:A Simple Problem with Integers(线段树+延迟标记)
A Simple Problem with Integers Case Time Limit: 2000MS Description You have N integers, A1, A2, ... ...
- Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论
Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...
- Codeforces 1149C - Tree Generator™(线段树+转化+标记维护)
Codeforces 题目传送门 & 洛谷题目传送门 首先考虑这个所谓的"括号树"与直径的本质是什么.考虑括号树上两点 \(x,y\),我们不妨用一个"DFS&q ...
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记
E. A Simple Task time limit per test5 seconds memory limit per test512 megabytes inputstandard input ...
随机推荐
- C# FTp 上传,下载
public class FtpHelper { string ftpServerIP; string ftpRemotePath; string ftpUserID; string ftpPassw ...
- ie brower 点击用默认浏览器打开链接
<script> function GetCurrentJumpUrl(){ var eleLink = document.getElementById('adLink'); if(ele ...
- 5G/NR 波束管理
原文链接:http://www.sharetechnote.com/html/5G/5G_Phy_BeamManagement.html 1 为什么光束管理/光束控制? 我不认为高频部署中的波束传输信 ...
- js - 获取当前年月日
var date = new Date(); date .getYear(); //获取当前年份(2位) date .getFullYear(); //获取完整的年份(4位) date .getMon ...
- python 文本文件操作
文件操作三步走:打开.读写.关闭. open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, close ...
- 开源DDD设计模式框架YMNNetCoreFrameWork第一篇
DDD设计模式:仓储.领域模型.应用层.聚合根.事件总线,以业务模型驱动设计,从数据模型驱动脱离,不用关心数据库设计,开发效率更高 DDD领域驱动设计模型概念不再讲解,直接上技术 框架搭建: 如图所示 ...
- 【转】Spark Streaming 实时计算在甜橙金融监控系统中的应用及优化
系统架构介绍 整个实时监控系统的架构是先由 Flume 收集服务器产生的日志 Log 和前端埋点数据, 然后实时把这些信息发送到 Kafka 分布式发布订阅消息系统,接着由 Spark Streami ...
- Codeforces Forethought Future Cup Elimination Round 选做
1146C Tree Diameter 题意 交互题.有一棵 \(n(n\le 100)\) 个点的树,你可以进行不超过 \(9\) 次询问,每次询问两个点集中两个不在同一点集的点的最大距离.求树的直 ...
- 深度学习之常用linux命令总结
深度学习中常用linux命令总结 1.创建文件夹 mkdir 文件名2.删除文件 rm -d 目录名 #删除一个空目录 rmdir 目录名 #删除一个空目录 rm -r 目录名 #删除一个非空目录 r ...
- Django(五)1 - 4章实战:从数据库读取图书列表并渲染出来、通过url传参urls.py path,re_path通过url传参设置、模板语法
一.从数据库读取图书数据并渲染出来 1)app1/views.py函数books编写 [1]从模型下导入bookinfo信息 [2]从数据库获取图书对象列表 [3]把获取到的图书对象赋值给books键 ...