BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
Submit:?1820??Solved:?736
[Submit][Status][Discuss]
Description
Y901高速公路是一條重要的交通紐帶,政府部門建設(shè)初期的投入以及使用期間的養(yǎng)護(hù)費(fèi)用都不低,因此政府在這條高速公路上設(shè)立了許多收費(fèi)站。
Y901高速公路是一條由N-1段路以及N個(gè)收費(fèi)站組成的東西向的鏈,我們按照由西向東的順序?qū)⑹召M(fèi)站依次編號(hào)為1~N,從收費(fèi)站i行駛到i+1(或從i+1行駛到i)需要收取Vi的費(fèi)用。高速路剛建成時(shí)所有的路段都是免費(fèi)的。
政府部門根據(jù)實(shí)際情況,會(huì)不定期地對(duì)連續(xù)路段的收費(fèi)標(biāo)準(zhǔn)進(jìn)行調(diào)整,根據(jù)政策漲價(jià)或降價(jià)。
無(wú)聊的小A同學(xué)總喜歡研究一些稀奇古怪的問(wèn)題,他開車在這條高速路上行駛時(shí)想到了這樣一個(gè)問(wèn)題:對(duì)于給定的l,r(l<r),在第l個(gè)到第r個(gè)收費(fèi)站里等概率隨機(jī)取出兩個(gè)不同的收費(fèi)站a和b,那么從a行駛到b將期望花費(fèi)多少費(fèi)用呢?
Input
第一行2個(gè)正整數(shù)N,M,表示有N個(gè)收費(fèi)站,M次調(diào)整或詢問(wèn)
接下來(lái)M行,每行將出現(xiàn)以下兩種形式中的一種
C l r v 表示將第l個(gè)收費(fèi)站到第r個(gè)收費(fèi)站之間的所有道路的通行費(fèi)全部增加v
Q l r?? 表示對(duì)于給定的l,r,要求回答小A的問(wèn)題
所有C與Q操作中保證1<=l<r<=N
Output
對(duì)于每次詢問(wèn)操作回答一行,輸出一個(gè)既約分?jǐn)?shù)
若答案為整數(shù)a,輸出a/1
Sample Input
4 5C 1 4 2
C 1 2 -1
Q 1 2
Q 2 4
Q 1 4
Sample Output
1/18/3
17/6
HINT
?
數(shù)據(jù)規(guī)模
所有C操作中的v的絕對(duì)值不超過(guò)10000
在任何時(shí)刻任意道路的費(fèi)用均為不超過(guò)10000的非負(fù)整數(shù)
所有測(cè)試點(diǎn)的詳細(xì)情況如下表所示
Test N M
1 =10 =10
2 =100 =100
3 =1000 =1000
4 =10000 =10000
5 =50000 =50000
6 =60000 =60000
7 =70000 =70000
8 =80000 =80000
9 =90000 =90000
10 =100000 =100000
Source
?
這題跟期望有個(gè)雞毛關(guān)系??
每個(gè)位置被選擇的概率是相等的,因此每次詢問(wèn)的答案為
$\frac{\sum_{i = l}^r \sum_{j = i}^r dis(i, j)}{C_{r - l + 1}^2}$,
發(fā)現(xiàn)下面是個(gè)常數(shù)
上面比較難處理,考慮枚舉每一個(gè)數(shù)的貢獻(xiàn)$\sum_{i = l}^r a[i] * (r - i + 1) * (i - l + 1)$
然后展開,發(fā)現(xiàn)可以用線段樹維護(hù)。
完了。。
?
#include<cstdio> #include<algorithm> //#define LL long long #define int long long using namespace std; const int MAXN = 4 * 1e5 + 10; 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; } #define ls(k) k << 1 #define rs(k) k << 1 | 1 struct Node {int l, r, siz;int w[3], tag;Node() {w[0] = w[1] = w[2] = tag = l = r = 0;}/*Node operator + (const Node &rhs) const {Node x = *this;for(int i = 0; i < 2; i++) x.w[i] += rhs.w[i];return x;}*/void print() {printf("%d %d %d\n", w[0], w[1], w[2]);} }T[MAXN]; void update(int k) {for(int i = 0; i <= 2; i++) T[k].w[i] = T[ls(k)].w[i] + T[rs(k)].w[i]; } int calc(int n) {return (2 * n + 1) * (n + 1) * n / 6; } void down(int val, int k) {T[k].w[0] += ((T[k].r + 1) * T[k].r - (T[k].l ) * (T[k].l - 1)) / 2 * val;T[k].w[1] += (calc(T[k].r) - calc(T[k].l - 1)) * val;T[k].w[2] += T[k].siz * val;T[k].tag += val; } void pushdown(int k) {if(!T[k].tag) return;down(T[k].tag, ls(k)); down(T[k].tag, rs(k));T[k].tag = 0; } void Build(int k, int ll, int rr) {T[k].l = ll; T[k].r = rr; T[k].siz = rr - ll + 1;if(ll == rr) return ;int mid = ll + rr >> 1;Build(ls(k), ll, mid); Build(rs(k), mid + 1, rr); } void IntervalAdd(int k, int ll, int rr, int val) {if(ll <= T[k].l && T[k].r <= rr) {down(val, k); return ;}pushdown(k);int mid = (T[k].l + T[k].r) >> 1;if(ll <= mid) IntervalAdd(ls(k), ll, rr, val);if(rr > mid) IntervalAdd(rs(k), ll, rr, val);update(k); } Node Merge(Node x, Node y) {for(int i = 0; i <= 2; i++)x.w[i] += y.w[i];return x; } Node IntervalAsk(int k, int ll, int rr) {Node ans;//ans.print();if(ll <= T[k].l && T[k].r <= rr) {ans = T[k]; return ans;}pushdown(k);int mid = T[k].l + T[k].r >> 1;//Node ls = IntervalAsk(ls(k), ll, rr);if(ll <= mid) ans = Merge(ans, IntervalAsk(ls(k), ll, rr));if(rr > mid) ans = Merge(ans, IntervalAsk(rs(k), ll ,rr));//ans.print();return ans; } int Query(int l, int r) {Node ans = IntervalAsk(1, l, r);int up, down;down = (r - l + 1) * (r - l + 2) / 2;up = ans.w[0] * (r + l) - ans.w[1] - ans.w[2] * (r * l + l - r - 1);int gcd = __gcd(down, up);printf("%lld/%lld\n", up / gcd, down / gcd); } int N, Q; main() {N = read(); Q = read();Build(1, 1, N);while(Q--) {char c = '-'; while(c != 'C' && c != 'Q') c = getchar();int l = read(), r = read(), v;if(c == 'C') v = read(), IntervalAdd(1, l, r - 1, v);else Query(l, r - 1);} }?
轉(zhuǎn)載于:https://www.cnblogs.com/zwfymqz/p/9289469.html
總結(jié)
以上是生活随笔為你收集整理的BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端感悟
- 下一篇: 栈和队列----用栈求解汉诺塔问题