首页 > 其他分享 >Blocking Elements

Blocking Elements

时间:2024-09-28 20:23:07浏览次数:7  
标签:pre Elements val int sum include Blocking dp

Blocking Elements

题目描述

给定一个长度为 \(n\) 的序列 \(A\),你需要划分这个序列。先任意选择若干个位置,假定你选择了 \(m\) 个位置,这些位置分别为 \(B_1,B_2...B_m\) ,这一次划分的代价为下面两个量中的最大值:

  • \(\sum\limits_{i=1}^{m}A_{B_{i}}\) .
  • \(\max\limits_{i=0}^{m}{\large{\sum\limits_{j=B_i+1}^{B_{i+1}-1}}{A_j}}\) 。 特别的,定义\(B_0=0,B_{m+1}=n+1\),同时,若 \(B_i=B_i+1\) ,则在原式中 \(\sum\) 一项的值你应当视为 0。

即为:你选择了若干位置,这些位置将原序列分隔成了若干段。代价是你选择的这些位置的元素和与每一段中所有的元素和的最大值。

给定 \(n\) 与序列 \(A\) ,求最小分隔代价。多测,\(\sum n \le 1e5\) .

思路

题目中大概的意思抽象成“最大值的最小值”,我们会想到二分答案。

则设分割后的到的代价不大于 \(val\),则要满足一下两个条件:

  • 选择的断点的元素总和要小于等于 \(val\)。(条件1)
  • 相邻的两个断点之间的元素和的最大值要小于等于 \(val\)。(条件2)

我们设 \(dp_i\) 为 \(i\) 位置前,满足条件2的划分方案中选择断点的元素总和的最小值。

列出 \(dp\) 方程转移式:

\[dp_i = a_i + \min_{pre_{i - 1} - pre_k <= val}\{dp_k\} \]

而我们发现后面的这个式子是可以用单调列队优化成 \(O(n)\) 复杂度的。

最后返回dp[n + 1] <= val即可。

(我们可以添加一个a[n + 1] = 0的点来处理边界问题)。

\(code\)

#include<iostream>
#include<algorithm>
#include<queue>
#include<deque>
using namespace std;
#define int long long
const int MAXN = 1e5 + 7;
int n,dp[MAXN];
int a[MAXN],pre[MAXN];
int l,r;
deque<int> q;
bool check(int val){
	for(int i = 0;i <= n + 1;i++) dp[i] = 0;
	q.clear(),q.push_back(0);
	for(int i = 1;i <= n + 1;i++){
		while(!q.empty() && pre[i - 1] - pre[q.front()] > val){
			q.pop_front();
		}
		dp[i] = a[i] + dp[q.front()];
		while(!q.empty() && dp[q.back()] >= dp[i]) q.pop_back();
		q.push_back(i);
	}
	return dp[n + 1] <= val;
}
signed main(){
	int _;
	cin>>_;
	while(_--){
		cin>>n;
		a[n + 1] = 0;
		for(int i = 1;i <= n;i++) cin>>a[i],pre[i] = pre[i - 1] + a[i];
		l = 1,r = pre[n];
		while(l < r){
			int mid = (l + r) / 2;
			if(check(mid)) r = mid;
			else l = mid + 1;
		}
		cout<<l<<endl;
	}
	return 0;
}

标签:pre,Elements,val,int,sum,include,Blocking,dp
From: https://www.cnblogs.com/wyl123ly/p/18438348

相关文章

  • 【VUE】[Violation] Added non-passive event listener to a scroll-blocking...
    1.问题[Violation]Addednon-passiveeventlistenertoascroll-blocking<某些>事件.Considermarkingeventhandleras'passive'tomakethepagemoreresponsive.See<URL>译:[违规]向滚动阻止添加了非被动事件侦听器<某些>事件.请考虑将事件处理程序标记为“被......
  • 【JUC并发编程系列】深入理解Java并发机制:阻塞队列详解与简单纯手写(七、BlockingQueu
    文章目录【JUC并发编程系列】深入理解Java并发机制:阻塞队列详解与简单纯手写(七、BlockingQueue、ArrayBlockingQueue、LinkedBlocking)1.简单回顾1.1数组结构和链表结构1.1.1数组结构1.1.2链表结构1.2有界队列与无界队列1.3Lock锁使用回顾2.什么是阻塞队列3.B......
  • BlockingQueue---DelayQueue
    总结一个无界阻塞队列;FIFO;只包含实现了Delayed接口的元素,每个元素都有一个延迟时间,在该延迟时间结束之前,该元素不会从队列中可用。一旦元素的延迟到期,它就可以被取出了,并且取出的顺序是按照延迟到期的时间先后进行的。通常用于实现定时任务调度、缓存过期等......
  • BlockingQueue---PriorityBlockingQueue
    总结一个无界的并发队列。按照元素的优先级顺序来处理元素。这种队列非常适合需要按照优先级处理任务的场景。特性无界:默认情况下是无界的,可以存储任意数量的元素。基于优先级:队列中的元素根据它们的自然顺序或者由构造时提供的 Comparator 来排序。线程安全:支持......
  • Qt::BlockingQueuedConnection 与 QMetaCallEvent
    Qt创建连接类型如果是Qt::BlockingQueuedConnection,即senderthread与receiverthread不同,但是要求sendersignal与receiverslot执行是不同线程间的同步行为。也即:在sendersignal发出后sender线程要等待receiver线程的slot执行完后才能继续向后执行指令。......
  • 多线程篇(阻塞队列- PriorityBlockingQueue)(持续更新迭代)
    目录一、简介二、类图三、源码解析1.字段讲解2.构造方法3.入队方法put浮调整比较器方法的实现入队图解4.出队方法takedequeue下沉调整比较器方法的实现出队图解四、总结一、简介PriorityBlockingQueue队列是JDK1.5的时候出来的一个阻塞队列。但是该队......
  • 多线程篇(阻塞队列- BlockingQueue)(持续更新迭代)
    目录一、了解什么是阻塞队列之前,需要先知道队列1.Queue(接口)二、阻塞队列1.前言2.什么是阻塞队列3.Java里面常见的阻塞队列三、BlockingQueue(接口)1.前言2.简介3.特性3.1.队列类型3.2.队列数据结构2.简介4.核心功能入队(放入数据)出队(取出数据)总结四......
  • Java 入门指南:Java 并发编程 —— 并发容器 PriorityBlockingQueue
    BlockingQueueBlockingQueue是Java并发包(java.util.concurrent)中提供的一个阻塞队列接口,它继承自Queue接口。BlockingQueue中的元素采用FIFO的原则,支持多线程环境并发访问,提供了阻塞读取和写入的操作,当前线程在队列满或空的情况下会被阻塞,直到被唤醒或超时。常用的......
  • 通过对elements混入的方式设置一些公共方法
    importVuefrom'vue'importElementfrom'element-ui'importi18nfrom'@/lang'//import'../element-variables.scss'import{closeMenuOnScroll}from'@/mixin/close-menu-onscroll.js'importmessagefro......
  • 生产者消费者模式,以及基于BlockingQueue的快速实现
    生产者消费者模式,以及基于BlockingQueue的快速实现什么是生产者消费者模式,简单来说就是有两个角色,一个角色主要负责生产数据,一个角色主要负责消费(使用)数据。那么生产者直接依赖消费者,然后直接调用是否可以?答案是可以的,但是有些场景无法及时解决,典型的就是生产者消费者的速度无法同......