首页 > 其他分享 >【线段树/懒标】-【LG】P1253 扶苏的问题

【线段树/懒标】-【LG】P1253 扶苏的问题

时间:2024-01-16 23:01:38浏览次数:27  
标签:LG P1253 tag1 int 修改 懒标 区间 inline inf

\(\mathtt{TAGS}\): 懒标线段树
\(\mathtt{ESTIMATION}\):Tag * 2

题意

实现:

  • 区间 \(\max\)
  • 区间修改某个值
  • 区间加

First. 确定数据结构

很显然,区间修改 + 区间查询所以——线段树。

Second. LazyTag

由于区间修改和区间加两个操作会互相干扰,所以对于每一个节点给两个 Tag,一个代表修改操作,一个代表加操作。

下文中,\(Tag1\) 为加,\(Tag2\) 为修改。

Third. 修改 And 加

递归进行,对于待修改区间,无论之前该区间加了多少次,修改都是直接覆盖,所以 \(Tag1\) 清空,\(Tag2 = x\)。

对于待加区间,先不管在此次操作之前的修改操作,直接修改区间值,并 \(Tag1 = Tag1 + x\)。

Fourth. 下放

由于不需要管每次修改操作之前的加操作,所以如果 \(Tag1 \ne 0\) 那么一定是在修改之后操作的,于是乎先下放修改操作,再下放加的操作。

注意
由于可能操作为修改区间中的数为 0,那么 Tag2 初值应该为一个不可能修改为的数,然后在 edit 函数判断是否有修改操作。

Code

#include <iostream>
using namespace std;
typedef long long ll;
#define inf (int)1e18
const int N = 1e6 + 10;
#define int ll
int n, m;
inline int max(int a, int b) {return a > b ? a : b;}
struct node {int l, r, val, tag1, tag2;}t[N * 4];
int a[N];
inline void build (int p, int l, int r) {
    if(l == r) t[p] = {l, r, a[l], 0, inf};
    else build(p * 2, l, (l + r) >> 1), build(p * 2 + 1, (l + r >> 1) + 1, r), t[p] = {l, r, max(t[p * 2].val, t[p * 2 + 1].val), 0, inf};
}
inline void add (int p, int k) {t[p].tag1 += k, t[p].val += k;}
inline void edit (int p, int k) {if(k == inf) return;t[p].tag2 = k, t[p].tag1 = 0, t[p].val = k;}
inline void pushdown (int p) {
    edit(p * 2, t[p].tag2), edit(p * 2 + 1, t[p].tag2);
    add (p * 2, t[p].tag1), add (p * 2 + 1, t[p].tag1);
    t[p].tag1 = 0, t[p].tag2 = inf;
}
inline void updata1 (int p, int l, int r, int k) {
    if(t[p].l > r || t[p].r < l) return;
    if(t[p].l >= l && t[p].r <= r) {add (p, k);return;}
    if(t[p].l < t[p].r) {
        pushdown(p);
        updata1 (p * 2, l, r, k), updata1(p * 2 + 1, l, r, k);
        t[p].val = max(t[p * 2].val, t[p * 2 + 1].val);
    }
}
inline void updata2 (int p, int l, int r, int k) {
    if(t[p].l > r || t[p].r < l) return;
    if(t[p].l >= l && t[p].r <= r) {edit(p, k); return;}
    if(t[p].l < t[p].r) {
        pushdown(p);
        updata2 (p * 2, l, r, k), updata2 (p * 2 + 1, l, r, k);
        t[p].val = max(t[p * 2].val, t[p * 2 + 1].val); 
    }
}
inline ll getmax (int p, int l, int r) {
    if(t[p].l > r || t[p].r < l) return -inf;
    if(t[p].l >= l && t[p].r <= r) return t[p].val;
    pushdown(p);
    return max(getmax(p * 2, l, r), getmax(p * 2 + 1, l, r));
}
const int bufsize = 220005;
char gtchar(){
    static char buf[bufsize], *p1 = buf, *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, bufsize, stdin), p1 == p2)? EOF: *p1++;
}
ll read(){
	ll ret = 0;
	char ch = gtchar();
	bool f = false;
	while(ch < '0' || ch > '9') f |= ch == '-', ch = gtchar();
	while(ch >= '0' && ch <= '9') ret = ret * 10 + (ch ^ 48), ch = gtchar();
	return f? -ret: ret;
}
int opt, l, r, x;

signed main() {
    // ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    n = read(), m = read();
    for (int i = 1; i <= n; i = -~i) a[i] = read();
    build(1, 1, n);
    while(m --) {
        opt = read(), l = read(), r = read();
        if(opt == 1) x = read(), updata2 (1, l, r, x);
        else if(opt == 2) x = read(), updata1 (1, l, r, x);
        else printf("%lld\n", getmax(1, l, r));
    }
    return 0;
}

标签:LG,P1253,tag1,int,修改,懒标,区间,inline,inf
From: https://www.cnblogs.com/Ice-lift/p/17968783

相关文章

  • 基于标签值分布的强化学习推荐算法(Reinforcement Learning Recommendation Algorithm
    前言看论文的第三天,坚持下去。慢慢来,比较快。——唐迟本文基于2023年6月28日发表在MATHEMATICS上的一篇名为“基于标签值分布的强化学习推荐算法”(ReinforcementLearningRecommendationAlgorithmBasedonLabelValueDistribution)的文章。文章提出了一种基于标签分布......
  • JavaSE(13) - 常见算法 algorithm
    JavaSE(13)-常见算法algorithm查找算法Search基本查找BasicSearchpackagealgorithm.search;/*BasicSearch1.用基本查找,查找某个元素在数组中的索引(不考虑重复元素)2.用基本查找,查找某个元素在数组中的索引(考虑重复元素)*/publicclassBasicSearch{public......
  • The 2nd Universal Cup Stage 18: Dolgoprudny H
    题意大概是说求有所有有标号有根树及其黑白染色方案使得定义\(S_{x}\)为\(x\)和其儿子节点构成的集合,则\(S_{x}\)中的黑色节点个数要求不少于白色节点个数,且定义\(x\)的白色节点个数为\(cnt_{x}\),则其方案的贡献为\(\sum_{i=1}^{n}cnt_{i}!\)(原题意这里似乎说的非常抽......
  • 洛谷比赛【LGR-171-Div.3】深圳科创学院基础赛 #7 &「RHOI」Round 2 赛后总结
    洛谷比赛【LGR-171-Div.3】深圳科创学院基础赛#7&「RHOI」Round2赛后总结比赛链接:https://www.luogu.com.cn/contest/146495建议先看原题再看文章。A-Water(P10056)有\(n\)个杯子,每个杯子的容积是\(a\),且初始装有\(b\)体积水。你可以进行任意次操作,每次操作选择任......
  • LGR-171
    2024首个AK的比赛,祭。Water分析注意到答案一定是\(b\)的倍数,那么究竟是多少倍呢?如果\(\lfloor\frac{a}{b}\rfloor<n\)那么可以达到的就是比\(a\)小的最大\(b\)的倍数,否则是\(n\timesb\)。Line分析注意到本题答案\(ans\in\{0,1,2\}\),且如果\(x_c\in\{x_a,x_b......
  • 基于融合语义信息改进的内容推荐算法。Improved content recommendation algorithm in
    引言路漫漫其修远兮,吾将上下而求索。每天一篇论文,做更好的自己。本文读的这篇论文为发表于2023年5月28日的一篇名为《基于融合语义信息改进的内容推荐算法》(基于融合语义信息改进的内容推荐算法)的文章,文章主要介绍了基于内容的推荐技术在电子商务和教育领域的广泛应用,以及传统基......
  • Top-N推荐算法 Top-N recommendation Algorithms
    引言推荐算法是计算机专业中的一种算法,通过一些计算,能够推测用户喜欢的东西,在互联网环境中应用比较广泛。Top-N算法在生活中非常常见,比如学术论文推荐论文、音乐软件推荐歌曲等。今天看到一篇名叫"ARevisitingStudyofAppropriateOfflineEvaluationforTop-NRecommendati......
  • Proximal Policy Optimization (PPO): A Robust and Efficient RL Algorithm
    1.背景介绍ProximalPolicyOptimization(PPO)是一种强化学习(ReinforcementLearning,RL)算法,它在许多实际应用中表现出色,具有较强的鲁棒性和效率。在这篇文章中,我们将详细介绍PPO的核心概念、算法原理、具体实现以及潜在的未来趋势和挑战。1.1强化学习简介强化学习是一种......
  • 【LGR-170-Div.3】洛谷基础赛 #6 & Cfz Round 3 & Caféforces #2
    这套题感觉质量很高A.Battle\[x\equivr(\bmodP)\]\[P\midx-r\]因此只有第一次操作是有效的voidsolve(){ intn,m,p; cin>>n>>m>>p; m-=m%p; if(!m)puts("Alice"); else{ n-=n%p; if(!n)puts("Bob"); else......
  • A Long read hybrid error correction algorithm based on segmented pHMM
    ALongreadhybriderrorcorrectionalgorithmbasedonsegmentedpHMM  2023/12/1511:06:36The"LongreadhybriderrorcorrectionalgorithmbasedonsegmentedpHMM"referstoaspecificapproachforerrorcorrectioninlong-readse......