[CF]E. Are You Fired?
E. Are You Fired?
正确解法:
有n个元素,前(n+1)/2个元素分别为ai,后n/2个元素全部为x。求一个数k,是长度为k 的连续子串总和都大于0.
分情况讨论。
当x>=0时:
当k>(n+1)/2 时,肯定n个字串比k个字串更优(x>=0) 求sum[n]
当k<(n+1)/2 时,长度为k的字串满足条件,长度为2k、3k的字串也满足条件,总能找到一个 xk> (n+1)/2 于是同理 求sum[n]
当x<0时:
当k<(n+1)/2 时,后面有一串 都为x (x<0) 的 不满足条件。
当k>(n+1)/2 时,
k=n 字串为:[1,N]
k=n-1 字串为: [1,N-1] [2,N]
k=n-2 字串为: [1,N-2] [2,N-1] [3,N]
于是我们枚举 [i,n] 这个长度,(因为每次都多增加了这个,前面的都可以拿前面的-x得到)
求这些字串的最小值,只要最小值>0 ,便满足条件。
res=sum[n]-sum[i-1]; //新增的长度。
minn-=x; //之前的长度 -x 就等于现在前面的长度
minn=min(minn,res); //求这些字串的最小值。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstring> 10 #include <vector> 11 #include <map> 12 #include<ctime> 13 //#include <unordered_map> 14 #define mem( a ,x ) memset( a , x ,sizeof(a) ) 15 #define rep( i ,x ,y ) for( int i = x ; i<=y ;i++ ) 16 #define lson l ,mid ,pos<<1 17 #define rson mid+1 ,r ,pos<<1|1 18 using namespace std; 19 typedef long long ll ; 20 typedef pair<int ,int> pii; 21 typedef pair<ll ,int> pli; 22 const int inf = 0x3f3f3f3f; 23 const ll mod=998244353; 24 const int N=100000+50; 25 int n; 26 ll a[5*N],x,sum[5*N],minn,res; 27 28 int main() 29 { 30 scanf("%d",&n); 31 for(int i=1;i<=(n+1)/2;i++) 32 { 33 scanf("%lld",&a[i]); 34 sum[i]=sum[i-1]+a[i]; 35 } 36 scanf("%lld",&x); 37 for(int i=(n+1)/2+1;i<=n;i++) 38 { 39 a[i]=x; 40 sum[i]=sum[i-1]+a[i]; 41 } 42 if(x>=0) 43 { 44 if(sum[n]>0) printf("%d\n",n); 45 else printf("-1\n"); 46 return 0; 47 } 48 minn=1e18; 49 for(int i=1;i<=n;i++) 50 { 51 res=sum[n]-sum[i-1]; 52 if(minn==1e18) 53 minn=res; 54 else 55 { 56 minn-=x; 57 minn=min(minn,res); 58 } 59 if(minn>0) 60 { 61 printf("%d\n",n-i+1); 62 return 0; 63 } 64 } 65 printf("-1\n"); 66 67 68 return 0; 69 }
No matter how you feel, get up , dress up , show up ,and never give up.