Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
果然!!!In Reply To:注意此题如果写成多case会wa~~ Posted by:celia01 at 2012-08-20 14:55:49 > #include<iostream> > #include<cstdio> > #include<cmath> > #include<algorithm> > #include<cstring> > #include<set> > #define see(x) cout<<#x<<":"<<x<<endl; > using namespace std; > const int maxn = 100005; > long long dp[maxn], a[maxn]; > int q[maxn]; > multiset<long long> Set; > int main(){ > int n, i, j, k, low, ok, l, r; > long long sum, m, tmp; > while(scanf("%d%lld",&n,&m)!=-1){//这里写成多case就wa了,去掉之后就A了,无语了 > sum = 0; low = 1; > l = 0; r = -1; > Set.clear(); > dp[0] = 0; ok = 1; > for(i=1;i<=n;i++){ > scanf("%lld",&a[i]); > sum += a[i]; > while(sum>m) sum -= a[low++]; > if(low>i){ > ok = 0;break; > } > while(l<=r&&a[i]>=a[q[r]]){ > if(l<r) > Set.erase(dp[q[r-1]]+a[q[r]]); > r--; > } > q[++r] = i; > if(l<r) Set.insert(dp[q[r-1]]+a[q[r]]); > while(low>q[l]){ > if(l<r) > Set.erase(dp[q[l]]+a[q[l+1]]); > l++; > } > tmp = *(Set.begin()); > dp[i] = dp[low-1]+a[q[l]]; > if(l<r&&dp[i]>tmp) dp[i] = tmp; > } > if(ok){ > printf("%lld\n",dp[n]); > } > else{ > printf("-1\n"); > } > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator