CF833.C

这篇博客分享了解决Codeforces 1748题目的C++代码,核心思路是利用前缀和判断和为0的子序列对结果的影响,并通过特殊到一般的方法进行证明。关键在于使用map记录前缀和出现次数,找出最多频次的和为0情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://codeforces.com/contest/1748/problem/C

思路:1.根据原理和观察结果,猜测0与和为0的子序列对结果有影响

2.从特殊到一般,进行证明:0必会提供1分;两个0中间,和为0的序列也会提供1分

3.考虑如何实现:用前缀和记录,前缀和相同说明有一段和为0序列;取出现次数最多的前缀和加分;每次遇到0就重置

4.细节处理:1.开long long2.开头没遇到0,前缀和相同不行,得要前缀和为0才行

AC代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
void solve()
{
	ll n;cin>>n;
	ll sum=0;
	map<ll ,ll >q;
	q.clear();
	ll max1=1,shu=0;
	q[0]=1;
	int ok=1;
	for(ll i=1;i<=n;i++)
	{
		ll a;cin>>a;
		if(a==0)
		{	ok=0;
		shu++;
		max1=1;
		sum=0;
		q.clear();
		q[0]=1;
		continue;
		}
		sum+=a;q[sum]++;
		if(q[sum]>=2)
		{	if(sum==0||ok==0)
			{if(q[sum]>max1)
			{
				max1=q[sum];shu++;
			}
			}
		}
	}
	cout<<shu<<endl;
}
int main()
{
	int t;cin>>t;
	while(t--)
	solve();
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值