比赛
T1 很显然是二分
奈何双指针部分没写好,最终仅得了20分之“高分”
读了标程后很快地明白了
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,a[N];
int sum[N<<1];
bool check(int mid){
int p1=1,p2=1;
for(int i=1;i<=n;i++){
while(p1<i+n && sum[p1]-sum[i]<mid)p1++;
while(p2<i+n && sum[p2]-sum[p1]<mid)p2++;
if(sum[i+n]-sum[p2]>=mid){
return true;
}
}
return false;
}
signed main(){
freopen("split.in","r",stdin);
freopen("split.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n;
sum[0]=0;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+a[i];
}
for(int i=1;i<=n;i++){
sum[n+i]=sum[n+i-1]+a[i];
}
int l=1,r=sum[n]/3;
while(l<r){
int mid=(l+r+1)>>1;
if(check(mid)){
l=mid;
}
else r=mid-1;
}
cout<<r<<endl;
return 0;
}
T2 针对特殊性质2拿了20 ^O^
下午状压DP 听得有点吃力