首页 > 编程语言 >2022年江西省大学生程序设计竞赛 K.Peach Conference 线段树 懒标记清空

2022年江西省大学生程序设计竞赛 K.Peach Conference 线段树 懒标记清空

时间:2023-04-17 16:15:53浏览次数:50  
标签:Conference Peach rs int mn tr ls 2022 mx

传送门

大致题意:

  给定一个n和m,表示有区间大小为n,进行m次操作。
  输入m行,每行3个数字v, l, r。如果v等于0则表示查询[l, r]内桃子的数量,如果v不为0则表示给[l, r]区间修改全部加v,如果有某个点数量+v小于0,则修改为0即可。

大致思路:

  这个题和势能也还是有些关系的。如果要对一个区间加上v,那么这个区间的最大值+v<=0,就需要区间清空,如果一个区间的最小值+v>0,则直接区间修改并且懒标记修改,如果上述两个条件都不满足,则继续递归左右儿子即可。所以考虑线段树上维护最大最小值,区间和,懒标记和区间清空标记。代码中的clear是区间清空标记,lazy是懒标记,mx是区间最大值,mn是区间最小值。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <set>
#include <map>

typedef long long ll;
typedef std::pair<int, int> PII;
#define ls u << 1
#define rs u << 1 |1

const int INF = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 2e5 + 10;

int n, m;

struct node {
	int l, r;
	bool clear;
	ll lazy, mx, mn, sum;
}tr[N << 2];

inline void build(int u, int L, int R) {
	tr[u] = {L, R};
	
	if (L == R) return ;
	
	int mid = L + R >> 1;
	build(ls, L, mid);
	build(rs, mid + 1, R);
}

inline void pushup(int u) {
	tr[u].mx = std::max(tr[ls].mx, tr[rs].mx);
	tr[u].mn = std::min(tr[ls].mn, tr[rs].mn);
	tr[u].sum = tr[ls].sum + tr[rs].sum;
}

inline void pushdown(int u) { 
	if (tr[u].clear) {
		tr[ls].lazy = 0, tr[ls].mx = tr[ls].mn = tr[ls].sum = 0;
		tr[rs].lazy = 0, tr[rs].mx = tr[rs].mn = tr[rs].sum = 0;
		tr[ls].clear = tr[rs].clear = true;	
		tr[u].clear = false;
	}
	
	if (tr[u].lazy) {
		ll &v = tr[u].lazy;
		tr[ls].lazy += v;
		tr[rs].lazy += v;
		tr[ls].sum += v * (tr[ls].r - tr[ls].l + 1);
		tr[rs].sum += v * (tr[rs].r - tr[rs].l + 1);
		tr[ls].mn += v;
		tr[rs].mn += v;
		tr[ls].mx += v;
		tr[rs].mx += v;
		v = 0; 
	}
}

inline void modify(int u, int l, int r, int v) {

	if (tr[u].l >= l && tr[u].r <= r) {
		if (tr[u].mx + v <= 0) {
			tr[u].clear = true;
			tr[u].sum = tr[u].lazy = tr[u].mx = tr[u].mn = 0;	
		} else if(tr[u].mn + v > 0) {
			tr[u].lazy += v;
			tr[u].sum += v * (tr[u].r - tr[u].l + 1);
			tr[u].mn += v;
			tr[u].mx += v;
		} else {
			pushdown(u);
			modify(ls, l, r, v);
			modify(rs, l, r, v);
			pushup(u);
		}
		return ;
	}
	
	pushdown(u);
	
	int mid = tr[u].l + tr[u].r >> 1;
	
	if(l <= mid)	modify(ls, l, r, v);
	if(r > mid)	modify(rs, l, r, v);
	
	pushup(u);
}

inline ll query(int u, int l, int r) {
	if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
	
	ll res = 0;
	
	pushdown(u);
	
	int mid = tr[u].l + tr[u].r >> 1;
	if(l <= mid)	res += query(ls, l, r);
	if(r > mid)	res += query(rs, l, r);
	
	return res;
}

inline void solve() {
	std::cin >> n >> m;
	
	build(1, 1, n);
	
	while (m --) {
		int v, l, r;
		std::cin >> v >> l >> r;
		
		if(v)	modify(1, l, r, v);	
		else std::cout << query(1, l, r) << '\n';
	}	
}

int main(void) {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    
    int _ = 1;
    //std::cin >> _;
    while(_ --)
    	solve();

    return 0;
}

标签:Conference,Peach,rs,int,mn,tr,ls,2022,mx
From: https://www.cnblogs.com/qdhys/p/17326150.html

相关文章

  • 2021-2022年度美团科研合作评优结果发布
    美团科研合作致力于搭建美团技术团队与学术界合作的桥梁,让学术前沿落地应用,让真实场景支撑研究。至今,我们已与数十所知名高校及科研机构的学者,围绕人工智能、自动驾驶、运筹优化、大数据、信息基础设施等领域开展了百余项课题合作;并在相关领域国际会议、期刊发表数百篇论文,在国际顶......
  • VS2022支持.Net4.0到4.8之前的方法
    1、在单独装VS2022的情况下(没有安装VS2019/2017...的情况下),打开ji代码报错2、报错原因:VS2022不在包含.netframework4系列版本。3、解决方法:拷贝对应版本的目录到 C:\ProgramFiles(x86)\ReferenceAssemblies\Microsoft\Framework\.NETFramework ......
  • 湖南省第十八届大学生计算机程序设计竞赛(HNCPC2022)
    发现没有题解,我来随便记录下湖南省第十八届大学生计算机程序设计竞赛(HNCPC2022)VP情况队友卡I占了机时导致罚时有点爆炸,也是策略的失误6题837罚时补到GH就不补个位数题J判断斐波那契区间有没有一段的和等于\(n\)由于\(n\leq10^{15}\)直接暴力即可#include<bits/stdc++.......
  • NOC 2022 初中组选择和编程题题解
    NOC2022初中组选择题和编程题题解注意:本文有几个问题:部分题目我也不确定答案,而且我水平不行,有些题目我还真不会,大家就把我的答案当个参考吧。目前有一大半的题目因为作者比较懒,暂时没写,空在那儿,可以下载原题自己做做。1初中组选拔赛原题链接,提取码:efy6。1.1选择题......
  • [NISACTF 2022]babyserialize
    [NISACTF2022]babyserialize<?phpinclude"waf.php";classNISA{public$fun="show_me_flag";public$txw4ever;publicfunction__wakeup(){if($this->fun=="show_me_flag"){hint();......
  • 2022 Shanghai Collegiate Programming Contest B
    知识点:差分约束Link:https://codeforces.com/gym/103931/problem/B。被卡SPFA了呃呃。一看出题人是这个人:如何看待SPFA算法已死这种说法?-fstqwq的回答-知乎,那没事了。简述给定参数\(n,q\),表示有一个长度为\(n\)的合法括号序列,且有\(q\)组限制。每组限制均为......
  • 2022年山东省职业院校技能大赛高职组“网络系统管理”赛项
    省赛样题(一)网络基础信息配置1.根据附录1拓扑图及附录2地址规划表,配置设备接口信息。2.所有交换机和无线控制器开启SSH服务,用户名密码分别为admin、admin1234。密码为明文类型,特权密码为admin。3.S7设备配置SNMP功能,向主机172.16.0.254发送Trap消息版本采用V2C,读写的Community为“T......
  • 【专题】2022年中国制造业数字化转型研究报告PDF合集分享(附原数据表)
    报告链接:http://tecdat.cn/?p=32145原文出处:拓端数据公众号本文中所说的制造业数字化转型,指的是在制造企业的设计、生产、管理、销售及服务的每一个环节中,将新一代信息技术应用到制造企业的设计、生产、管理、销售及服务的每一个环节中,并可以以每一个环节中产生的数据为基础,展开......
  • 中电金信:2022银行年报分析——金融科技资金投入及人才队伍建设
    ......
  • 在网页中呈现Crystal Report 2022报表
    准备好数据。创建好水晶报表报表。运行预览时,出现如下提示:但是,我已经有在aspx.cs有传入帐户与密码:密码已经确认输入为正确的。但是: 奇了,什么情况?先来看看是什么原因,导致这个问题产生:2处的服务器名称不相同。解决方案,2种可以解决。第1种,改变xxx.aspx.cs的链接字符,把12......