首页 > 编程语言 >(线段树,最小值不能低于0的)北京建筑大学2024年程序设计竞赛 A 寿命修改

(线段树,最小值不能低于0的)北京建筑大学2024年程序设计竞赛 A 寿命修改

时间:2024-06-30 21:09:53浏览次数:13  
标签:return int 线段 2024 -- 最小值 sm size op

题意:

code:

#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
using u64 = unsigned long long;
using PII = pair<i64, i64>;
const int inf = 0x3f3f3f3f;
const i64 INF = 0x3f3f3f3f3f3f3f3f;
#define Z cout << "\n"
#define lb lower_bound
#define ub upper_bound
#define D(x) cerr << #x << ": " << (x) << "\n"
#define DV(v) cerr<<#v<<": ";for(int i=0;i<(v).size();i++)cerr<<((v)[i])<<",";cerr<<"\n"
#if 1
#define int i64
#endif
namespace lazyseg {
    int ceil_pow2(int n) {
        int x = 0;
        while ((1U << x) < (unsigned int) (n)) x++;
        return x;
    }
    template <class S,
        S(*op)(S, S),
        S(*e)(),
        class F,
        S(*mapping)(F, S),
        F(*composition)(F, F),
        F(*id)()>
    struct lazy_segtree {
    public:
        lazy_segtree() : lazy_segtree(0) {}
        explicit lazy_segtree(int n) : lazy_segtree(std::vector<S>(n, e())) {}
        explicit lazy_segtree(const std::vector<S>& v) : _n(int(v.size())) {
            log = ceil_pow2(_n);
            size = 1 << log;
            d = std::vector<S>(2 * size, e());
            lz = std::vector<F>(size, id());
            for (int i = 0; i < _n; i++) d[size + i] = v[i];
            for (int i = size - 1; i >= 1; i--) {
                update(i);
            }
        }
        void set(int p, S x) {
            assert(0 <= p && p < _n);
            p += size;
            for (int i = log; i >= 1; i--) push(p >> i);
            d[p] = x;
            for (int i = 1; i <= log; i++) update(p >> i);
        }
        S get(int p) {
            assert(0 <= p && p < _n);
            p += size;
            for (int i = log; i >= 1; i--) push(p >> i);
            return d[p];
        }
        S query(int l, int r) {
            assert(0 <= l && l <= r && r <= _n);
            if (l == r) return e();
            l += size;
            r += size;
            for (int i = log; i >= 1; i--) {
                if (((l >> i) << i) != l) push(l >> i);
                if (((r >> i) << i) != r) push((r - 1) >> i);
            }
            S sml = e(), smr = e();
            while (l < r) {
                if (l & 1) sml = op(sml, d[l++]);
                if (r & 1) smr = op(d[--r], smr);
                l >>= 1;
                r >>= 1;
            }
            return op(sml, smr);
        }
        S all_query() { return d[1]; }
        void apply(int p, F f) {
            assert(0 <= p && p < _n);
            p += size;
            for (int i = log; i >= 1; i--) push(p >> i);
            d[p] = mapping(f, d[p]);
            for (int i = 1; i <= log; i++) update(p >> i);
        }
        void apply(int l, int r, F f) {
            assert(0 <= l && l <= r && r <= _n);
            if (l == r) return;
            l += size;
            r += size;
            for (int i = log; i >= 1; i--) {
                if (((l >> i) << i) != l) push(l >> i);
                if (((r >> i) << i) != r) push((r - 1) >> i);
            }
            {
                int l2 = l, r2 = r;
                while (l < r) {
                    if (l & 1) all_apply(l++, f);
                    if (r & 1) all_apply(--r, f);
                    l >>= 1;
                    r >>= 1;
                }
                l = l2;
                r = r2;
            }
            for (int i = 1; i <= log; i++) {
                if (((l >> i) << i) != l) update(l >> i);
                if (((r >> i) << i) != r) update((r - 1) >> i);
            }
        }
        template <bool(*g)(S)> int max_right(int l) {
            return max_right(l, [] (S x) { return g(x); });
        }
        template <class G> int max_right(int l, G g) {
            assert(0 <= l && l <= _n);
            assert(g(e()));
            if (l == _n) return _n;
            l += size;
            for (int i = log; i >= 1; i--) push(l >> i);
            S sm = e();
            do {
                while (l % 2 == 0) l >>= 1;
                if (!g(op(sm, d[l]))) {
                    while (l < size) {
                        push(l);
                        l = (2 * l);
                        if (g(op(sm, d[l]))) {
                            sm = op(sm, d[l]);
                            l++;
                        }
                    }
                    return l - size;
                }
                sm = op(sm, d[l]);
                l++;
            } while ((l & -l) != l);
            return _n;
        }
        template <bool(*g)(S)> int min_left(int r) {
            return min_left(r, [] (S x) { return g(x); });
        }
        template <class G> int min_left(int r, G g) {
            assert(0 <= r && r <= _n);
            assert(g(e()));
            if (r == 0) return 0;
            r += size;
            for (int i = log; i >= 1; i--) push((r - 1) >> i);
            S sm = e();
            do {
                r--;
                while (r > 1 && (r % 2)) r >>= 1;
                if (!g(op(d[r], sm))) {
                    while (r < size) {
                        push(r);
                        r = (2 * r + 1);
                        if (g(op(d[r], sm))) {
                            sm = op(d[r], sm);
                            r--;
                        }
                    }
                    return r + 1 - size;
                }
                sm = op(d[r], sm);
            } while ((r & -r) != r);
            return 0;
        }
    private:
        int _n, size, log;
        std::vector<S> d;
        std::vector<F> lz;
        void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
        void all_apply(int k, F f) {
            d[k] = mapping(f, d[k]);
            if (k < size) lz[k] = composition(f, lz[k]);
        }
        void push(int k) {
            all_apply(2 * k, lz[k]);
            all_apply(2 * k + 1, lz[k]);
            lz[k] = id();
        }
    };
}
using namespace lazyseg;
struct S {
    int sum, cnt, len;
    pair<i64, i64> mn;
};
struct F {
    int add;
};
S op(S l, S r) { return S{ l.sum + r.sum, l.cnt + r.cnt,l.len + r.len, min(l.mn, r.mn) }; }
S e() { return S{ 0, 0, 1,{INF, 0} }; }
S mapping(F f, S x) { return { x.sum + x.cnt * f.add, x.cnt,x.len ,{x.mn.first + f.add, x.mn.second} }; }
F composition(F f, F g) { return F{ f.add + g.add }; }
F id() { return F{ 0 }; }
#define INFO S,op,e,F,mapping,composition,id
signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int n, m;
    cin >> n >> m;
    lazy_segtree<INFO>tr(n + 1);
    for (int i = 0; i < n; i++) {
        int x; cin >> x;
        tr.set(i, { x,1,1,{x,i} });
    }
    while (m--) {
        int op, l, r, x;
        cin >> op >> l >> r;
        l--, r--;
        if (op == 1) {
            cin >> x;
            tr.apply(l, r + 1, { x });
            while (tr.all_query().mn.first <= 0) {
                int i = tr.all_query().mn.second;
                tr.set(i, { 0, 0, 1,{INF, 0} });
            }
        }
        else {
            cout << tr.query(l, r + 1).sum << "\n";
        }
        // for (int i = 1; i <= n; i++)cout << tr.query(i - 1, i).sum << ' '; Z;
    }
    return 0;
}

标签:return,int,线段,2024,--,最小值,sm,size,op
From: https://www.cnblogs.com/iscr/p/18276945

相关文章

  • 2024我们该学习大模型吗?
    一、引言在快速变化的科技行业中,人工智能(AI)大模型已成为研究和应用的热点。随着AI技术的不断进步,特别是在自然语言处理、计算机视觉和机器学习平台等领域,许多专业人士开始将目光投向AI大模型的开发和应用。二、AI大模型兴起的原因AI大模型的兴起得益于几个关键因素。首......
  • 2024 7月idea最新激活方式
     需要工具的可以去领取一下IDEA的简单介绍IDEA全称IntelliJIDEA,是Java语言对的集成开发环境,IDEA在业界被认为是公认最好的Java开发工具。IDEA的主要优势✅功能强大①强大的整合能力。比如:GitMavenSpring等②开箱即用的体验(集成版本控制系统,多语言支持的框架随时可......
  • (log求因数和)北京建筑大学2024年程序设计竞赛 B因数之和
    题意:计算一个数的所有因数的和通常涉及质因数分解,然后对每个质因数的幂次进行求和运算。具体步骤如下:1.质因数分解:首先,将给定的数进行质因数分解,表示为\(2^{a}*3^{b}*5^{c}....\)2.计算每个质因数的贡献:对于每个质因数p(如2,3,5等),计算从p{0}到p的所有数的和3.这可以通过等......
  • Arturia - FX Collection 5 v5.0.0 VST, VST3, AAX x64 {R2R} [13.06.2024]
    Arturia-FXCollection5v5.0.0forWindowsmac【【新品发布+小广告】ArturiaFXCollection5超强音乐制作插件套装34款产品逐一点评】https://www.bilibili.com/video/B...4d4e7f5c56f93e901cd    包括BusEXCITER-104BusFORCEBusPEAKChorusDIMENSION-DCh......
  • FireFox 编译指南2024 Windows10篇-环境准备(一)
    1.引言在开源浏览器项目中,Firefox因其高性能和灵活性而备受开发者青睐。为了在本地环境中编译和定制Firefox,开发者需要做好充分的环境准备工作。这不仅是编译成功的基础,也是后续调试、优化和二次开发的关键步骤。编译Firefox是一个复杂而耗时的过程,涉及大量的代码文件和依赖......
  • 2024Java基础八股文(背诵版)
    Java基础八股文(背诵版)Java语言具有哪些特点?Java为纯面向对象的语言。它能够直接反应现实生活中的对象。具有平台无关性。Java利用Java虚拟机运行字节码,无论是在Windows、Linux还是MacOS等其它平台对Java程序进行编译,编译后的程序可在其它平台运行。Java为解释型......
  • 纯真IP库查询方法(2024-6-19更新qqwry.dat后无法查询,修改代码)
    2024-6-19更新qqwry.dat后使用pthon38那篇文章里的代码无法查询,使用pythom2的代码,修改之后python3可用,将文件放到工程里查询,不用Lib库里的。修改后的qqwry.py如下,python3可用。coding=utf-8forPython2.7为https://pypi.python.org/pypi/qqwry-py3的Python2版版本:2017-10-......
  • XAMPP Windows PHP-CGI 代码执行漏洞(CVE-2024-4577) | Goby漏洞预警
    漏洞描述:PHP是一种在服务器端执行的脚本语言,在PHP的8.3.8版本之前存在命令执行漏洞,由于Windows的“Best-FitMapping”特性,在处理查询字符串时,非ASCII字符可能被错误地映射为破折号(-),导致命令行参数解析错误,当php_cgi运行在Windows平台上,且代码页为繁体中文、简......
  • 2024年商业管理与金融创新国际会议(BMFI 2024)
    2024年商业管理与金融创新国际会议(BMFI2024)2024InternationalConferenceonBusinessManagementandFinancialInnovation【重要信息】大会地点:上海大会官网:http://www.icbmfi.com投稿邮箱:[email protected]【注意:将稿件Word+PDF上传至邮箱,邮件正文请备注“BMFI......
  • 华为在 2024 年 6 月 21 日的华为开发者大会上,华为终端 BG 软件部总裁龚体正式官宣了
    华为在2024年6月21日的华为开发者大会上,华为终端BG软件部总裁龚体正式官宣了华为自研仓颉编程语言,并发布了HarmonyOSNEXT仓颉语言开发者预览版。仓颉编程语言文件后缀名为.cj,以下是第一个入门代码输出:你好,仓颉。仓颉编程语言的名字来自“仓颉造字”。仓......