P1438 無聊的數列 題解
阿新 • • 發佈:2021-10-30
Description
Solution
很明顯的一道線段樹維護區間題目。
檢視一下標籤不難發現,可以用差分來維護。
具體來說,對於操作 1。
-
我們給 \(l\) 加上 \(K\)。
-
\(l\) + 1 ~ \(r\) 加上 \(D\)(兩個數之間的差)。
-
\(r + 1\) 減去 \(K * (r - l) * D\)(除去自己的一個 \(D\))。
然後對於查詢操作。
直接輸出 \(1\) ~ \(p\) 的區間和再加上原陣列上的數即可。
總結:其實就是差分線上段樹上的一個應用。
具體看程式碼吧(我是不會告訴你我快讀寫掛了,調了半天)。
Code
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define ls rt << 1 #define rs rt << 1 | 1 using namespace std; inline int read(){ int x = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();} while(ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar(); return x * f; } const int N = 1e5 + 10; int n, m; int sum[N << 2], lazy[N << 2], a[N]; inline void pushup(int rt){ sum[rt] = sum[ls] + sum[rs]; } inline void pushdown(int l, int r, int rt){ if(lazy[rt]){ int mid = (l + r) >> 1; sum[ls] += lazy[rt] * (mid - l + 1); sum[rs] += lazy[rt] * (r - mid); lazy[ls] += lazy[rt]; lazy[rs] += lazy[rt]; lazy[rt] = 0; } } inline void update(int L, int R, int k, int l, int r, int rt){ if(L <= l && r <= R){ sum[rt] += k * (r - l + 1); lazy[rt] += k; return; } pushdown(l, r, rt); int mid = (l + r) >> 1; if(L <= mid) update(L, R, k, l, mid, ls); if(R > mid) update(L, R, k, mid + 1, r, rs); pushup(rt); } inline int query(int L, int R, int l, int r, int rt){ if(L <= l && r <= R) return sum[rt]; pushdown(l, r, rt); int mid = (l + r) >> 1; int res = 0; if(L <= mid) res += query(L, R, l, mid, ls); if(R > mid) res += query(L, R, mid + 1, r, rs); return res; } int main(){ freopen("P1438.in", "r", stdin); freopen("P1438.out", "w", stdout); n = read(), m = read(); for(int i = 1; i <= n; ++i) a[i] = read(); for(int i = 1; i <= m; ++i){ int op = read(); if(op == 1){ int l = read(), r = read(), k = read(), d = read(); update(l, l, k, 1, n, 1); if(r > l) update(l + 1, r, d, 1, n, 1); if(r != n) update(r + 1, r + 1, -(k + (r - l) * d), 1, n, 1); }else{ int x = read(); printf("%d\n", a[x] + query(1, x, 1, n, 1)); } } return 0; }
End
本文來自部落格園,作者:xixike,轉載請註明原文連結:https://www.cnblogs.com/xixike/p/15484726.html