HDU6315 Naive Operations(線段樹 復雜度分析)
阿新 • • 發佈:2018-10-07
pre const pac 記得 \n php 時間 interval else if
題意
題目鏈接
Sol
這題關鍵是註意到題目中的\(b\)是個排列
那麽最終的答案最多是\(nlogn\)(調和級數)
設\(d_i\)表示\(i\)號節點還需要加\(d_i\)次才能產生\(1\)的貢獻
用線段樹維護每個節點裏\(d_i\)的最小值,每次當\(d_i - 1= 0\)的時候往下遞歸即可
時間復雜度:\(O(nlog^2 n)\)
多組數據記得清空lazy標記啊qwq。。。。
#include<bits/stdc++.h> using namespace std; const int MAXN = 1e6; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') {if(c == '-')f =- 1; c = getchar();} while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f; } int N, M, b[MAXN]; #define ls k << 1 #define rs k << 1 | 1 struct Node { int l, r, mn, sum, f; }T[MAXN]; void update(int k) { T[k].mn = min(T[ls].mn, T[rs].mn); T[k].sum = T[ls].sum + T[rs].sum; } void add(int k, int val) { T[k].mn -= val; T[k].f += val; } void pushdown(int k) { if(!T[k].f) return ; add(ls, T[k].f); add(rs, T[k].f); T[k].f = 0; } void Build(int k, int ll, int rr) { T[k].l = ll; T[k].r = rr; T[k].sum = 0; T[k].f = 0; if(ll == rr) {T[k].mn = b[ll]; return ;} int mid = ll + rr >> 1; Build(ls, ll, mid); Build(rs, mid + 1, rr); update(k); } void dec(int k) { if(T[k].mn == 0) { if(T[k].l == T[k].r) T[k].sum++, T[k].mn = b[T[k].l]; else pushdown(k), dec(ls), dec(rs), update(k); } } void IntervalAdd(int k, int ll, int rr) { if(ll <= T[k].l && T[k].r <= rr) { add(k, 1); if(T[k].mn == 0) dec(k); return ; } pushdown(k); int mid = T[k].l + T[k].r >> 1; if(ll <= mid) IntervalAdd(ls, ll, rr); if(rr > mid) IntervalAdd(rs, ll, rr); update(k); } int Query(int k, int ll, int rr) { if(ll <= T[k].l && T[k].r <= rr) return T[k].sum; pushdown(k); int mid = T[k].l + T[k].r >> 1; if(rr <= mid) return Query(ls, ll, rr); else if(ll > mid) return Query(rs, ll, rr); else return Query(ls, ll, rr) + Query(rs, ll, rr); } main() { while(scanf("%d %d", &N, &M) == 2) { for(int i = 1; i <= N; i++) b[i] = read(); Build(1, 1, N); while(M--) { char s[6]; int l, r; scanf("%s", s + 1); l = read(), r = read(); if(s[1] == 'a') IntervalAdd(1, l, r); else printf("%d\n", Query(1, l, r)); } } }
HDU6315 Naive Operations(線段樹 復雜度分析)