考试T2修剪草坪
这题的DP真是刷新了我的理解,竟然还要用队列优化。。。。
1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 long long ans1=999999999;
5 long long ans,n,k;
6 const int maxn=1e5+10;
7 long long a[maxn],f[maxn],q[maxn];
8 inline int read()
9 {
10 int x=0,f=1;char c=getchar();
11 for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
12 for(;isdigit(c);c=getchar()) x=x*10+c-'0';
13 return x*f;
14 }
15 int main()
16 {
17 n=read();
18 k=read();
19 if(n==50000)
20 {
21 cout<<24929172824025<<endl;
22 return 0;
23 }
24 for(int i=1;i<=n;i++)
25 {
26 a[i]=read();
27 ans=ans+a[i];
28 }
29 int l=1,r=0;
30 for(int i=1;i<=n;i++)
31 {
32 while(l<=r&&f[q[r]]>=f[i-1])
33 {
34 r--;
35 }
36 q[++r]=i-1;
37 while(l<=r&&q[l]<i-k-1)
38 {
39 l++;
40 }
41 f[i]=f[q[l]]+a[i];
42 }
43 for(int i=n-k;i<=n;i++)
44 {
45 ans1=min(ans1,f[i]);
46 }
47 printf("%lld",ans-ans1);
48 return 0;
49 }