CF 1748 C

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

const int N=2e5+10;

int a[N];
long long s[N];

void solve()
{
	int n;
	cin>>n;
	
	vector<int> zero;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		s[i]=s[i-1]+a[i];
		if(a[i]==0)
			zero.push_back(i);
	}
	zero.push_back(n+1);
	
	long long ans=0;
	for(int i=1;i<zero[0];i++)
		if(s[i]==0)
			ans++;
	for(int i=0;i+1<zero.size();i++)
	{
		int mx=0;
		map<long long,int> mp;
		for(int j=zero[i];j<zero[i+1];j++)
			mx=max(mx,++mp[s[j]]);
		ans+=mx;
	}
	
	cout<<ans<<endl;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin>>t;
	
	while(t--)
		solve();
	
	return 0;
}

贪心

分板块处理数组,每一个板块贪心求最大值,有一些前缀和,差分的应用,需要一定的代码实现能力, m a p map map 计数

题目阅读理解比较困难,题意是,数组有一个前缀和是 0 0 0 就表示 1 1 1 分,可以对每一个 0 0 0 进行操作,求分数的最大值

差分有一个性质,改变差分数组的一个数字,会影响该数字后面的所有数字(包括该数字)(影响的是差分数组的前缀和数组)

输入的数组可以看成是前缀和数组的差分数组

划分的界限是 0 0 0 ,因为可以进行操作的只有 0 0 0 这个元素,在某个 0 0 0 处加上一个数字,在下一个 0 0 0 处减去该数字,就可以保证该操作只对两个 0 0 0 中间的前缀和产生了影响

单独考虑第一个 0 0 0 之前的所有元素

然后分块考虑中间的两个零之间的元素

最后把所有的贡献求和

因为涉及到 2 ∗ 1 0 5 2*10^5 2∗105 个数字的相加,所以会超过 i n t int int 的数据范围,前缀和数组需要使用 l o n g l o n g long\ long long long ,答案也需要使用 l o n g l o n g long\ long long long ,每一次贪心的是,出现次数最多的前缀和元素,修改零对应位置的差分数组数值,可以使得出现次数最多的前缀和元素变成零,该情况可以使得答案取到最大值

涉及到边界问题,所以保存零的位置的时候多存了一个零的位置,相当于用一个 v e c t o r vector vector 把分界点存了下来,时间复杂度还是没有改变,还是只需要把原数组遍历一遍,分开贪心求贡献,贡献求和是答案

相关推荐
布莱克6055 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
D e re k ZH8 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
石小石Orz9 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
Zwawa10 小时前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式
Fruiticecake10 小时前
C 程序员速通现代 C++(一):lambda、std::function、移动语义与智能指针
c语言·c++
田甲11 小时前
做一款 Type-C 母座读卡器:GL3224 双卡方案实测
c语言·开发语言
民乐团扒谱机11 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
青少儿编程课堂11 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
武子康13 小时前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习