首页 > 其他分享 >P4314 CPU 监控

P4314 CPU 监控

时间:2024-03-23 20:55:06浏览次数:22  
标签:std 标记 int cdots P4314 监控 序列 CPU 赋值

P4314 CPU 监控

这题是维护历史最大值模板。

先套线段树,考虑怎么维护标记。

我们发现普通的标记的维护遵循能合并就合并,但是这就会出现问题:假如一个标记还没有下传时就被修改(也就是减小),那就会导致子树的历史最大值不正确(变小)。

考虑先不合并同一个节点的标记,把它们看成一个操作序列。这里讲一个简化的问题:

  1. 支持区间加
  2. 查询当前最大值
  3. 查询历史最大值

考虑怎么下传标记。显然每个标记都下传更新一次是可行的,但是我们无法维护这样一个操作序列。

设操作序列的前缀和为 \(S[1\cdots i]\),那么只需要下传 \(\max(S[1\cdots i])\) 即可维护答案。考虑合并两个标记,设 \(S_1[1\cdots n]\) 和 \(S_2[1\cdots m]\),合并完为 \(S_3[1\cdots n+m]\)。

容易推出 \(\max (S_3) = (\max (S_1), S_1[n]+\max (S_2))\)。

此时 \(S_1[n]\) 为我们普通加法标记的值。

具体的说,我们只需要维护历史最大加和当前加两个标记即可维护。

回到这题,多了操作区间赋值,若操作序列中有两种标记,不好维护。容易发现,若前面出现过赋值操作,那么之后的加法标记都可以直接加到赋值标记中变为赋值标记

此时操作序列转化为,一段加法序列+一段赋值序列两段。前面的加法序列用前面说的一样维护,设后面赋值序列为 \(C\),后面的赋值序列的历史最大赋值即为 \(\max C\)。

pushdown 时分两段下传即可。

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define fi first
#define se second

typedef long long i64;
const int N = 100010;
int n, m;
int a[100010];
i64 inf = 0x3f3f3f3f3f3f3f3f;
struct seg {
	i64 max1, max2;
	i64 fg, add;
	i64 vis, hfg, hadd; //fg 覆盖,add 加法
} t[N << 2];
void pushup(int u) {
	t[u].max1 = std::max(t[u << 1].max1, t[u << 1 | 1].max1);
	t[u].max2 = std::max(t[u << 1].max2, t[u << 1 | 1].max2);
}
void build(int u, int l, int r) {
	if(l == r) {
		t[u].max1 = t[u].max2 = a[l];
		return;	
	}
	int mid = (l + r) >> 1;
	build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
	pushup(u);
}
void add(int u, i64 add, i64 hadd) {
	if(t[u].vis) {
		t[u].hfg = std::max(t[u].hfg, t[u].fg + hadd);
		t[u].max2 = std::max(t[u].max2, t[u].max1 + hadd);
		t[u].max1 += add;
		t[u].fg += add;
	}
	else {
		t[u].hadd = std::max(t[u].hadd, t[u].add + hadd);
		t[u].max2 = std::max(t[u].max2, t[u].max1 + hadd);
		t[u].max1 += add;
		t[u].add += add;
	}
}
void cov(int u, i64 fg, i64 hfg) {
	if(t[u].vis) {
		t[u].hfg = std::max(t[u].hfg, hfg);
		t[u].max2 = std::max(t[u].max2, hfg);
	}
	else {
		t[u].vis = 1;
		t[u].hfg = hfg;
		t[u].max2 = std::max(t[u].max2, hfg);
	}
	t[u].fg = t[u].max1 = fg;
}
void pushdown(int u) {
	add(u << 1, t[u].add, t[u].hadd);
	add(u << 1 | 1, t[u].add, t[u].hadd);
	t[u].add = t[u].hadd = 0;
	if(t[u].vis) {
		cov(u << 1, t[u].fg, t[u].hfg);
		cov(u << 1 | 1, t[u].fg, t[u].hfg);
		t[u].fg = t[u].hfg = t[u].vis = 0;
	}
}
void update(int u, int l, int r, int L, int R, i64 x, int y) {
	if(L <= l && r <= R) {
		if(!y) add(u, x, x);
		else cov(u, x, x);
		return;
	}
	int mid = (l + r) >> 1;
	pushdown(u);

	if(L <= mid) update(u << 1, l, mid, L, R, x, y);
	if(R > mid) update(u << 1 | 1, mid + 1, r, L, R, x, y);

	pushup(u);
}
i64 qmax1(int u, int l, int r, int L, int R) {
	if(L <= l && r <= R) {
		return t[u].max1;
	}
	int mid = (l + r) >> 1;
	pushdown(u);

	if(R <= mid) return qmax1(u << 1, l, mid, L, R);
	if(L > mid) return qmax1(u << 1 | 1, mid + 1, r, L, R);
	return std::max(qmax1(u << 1, l, mid, L, R), qmax1(u << 1 | 1, mid + 1, r, L, R)); 
}
i64 qmax2(int u, int l, int r, int L, int R) {
	if(L <= l && r <= R) {
		return t[u].max2;
	}
	int mid = (l + r) >> 1;
	pushdown(u);
	
	if(R <= mid) return qmax2(u << 1, l, mid, L, R);
	if(L > mid) return qmax2(u << 1 | 1, mid + 1, r, L, R);
	return std::max(qmax2(u << 1, l, mid, L, R), qmax2(u << 1 | 1, mid + 1, r, L, R)); 
}
void Solve() {
	std::cin >> n;
	for(int i = 1; i <= n; i++) {
		std::cin >> a[i];
	}
	build(1, 1, n);

	std::cin >> m;
	while(m--) {
		char c;
		std::cin >> c;
		int l, r;
		std::cin >> l >> r;
		if(c == 'Q') {
			std::cout << qmax1(1, 1, n, l, r) << "\n";
		} else if(c == 'A') {
			std::cout << qmax2(1, 1, n, l, r) << "\n";
		} else if(c == 'P') {
			int x;
			std::cin >> x;
			update(1, 1, n, l, r, x, 0);
		} else if(c == 'C') {
			int x;
			std::cin >> x;
			update(1, 1, n, l, r, x, 1);
		}
	}
}
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
	Solve();

	return 0;
}

标签:std,标记,int,cdots,P4314,监控,序列,CPU,赋值
From: https://www.cnblogs.com/FireRaku/p/18091674

相关文章

  • skynet框架:lua service支持监控告警
    问题场景是:服务A生产大量请求消息call到服务B,服务B瞬间达到消费能力的瓶颈,导致服务A堆积大量的yield状态协程,服务B消息队列堆积大量待处理消息,业务上出现卡顿、超时甚至物理机器内存吃满被瞬间击穿的问题;我们使用云服务器产品部署游戏业务,起因是游戏线上收到反馈在某些时间节点频......
  • 游戏开发:服务器部署监控告警
    线上服务器的监控告警,我们暂且从三个层级上分析;业务层:业务相关的日志告警机制。跟业务设计强相关,比如客户端的业务上行请求数据异常之类的告警,业务上定义日志级别(INFO/WARN/ERROR),输出到指定日志文件并通过业务层逻辑抛出,数据分析的埋点、业务行为相关的辅助日志都在这里实现;一套......
  • Macbook air M2 16G 用cpu跑同大模型知识库文档系统(Langchain-chatchat+llama2-7B量化
    MacbookairM216G用cpu跑同大模型知识库文档系统(Langchain-chatchat+llama2-7B量化模型)经过了5个夜晚的煎熬,终于从一个完全不知大模型为何物的小白身份把知识库问答大模型搞起来,一路尝试几斤辛酸,特别记录下来踩过的各种坑,供大家借鉴!本人的目标:在我自己的Macbookair......
  • k8s证书监控--x509-certificate-exporter
    目录k8s证书监控--x509-certificate-exporter一、下载并解压二、推送镜像到镜像仓库三、根据实际情况修改values.yaml,其他配置可不做修改四、配置监控以及告警五、异常处理k8s证书监控--x509-certificate-exporter一、下载并解压下载并解压helm包x509-certificate-exporter-3.1......
  • 【网站项目】校园视频监控系统
    ......
  • Linux--CPU简述
    一、计算机结构冯·诺依曼模型(VonNeumannarchitecture)是一种计算机体系结构的基本框架,由冯·诺依曼于1945年提出。它是现代计算机设计和实现的基础,被广泛应用于大多数通用计算机系统。冯·诺依曼模型的主要特点包括:存储程序:冯·诺依曼模型采用了存储程序的概念,即指令和数据......
  • cpu频率相关命令
    cat/proc/cpuinfoBogoMIPS这一条,此时BogoMIPS为3.00,BogoMIPS是Linux系统中衡量处理器运行速度的一个“尺子”,处理器性能越强,主频越高,BogoMIPS值就越大。BogoMIPS只是粗略的计算CPU性能,并不十分准确。但是我们可以通过BogoMIPS值来大致的判断当前处理器的性能 ......
  • K8S单机部署-11.安装Kubernetes Metrics Server监控
    目录现象安装Metric-Server版本关系下载部署文件修改镜像地址部署验证效果问题一原因解决办法现象当需要查看资源的占用的时候执行以下命令,提示缺少组件:[root@masterk8s-metric-server]#kubectltoppoderror:MetricsAPInotavailable安装Metric-Server......
  • 稳定性方法论:可灰度 & 可监控 & 可回滚
    业务系统核心目标是挣钱,系统稳定性建设核心是防止丢钱(丢钱逻辑如下图所示),站在公司的角度看,产品功能建设和系统稳定性是同等重要。  前段时间写了《稳定性治理框架》,该文章在稳定性建设的理论和实践基础上,抽象出稳定性治理的框架,希望建立一个稳定性治理的标准动作、最......
  • kswapd0挖矿病毒的发现与清除 导致CPU过高问题
    kswapd0挖矿病毒的发现与清除BobAnkh​清华大学/网文爱好者/游戏爱好者/猫猫爱好者 26人赞同了该文章写下这篇博客的原因是实验室的服务器在安装docker之后不幸感染上了挖矿病毒,便将发现与清除的方法记录于此,如有错漏,恳请指正本文同样发于本人的bl......