专栏文章
题解:P14253 旅行(trip)
P14253题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minj84ra
- 此快照首次捕获于
- 2025/12/02 03:18 3 个月前
- 此快照最后确认于
- 2025/12/02 03:18 3 个月前
题目传送门
旅行(trip)
解题思路
首先先求出 A 的前缀和序列 C 即 。
若对于 l 和 r ( 且 x < y ) ,显然的,当 - = 0 即 = 时,便会对左端点为 l ,右端点大于或等于 r 的区间做出一次贡献,楼上也已经说了当选择的区间左端点 l 固定时,选择越大的 r 一定不劣,所以我们便可以将前缀和数组排序,统计其中值相等的前缀和的个数,这些值相等的前缀和中天数最早的一个的后一天作为左端点,它所能产生的最多的0的数量一定为这些值相等的前缀和的个数减一,即去除它本身,但如果它本身为零,就不用去除,所以得特判。最后求最大值输出。
时间复杂度 。
若对于 l 和 r ( 且 x < y ) ,显然的,当 - = 0 即 = 时,便会对左端点为 l ,右端点大于或等于 r 的区间做出一次贡献,楼上也已经说了当选择的区间左端点 l 固定时,选择越大的 r 一定不劣,所以我们便可以将前缀和数组排序,统计其中值相等的前缀和的个数,这些值相等的前缀和中天数最早的一个的后一天作为左端点,它所能产生的最多的0的数量一定为这些值相等的前缀和的个数减一,即去除它本身,但如果它本身为零,就不用去除,所以得特判。最后求最大值输出。
时间复杂度 。
参考代码
CPP#include<bits/stdc++.h>//万能头
using namespace std;
#define ll long long int
int main(){
ll T;
cin>>T;
while(T--){
ll n;
cin>>n;
ll a[1000005],sum[1000005],ans=0;
sum[0]=0;
for(ll i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}//求前缀和数组
sort(sum+1,sum+n+1);//sort排序
ll nt=1;
for(ll i=1;i<=n;i++){
if(sum[i]==sum[i-1])nt++;
else {
if(sum[i-1]==0)nt++;
ans=max(ans,nt-1);
nt=1;
}
}
if(nt^1){
if(sum[n]==0)nt++;
ans=max(ans,nt-1);
}//计数找最大值
cout<<ans<<endl;
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...