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

P4314 CPU 监控

时间:2023-10-17 19:46:34浏览次数:39  
标签:infty begin end 监控 标记 P4314 bmatrix 维护 CPU

学。

题意:区间推平,区间加,区间极值,区间历史极值。

学习资料

  • 区间加区间历史最大值

试图在每个节点维护操作序列,这样答案一定是正确的。

具体而言,维护加标记和赋值标记,维护历史最大值 \(mx\) 和当前值 \(x\),标记形如 \(x \gets x + t\) 或 \(mx \gets \max(mx, x)\)。

对所有加标记做前缀和,则维护赋值标记相当于维护前缀和序列的极值。发现存前缀和的最后一项就可以维护在后面加入数字这一个操作了。

因此,在每个节点维护两个标记,表示前缀和序列的极值,以及前缀和序列的最后一项(其实就是当前值)。合并是显然的。

  • 矩乘做区间加区间历史极值

https://www.luogu.com.cn/blog/502410/seg-hismax-matrix-tag-p4314

在每个节点维护标记 \(\begin{bmatrix} a \\ b\end{bmatrix}\),分别为当前值与历史极值。使用广义矩乘,$ \begin{bmatrix} k & -\infty \ k & 0 \end{bmatrix} \begin{bmatrix} a \ b \end{bmatrix} = \begin{bmatrix} a+k \ \max{a+k, b} \ \end{bmatrix}$。广义矩乘有结合律,因此能用线段树等可以维护半群信息的数据结构维护。

这样能做的关键是,信息有结合律。其实广义矩乘无非用另一种形式写出了第一种做法朴素的维护标记,进而发现了结合律。第一个做法并没有用到结合律。

  • 区间加区间推平历史极值

需要讨论两个标记的互相影响。操作序列可以简化成推平再加,还是方便结合的。

矩乘做法使用势能线段树进行推平,感觉很厉害。但是不大通用的样子。

要知道,矩阵乘法更多是用来理解标记的,而不是用在代码实现上的。

能不能直接用矩阵表示推平啊

\[\begin{bmatrix} -\infty & -\infty & k \\ -\infty & 0 & k\\ -\infty & -\infty & 0 \end{bmatrix} \begin{bmatrix} a \\ b \\ 0 \end{bmatrix} = \begin{bmatrix} k \\ \max\{b, k\} \\ 0 \end{bmatrix} \\ \]

\[\begin{bmatrix} k & -\infty & -\infty \\ k & 0 & -\infty\\ -\infty & -\infty & 0 \end{bmatrix} \begin{bmatrix} a \\ b \\ 0 \end{bmatrix} = \begin{bmatrix} a + k \\ \max\{b, a + k\} \\ 0 \end{bmatrix} \]

解决。体感比打标记做法好写不少。

想卡常可以只存可能不是负无穷的位置,矩阵只是帮助理解而不是帮助运算。

这样真的很方便解决标记互相影响的问题。

注意到 \((1, 2), (2, 2), (3, 0), (3, 3), (3, 2)\) 的值是固定的,只维护剩余的 \(4\) 个数字,常数变为 \(\frac{1}{4}\)。

#include <bits/stdc++.h>

const int M = 1e5 + 5;

using LL = long long;

const LL inf = 1e14;

struct vec {
  LL x11, x21;
  // x31 = 0
  vec() {
    x11 = x21 = -inf;
  }
  vec(LL a, LL b) { x11 = a, x21 = b; }
  vec operator + (const vec &t) const {
    return { std::max(x11, t.x11), std::max(x21, t.x21) };
  }
} s[M << 2];

struct matrix {
  LL x11, x13, x21, x23;
  // x12 = x31 = x32 = x23 = -inf, x22 = x33 = 0
  matrix operator * (const matrix &t) const {
    matrix ans;
    ans.x11 = x11 + t.x11;
    ans.x13 = std::max(x11 + t.x13, x13);
    ans.x21 = std::max(x21 + t.x11, t.x21);
    ans.x23 = std::max({x21 + t.x13, t.x23, x23});
    return ans;
  }
  vec operator * (const vec &t) const {
    vec ans;
    ans.x11 = std::max(x11 + t.x11, x13);
    ans.x21 = std::max({x21 + t.x11, t.x21, x23});
    return ans;
  }
  matrix() {
    x11 = 0, x13 = x21 = x23 = -inf;
  }
} laz[M << 2];

int n, a[M];

void pushdown(int o) {
  s[o << 1] = laz[o] * s[o << 1], laz[o << 1] = laz[o] * laz[o << 1];
  s[o << 1 | 1] = laz[o] * s[o << 1 | 1], laz[o << 1 | 1] = laz[o] * laz[o << 1 | 1];
  laz[o] = matrix();
}

void build(int o, int l, int r) {
  if (l == r) {
    s[o] = {a[l], a[l]};
    return ;
  }
  int mid = l + r >> 1;
  build(o << 1, l, mid), build(o << 1 | 1, mid + 1, r);
  s[o] = s[o << 1] + s[o << 1 | 1];
}

void mdf(int o, int l, int r, int x, int y, matrix &t) {
  if (x <= l && r <= y) {
    s[o] = t * s[o], laz[o] = t * laz[o];
    return ;
  }
  int mid = l + r >> 1; pushdown(o);
  if (x <= mid) mdf(o << 1, l, mid, x, y, t);
  if (y > mid) mdf(o << 1 | 1, mid + 1, r, x, y, t);
  s[o] = s[o << 1] + s[o << 1 | 1];
}

vec qry(int o, int l, int r, int x, int y) {
  if (x <= l && r <= y) return s[o];
  int mid = l + r >> 1;
  vec ans; pushdown(o);
  if (x <= mid) ans = ans + qry(o << 1, l, mid, x, y);
  if (y > mid) ans = ans + qry(o << 1 | 1, mid + 1, r, x, y);
  return ans; 
}

int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++)
    scanf("%d", &a[i]);
  build(1, 1, n);
  int m, l, r; scanf("%d", &m); while (m--) {
    char op; scanf(" %c %d %d", &op, &l, &r);
    if (op == 'Q') {
      printf("%lld\n", qry(1, 1, n, l, r).x11);
    } else if (op == 'A') {
      printf("%lld\n", qry(1, 1, n, l, r).x21);
    } else if (op == 'P') {
      matrix t; int k; scanf("%d", &k);
      t.x11 = t.x21 = k;
      mdf(1, 1, n, l, r, t);
    } else if (op == 'C') {
      matrix t; int k; scanf("%d", &k);
      t.x13 = t.x23 = k;
      t.x11 = -inf;
      mdf(1, 1, n, l, r, t);
    }
  }
}

标签:infty,begin,end,监控,标记,P4314,bmatrix,维护,CPU
From: https://www.cnblogs.com/purplevine/p/solution-p4314.html

相关文章

  • RTSP/Onvi安防视频平台LiteNVR一站式视频监控解决方案
    随着我国计算机网络技术的发展和基础设施建设的不断完善,网络带来的便捷性已经开始改变我们的生活。网络设施的高速发展,视频监控行业也有了新的需求。1)高清监控系统需要满足管理者能够灵活的部署系统与分配责任;2)需要满足用户能够以最快速和最方便的方式使用监控录像。在很多项目......
  • 智慧平安小区方案:LiteCVR智能视频监控技术的应用及场景阐述
    一、方案背景智慧平安小区是“平安城市”建设的基础,随着社会的不断发展,社区安全问题已经成为人们关注的焦点。为了打造更加安全有序的治安环境,越来越多的城镇开始积极开展智慧平安小区建设。很多小区的物业安保体系、监控系统等安防建设较为简陋和传统,而且人力有限,高空抛物、乱......
  • C# M2Mqtt组件连接失败后占用大量cpu不释放以及重复用一个client进行重连会出现假连接
    M2Mqtt是C#的一个mqtt客户端库,这个库很好用,但是它有严重的Bug当我们调用Connect建立连接时,如果身份认证失败,它会返回状态码3,即"连接已拒绝,不合格的客户端标识符",但是其内部的异步线程并不会终止,依然会占用大量的cpu资源,即使Disconnect且把client置为null也没用,除非彻底关闭程序......
  • 如何满足越来越多的轻量化场景智能视频监控需求?
    一、行业现状随着视频及监控应用技术的发展与安防意识的普及,视频监控行业已经进入高速发展阶段,市场规模不断扩大,应用领域也随之不断拓展。越来越多的用户会有各种不同小场景的监控需求,如餐饮、仓库、独立车间、商场独立空间等需单独监控、单独管理,并且根据自身场景的特点也会需要......
  • 视频监控/安防监控平台EasyCVR(3.4.0)界面更新大曝光,速来抢先看!
    视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频监控平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务......
  • 视频监控/安防监控平台EasyCVR(V.3.4.0)界面更新大曝光,速来抢先看!
    视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频监控平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务......
  • 视频监控管理平台EasyCVR二级菜单隐藏后,鼠标悬浮时菜单名称不显示该如何解决?
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、视频能力灵活,能对外分发RTMP、RTSP、HTTP-......
  • Qt/C++开源作品45-CPU内存显示控件/和任务管理器一致
    一、前言在很多软件上,会在某个部位显示一个部件,专门显示当前的CPU使用率以及内存占用,方便用户判断当前程序或者当前环境中是否还有剩余的CPU和内存留给程序使用,在不用打开任务管理器或者资源查看器的时候直接得知当前系统的运行情况。尤其是视频监控系统,如果64路全开,肯定很占用CP......
  • 如何实现电压监控的四种方法
    [导读]为什么监控电压很重要?我们知道监控电压轨可以帮助我们防止掉电、检测过压事件、测量电池电量并帮助我们实施整体诊断策略。本文将介绍如何实施电压监控。有四种关键方法:为什么监控电压很重要?我们知道监控电压轨可以帮助我们防止掉电、检测过压事件、测量电池电量并帮助我......
  • 每天5分钟复习OpenStack(五)CPU虚拟化
    KVM虚拟化之CPU虚拟化存在是为了更高效的利用物理机的资源,而虚拟机技术主要是针对三大组件,分别是CPU虚拟化、存储虚拟化、网络虚拟化。下面我们分别介绍下三大组件的常用知识。CPU虚拟化1.1CPU虚拟化支持KVM的虚拟化是需要CPU硬件支持的。还记得我们在前面的章节讲过......