[POJ3017] Cut the Sequence && 单调队列
2014-12-06 13:26
435 查看
由于这道题决策点的值并不打掉 所以要搞个平衡树上去(虽然暴力也可以过) 正好操作需求不大 可以直接用multiset搞过去 还有就是G++的STL效率低可能超时 C++快的多
#include<cstdio> #include<cstring> #include<deque> #include<queue> #include<algorithm> #include<set> #include<iostream> #define MAXN 100000 using namespace std; typedef long long LL; typedef pair<int, int> pii; LL d[MAXN+10]; multiset <int> S; LL A[MAXN+10], sum[MAXN+10]; deque <int> q; int main() { LL n, K; while(scanf("%lld%lld", &n, &K) == 2) { S.clear(); q.clear(); bool f = false; for(int i = 1; i <= n; i++) { scanf("%lld", &A[i]); sum[i] = sum[i-1] + A[i]; if(A[i] > K) f = true; } if(f) { cout << "-1\n"; continue; } int des = 0; for(int i = 1; i <= n; i++) { while(sum[i] - sum[des] > K) ++des; while(!q.empty() && q.front() <= des) { int F = q.front(); q.pop_front(); if(!q.empty()) S.erase(d[F] + A[q.front()]); } while(!q.empty() && A[q.back()] <= A[i]) { int B = q.back(); q.pop_back(); if(!q.empty()) S.erase(d[q.back()] + A[B]); } if(!q.empty()) S.insert(d[q.back()] + A[i]); q.push_back(i); d[i] = d[des] + A[q.front()]; if(S.size()) d[i] = min(d[i], (LL)(*(S.begin()))); } cout << d << '\n'; } }
相关文章推荐
- poj3017 Cut the Sequence 单调队列优化dp 好题!
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
- Cut the Sequence,Sequence Partitioning,POJ3017,POJ3245,用单调队列优化的DP
- poj 3017 Cut the Sequence(DP+单调队列)
- POJ - 3017 Cut the Sequence : 单调队列优化dp
- POJ 3017|Cut the Sequence|动态规划|单调队列
- POJ 3017 Cut the Sequence(dp+单调队列)
- POJ_3017 Cut the Sequence 单调队列+dp+BST
- POJ - 3017 Cut the Sequence(单调队列+dp)
- Poj 3017 Cut the Sequence (DP,单调队列优化,数据结构优化)
- POJ 3017 Cut the Sequence(DP + 单调队列优化 + 平衡树)
- poj 3017 Cut the Sequence(dp单调队列优化)
- POJ 3017 Cut the Sequence 【DP+单调队列优化+平衡树】
- POJ 3017 Cut the Sequence(单调队列+set)
- POJ 3017 Cut the Sequence 单调队列
- POJ 3017 Cut the Sequence (单调队列优化DP)
- poj 3017 Cut the Sequence(单调队列优化 )
- poj 3017 Cut the Sequence(DP+单调队列+set)
- Cut the Sequence (单调队列优化DP)
- POJ-3017 Cut the Sequence(DP单调队列优化 + 平衡树)