[Noi2010] D1T2 超级钢琴 (ST表 线段树 主席树)
2017-09-14 11:28
381 查看
大概就是对于每个i求一下可行区间里的最大值。
但是有可能次大值也在答案中。
所以每次选取最大值时顺便将次大值也加入堆中。
复杂度O(n log n)
但是有可能次大值也在答案中。
所以每次选取最大值时顺便将次大值也加入堆中。
复杂度O(n log n)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <map> #include <queue> #define INF 0x3f3f3f3f using namespace std; const int N = 500005; inline void read( int &res ) { char ch = getchar(); res = 0; int flag = 1; while(ch < '0' || ch > '9') {if(ch == '-') flag = -1; ch = getchar();} while(ch >= '0' && ch <= '9') res = res * 10 + ch - 48, ch = getchar(); res *= flag; } int n, k, L, R, a , sum , rmq [21], llg ; void Pre() { for(int i = 1; i <= n; ++i) rmq[i][0] = i; for(int k = 1; k <= 19; ++k) for(int i = 1; i + (1 << k) - 1 <= n; ++i) if(sum[rmq[i][k - 1]] > sum[rmq[i + (1 << (k - 1))][k - 1]]) rmq[i][k] = rmq[i][k - 1]; else rmq[i][k] = rmq[i + (1 << (k - 1))][k - 1]; } int Query( int L, int R ) { int k = llg[R - L + 1]; if(sum[rmq[L][k]] > sum[rmq[R - (1 << k) + 1][k]]) return rmq[L][k]; else return rmq[R - (1 << k) + 1][k]; } struct Node { int lf, rg, pos, tmp; Node() { } Node( int lf, int rg, int pos, int tmp ) : lf(lf), rg(rg), pos(pos), tmp(tmp) { } bool operator < ( const Node &g ) const { return sum[pos] - sum[tmp - 1] < sum[g.pos] - sum[g.tmp - 1]; } }; priority_queue< Node > que; int main() { read(n), read(k), read(L), read(R); for(int i = 2; i <= n; ++i) llg[i] = llg[i >> 1] + 1; for(int i = 1; i <= n; ++i) read(a[i]), sum[i] = sum[i - 1] + a[i]; Pre(); for(int i = 1; i + L - 1 <= n; ++i) { int ps = min(i + R - 1, n); int as = Query(i + L - 1, ps); que.push(Node(i + L - 1, ps, as, i)); } long long ans = 0; for(int i = 1; i <= k; ++i) { Node chs; chs = que.top(); ans += (long long)sum[chs.pos] - sum[chs.tmp - 1]; que.pop(); int lf = chs.lf, rg = chs.rg; if(chs.pos > lf) que.push(Node(lf, chs.pos - 1, Query(lf, chs.pos - 1), chs.tmp)); if(chs.pos < rg) que.push(Node(chs.pos + 1, rg, Query(chs.pos + 1, rg), chs.tmp)); } cout << ans << endl; return 0; } /* 4 3 2 3 3 2 -6 8 */
相关文章推荐
- [NOI2010][bzoj2006] 超级钢琴 [主席树/ST表+堆]
- BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]
- BZOJ 2006 NOI 2010 超级钢琴 堆+主席树
- bzoj2006 [NOI2010]超级钢琴 堆+ST表/主席树
- 【BZOJ2006】【NOI2010】超级钢琴 Heap+主席树
- ST表+堆——BZOJ2006/Luogu2048 [NOI2010]超级钢琴
- [BZOJ2006][NOI2010]超级钢琴(st表+堆贪心)
- [BZOJ2006][NOI2010][RMQ/主席树][二叉堆]超级钢琴
- 2006: [NOI2010]超级钢琴|ST表|堆
- 【BZOJ】【P2006】【NOI2010】【超级钢琴】【题解】【堆+ST】
- bzoj 2006 [NOI2010]超级钢琴 二分答案 可持久化线段树
- BZOJ 2006 [NOI2010]超级钢琴 主席树+堆
- [BZOJ2006][NOI2010]超级钢琴(ST表+堆)
- 【BZOJ 2006】[NOI2010]超级钢琴 ST
- 【BZOJ】2006 [NOI2010]超级钢琴 ST表+堆+贪心
- bzoj 2006: [NOI2010]超级钢琴【st表+堆】
- [NOI2010]超级钢琴(可持续化线段树)
- [BZOJ2006][[NOI2010]超级钢琴][优先队列+线段树]
- BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】
- bzoj2006: [NOI2010]超级钢琴(堆+RMQ)