首页 > 其他分享 >lgP4513 小白逛公园

lgP4513 小白逛公园

时间:2024-07-14 11:56:40浏览次数:21  
标签:Info std return int void lgP4513 小白 info 逛公园

有n个公园,小白对第i个公园的评分为A[i],有m次操作:

  • 1 a b 表示在[a,b]范围内选择一段连续的公园遛狗;
  • 2 a b 表示小白对公园a的评分修改为b;

对于操作1,输出可以取得的最大评分。

分析:线段树维护区间子段和。

#include <bits/stdc++.h>
using llong = long long;

const int inf = 1e9;

template<class Info>
struct SegmentTree {
    int n;
    std::vector<Info> info;
    SegmentTree():n(0) {}
    SegmentTree(int _n, Info v = Info()) {
        init(_n, v);
    }
    void init(int _n, Info v = Info()) {
        init(std::vector<Info>(_n, v));
    }
    template<class T>
    SegmentTree(std::vector<T> v) {
        init(v);
    }
    template<class T>
    void init(std::vector<T> v) {
        n = v.size();
        info.assign(4 << std::__lg(n), Info());
        std::function<void(int,int,int)> build = [&](int x, int l, int r) {
            if (l + 1 == r) {
                info[x] = v[l];
                return;
            }
            int m = (l + r) / 2;
            build(2*x+1, l, m);
            build(2*x+2, m, r);
            pushup(x);
        };
        build(0, 0, n);
    }
    void pushup(int x) {
        info[x] = info[2*x+1] + info[2*x+2];
    }
    void assign(int x, int l, int r, int p, const Info &v) {
        if (l + 1 == r) {
            info[x] = v;
            return;
        }
        int m = (l + r) / 2;
        if (p < m) {
            assign(2*x+1, l, m, p, v);
        } else {
            assign(2*x+2, m, r, p, v);
        }
        pushup(x);
    }
    void assign(int p, const Info &v) {
        assign(0, 0, n, p, v);
    }
    void add(int x, int l, int r, int p, const Info &v) {
        if (l + 1 == r) {
            info[x] += v;
            return;
        }
        int m = (l + r) / 2;
        if (p < m) {
            add(2*x+1, l, m, p, v);
        } else {
            add(2*x+2, m, r, p, v);
        }
        pushup(x);
    }
    void add(int p, const Info &v) {
        add(0, 0, n, p, v);
    }
    Info rangeQuery(int x, int l, int r, int L, int R) {
        if (R <= l || r <= L) {
            return Info();
        }
        if (L <= l && r <= R) {
            return info[x];
        }
        int m = (l + r) / 2;
        return rangeQuery(2*x+1, l, m, L, R) + rangeQuery(2*x+2, m, r, L, R);
    }
    Info rangeQuery(int L, int R) {
        return rangeQuery(0, 0, n, L, R);
    }
    template<class F>
    int findFirst(int x, int l, int r, int L, int R, F pred) {
        if (R <= l || r <= L || !pred(info[x])) {
            return -1;
        }
        if (l + 1 == r) {
            return l;
        }
        int m = (l + r) / 2;
        int res = findFirst(2*x+1, l, m, L, R, pred);
        if (res == -1) {
            res = findFirst(2*x+2, m, r, L, R, pred);
        }
        return res;
    }
    template<class F>
    int findFirst(int L, int R, F pred) {
        return findFirst(0, 0, n, L, R, pred);
    }
    template<class F>
    int findLast(int x, int l, int r, int L, int R, F pred) {
        if (R <= l || r <= L || !pred(info[x])) {
            return -1;
        }
        if (l + 1 == r) {
            return l;
        }
        int m = (l + r) / 2;
        int res = findLast(2*x+2, m, r, L, R, pred);
        if (res == -1) {
            res = findLast(2*x+1, l, m, L, R, pred);
        }
        return res;
    }
    template<class F>
    int findLast(int L, int R, F pred) {
        return findLast(0, 0, n, L, R, pred);
    }
    void print(int x, int l, int r) {
        std::cerr << x << "(" << l << "," << r << "): " << info[x] << "\n";
        if (l + 1 < r) {
            int m = (l+r) / 2;
            print(2*x+1, l, m);
            print(2*x+2, m, r);
        }
    }
    void print() {
        std::cerr << "--------------------------------\n";
        print(0, 0, n);
    }
};

struct Info {
    int pre;
    int max;
    int suf;
    int sum;
    Info(int s=-inf) {
        pre = max = suf = sum = s;
    }
    friend Info operator+(const Info &a, const Info &b) {
        if (a.max == -inf) return b;
        if (b.max == -inf) return a;
        Info ans;
        ans.pre = std::max(a.pre, a.sum + b.pre);
        ans.suf = std::max(b.suf, a.suf + b.sum);
        ans.sum = a.sum + b.sum;
        ans.max = std::max({a.max, b.max, a.suf + b.pre});
        return ans;
    }
    friend std::ostream& operator<<(std::ostream &out, Info &info) {
        out << "info:(" << ")";
        return out;
    }
};

void solve() {
    int n, m;
    std::cin >> n >> m;
    std::vector<int> A(n);
    for (int i = 0; i < n; i++) {
        std::cin >> A[i];
    }
    SegmentTree<Info> tr(A);
    for (int i = 0; i < m; i++) {
        int k, a, b;
        std::cin >> k >> a >> b;
        if (k == 1) {
            if (a > b) std::swap(a, b);
            std::cout << tr.rangeQuery(a-1, b).max << "\n";
        } else if (k == 2) {
            tr.assign(a-1, b);
        }
    }
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:Info,std,return,int,void,lgP4513,小白,info,逛公园
From: https://www.cnblogs.com/chenfy27/p/18301318

相关文章

  • 【带小白做项目】SpringBoot:初识SpringBoot,搭建我们的第一个SpringBoot项目框架
    一事前准备工作    在我们使用SpringBoot框架搭建项目前,要首先完成JDK和Maven的安装及配置。        JDK是Java编程的基础,已经开始学习SpringBoot的同学应该已经对JDK的安装配置方法烂熟于心了,这里不再赘述,大家可以参考jdk8的安装教程保姆级,超详细(自带下载......
  • WPF中style的应用(小白快速上手)
    1.解释说明    -通过设置style资源词典可以批量设置控件,不仅节省大量时间,还能方便统一修改    -重复利用Border这个控件,可以自由设计新的控件风格    -这里要注意,虽然style也是写在xaml文件中,但是其文件类型为资源词典类型,这里程序示例也进行不......
  • 电源纹波测试,从原理图到PCB板和示波器探头设置详解(适合新手小白)
    一、什么是纹波?    简单来说纹波就是叠加在直流信号上的交流干扰信号,是衡量电源好坏的一个重要标准。二、纹波测试点在原理图什么位置?    严谨起见我们尽量选择电路的终端进行测试,比如给MCU芯片供电的引脚,我们需要测量放置在MCU端的电容两端的纹波。如下图......
  • 适合小白学校的springboot2 vue3 图书管理系统idea开发mysql数据库
    博主介绍:专注于Java.net phpphython 小程序等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟我的博客空间发布了1000+毕设题目方便大家学习使用感兴趣的可以先收藏起来,还有大家在......
  • 拿AI做副业,零门槛简单操作,小白也能轻松入门!
    前言在过去的23年,这一年称人们之为AIGC的元年,特别是openAI发布了GPT,随着AI爆火,一时间,各种玩法是层出不穷,早期靠AI做项目的也是赚的盆满钵满。我不知道小伙伴们发现了没有,现如今AI正在慢慢改变我们的生活,说个简单的例子,midjourney,这是一个画图的AI,之前设计一张图需要三......
  • AI绘画Stable Diffusion应用场景探索,AI绘画到底能做什么?小白入门必看!
    大家好,我是画画的小强StableDiffusion自2022年开源发布以来,其应用场景已经迅速扩展到了多个领域,艺术家和设计师使用SD来生成创意图像,探索新的视觉风格,或者作为灵感来源。它可以用于生成插图、概念艺术、角色设计等。游戏开发者利用SD来快速创建游戏资产,如角色、环境和道具......
  • 新手小白必须得学会的文本文件操作,资料资源均可分享!
    文件读取处理使用read():#使用'read'方法读取文件的所有内容withopen('resources/training_log.txt','r')asfile:content=file.read()print(content)#报错处理版本#使用'read'方法读取文件的所有内容#使用'utf-8'......
  • AI绘画零基础入门必看,新手小白扫盲教程,一文搞懂MIdjourney和Stable Diffusion有什么不
    大家好,我是画画的小强Midjourney是目前全网最强大的AI绘画平台,用户只需要简单地输入关键词描述,就能获得多幅风格各异的绘画作品,无需任何专业的绘画技能,即刻拥有让人惊叹的艺术创造力。在MidjourneyV5版本之前,用户可以享受免费使用额度,只需要注册一个账户即可在线体验AI......
  • 【Python干货推荐】小白学习Python,自学Python看这10本书就够了
    Python是一种通用的解释型编程,主要用于Web开发、机器学习和复杂数据分析。Python对初学者来说是一种完美的语言,因为它易于学习和理解,随着这种语言的普及,Python程序员的机会也越来越大。如果你想学习Python编程,市场上就有很多的书籍。近日,hackr社区推荐了10本最佳的Python书......
  • 小白也能一秒读懂文献!
    现在越来越多的人都开始使用AI工具来辅助写论文和科研了,我自己也是AI工具重度使用者,在阅读文献时,使用AI工具来帮助我简直不要太高效,正好也给大家分享一下我经常使用的一个工具,小白也能轻松阅读专业文献!包阅AI一键搞定!一个AI工具就能帮你读文献+生成思维导图+论文润色。免......