当前位置: 首页 > news >正文

CodeCraft-22 and Codeforces Round 795 (Div. 2) D

# 记录做题思路

D. Max GEQ Sum

题目:

思路:

使用单调栈,先找到对于a[i]左右两边满足时a[i]作为最大值的L[i],R[i],然后你会发现只要在这个区间里面存在L[i]<=l<i使得sm[i-1]-sm[l-1]>0,或者i<r<=R[i]使得sm[r]-sm[i]>0那么一定有一个范围使得a[i] < 这个范围的和,然后怎样找到这个使得l~i-1的值>0或者i+1~r>0的l,r呢?这里可以对a数组的前缀和和后缀+一个单调栈可以解决,比如前缀和我们当前位置为sm_q[i],我们就要找到后面第一个大于sm_q[i]的位置,这样就可以用单调栈解决,怎样就可以求到sm_r[i],sm_l[i]同理即可。

总结:

错误的思路,我以为固定一端比如i,找到j使得i~j的和最大然后只要在里面的最大值大于和就行了。然后

很神奇竟然跑了79个测试点,但这样是不对的比如

20
222770758 -675711961 165034044 -642750758 -883529460 -865620784 446003892 -214378236 68965542 -41638545 106791145 -627263674 669189770 -431963037 -444266038 -904708548 -513875909 676690807 -17002387 -279706831

9~13=176044238

9~11=134118142

很明显68965542 -41638545 106791145(9~11)肯定是错误的,但是对于整个数组来说最大是9~13,说明思路是有问题的。

代码:

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
ll inf=0x3f3f3f3f3f3f3f3f;
void solve(){
	ll n;cin>>n;
	vector<ll> a(n+1);
	vector<ll> sm(n+1);
	for(ll i=1;i<=n;i++){
		cin>>a[i];sm[i]=a[i];sm[i]+=sm[i-1];
	}
	vector<ll> l(n+1);
	stack<pair<ll,ll>> stk;
	for(ll i=1;i<=n;i++){
		while(stk.size()&&stk.top().first<=a[i])stk.pop();
		if(stk.size()){
			l[i]=stk.top().second+1;
		}else{
			l[i]=1;
		}
		stk.push({a[i],i});
	}
	while(stk.size())stk.pop();
	vector<ll> r(n+1);
	for(ll i=n;i>=1;i--){
		while(stk.size()&&stk.top().first<=a[i])stk.pop();
		if(stk.size()){
			r[i]=stk.top().second-1;
		}else{
			r[i]=n;
		}
		stk.push({a[i],i});
	}
	vector<ll> sm_q(n+1);
	vector<ll> sm_h(n+2);
	for(ll i=1;i<=n;i++)sm_q[i]=sm_q[i-1]+a[i];
	for(ll i=n;i>=1;i--)sm_h[i]=sm_h[i+1]+a[i];
	while(stk.size())stk.pop();
	vector<ll> sm_l(n+1);
	for(ll i=1;i<=n;i++){
		while(stk.size()&&stk.top().first<=sm_h[i])stk.pop();
		if(stk.size()){
			sm_l[i]=stk.top().second;
		}else{
			sm_l[i]=0;
		}
		stk.push({sm_h[i],i});
	}
	while(stk.size())stk.pop();
	vector<ll> sm_r(n+1);
	for(ll i=n;i>=1;i--){
		while(stk.size()&&stk.top().first<=sm_q[i])stk.pop();
		if(stk.size()){
			sm_r[i]=stk.top().second;
		}else{
			sm_r[i]=n+1;
		}
		stk.push({sm_q[i],i});
	}
	for(ll i=1;i<=n;i++){
		if(sm_l[i]>=l[i]||sm_r[i]<=r[i]){
			cout<<"NO"<<endl;return;
		}
	}
	cout<<"YES"<<endl;
	return;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	ll _;cin>>_;
	while(_--)solve();
	return 0;
}

http://www.dtcms.com/a/113039.html

相关文章:

  • 【网络安全论文】筑牢局域网安全防线:策略、技术与实战分析
  • Nginx介绍及使用
  • 美团滑块 分析
  • 【问题记录】C语言一个程序bug定位记录?(定义指针数组忘记[])
  • Pgvector的安装
  • 为什么AI需要向量数据库?
  • Redis数据结构之Hash
  • 如何通过共同训练 LLAMA3(大语言模型)与 GAT(图注意力网络)来实现检索增强生成(RAG),用于基于知识图谱信息回答问题
  • 【算法实践】算法面试常见问题——数组的波浪排序
  • 【VUE】RuoYi-Vue3项目结构的分析
  • 在QWidget中如何添加QAction
  • Unity:标签(tags)
  • 操作系统 4.5-文件使用磁盘的实现
  • 【奇点时刻】GPT4o新图像生成模型底层原理深度洞察报告(篇2)
  • 数据结构(JAVA)栈
  • Nacos 服务发现的核心模型有哪些?Service, Instance, Cluster 之间的关系是什么?
  • 基于Transformer框架实现微调后Qwen/DeepSeek模型的流式推理并封装成接口
  • 获取inode的完整路径包含挂载的路径
  • 蓝桥杯 完全平方数 刷题笔记
  • 优化 Web 性能:管理第三方资源(Third-Party Summary)
  • 数字内容体验A/B测试优化实战
  • 本地命令行启动服务并连接MySQL8
  • NLP/大模型八股专栏结构解析
  • [特殊字符] Pandas 常用操作对比:Python 运算符 vs Pandas 函数
  • JuiceFS设计框架剖析
  • 【C/C++】编译与链接过程详解
  • 最小生成树理论
  • ROM/FLASH/RAM
  • LeetCode刷题常见的Java排序
  • 安卓开发工程师-布局设计