JZYZOJ1527 [haoi2012]高速公路 线段树 期望

http://172.20.6.3/Problem_Show.asp?id=1527

日常线段树的pushdown写挂,果然每次写都想得不全面,以后要注意啊……
求期望部分也不熟练,和平均数搞混也是orz,我已经是个期望都求不出来的废人了。
这道题显然(大概)每个段的贡献是val[i]*(y-i+1)*(i-x+1);
整体来说算是一看就是线段树的题。

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 #define lc x*2
 9 #define rc x*2+1
10 const int maxn=1<<18;
11 long long n,m;char ch[2]={};
12 struct seg{
13     long long l,r,v,w,v1,v2,w1,w2;
14     seg(){l=r=v1=v2=w1=w2=v=w=0;}
15 }e[maxn];
16 long long v1,v2,v3;
17 void pushdown(long long x,long long v){
18     if(v!=0){
19         long long siz=e[x].r-e[x].l+1;
20         e[x].v+=siz*v;
21         e[x].w1+=e[x].v1*v;
22         e[x].w2+=e[x].v2*v;
23         e[x].w+=v;
24     }
25 }
26 void doit(long long x){
27     pushdown(lc,e[x].w);
28     pushdown(rc,e[x].w);
29     e[x].w=0;
30 }
31 void pushup(long long x){
32     if(e[x].l<e[x].r){
33         e[x].v=e[lc].v+e[rc].v;
34         e[x].w1=e[lc].w1+e[rc].w1;
35         e[x].w2=e[lc].w2+e[rc].w2;
36     }
37 }
38 void cha(long long x,long long l,long long r,long long w){
39     if(l<=e[x].l&&e[x].r<=r){
40         pushdown(x,w);
41         return;
42     }doit(x);
43     long long mid=(e[x].l+e[x].r)/2;
44     if(l<=mid)cha(lc,l,r,w);
45     if(r>mid)cha(rc,l,r,w);
46     pushup(x);
47 }
48 void sum(long long x,long long l,long long r){
49     if(l<=e[x].l&&e[x].r<=r){
50         v1+=e[x].v;v2+=e[x].w1;v3+=e[x].w2;
51         return;
52     }doit(x);
53     long long mid=(e[x].l+e[x].r)/2;
54     if(l<=mid)sum(lc,l,r);
55     if(r>mid)sum(rc,l,r);
56     pushup(x);
57 }
58 void build(long long x,long long l,long long r){
59     e[x].l=l;e[x].r=r;
60     if(l==r){
61         e[x].v1=l;e[x].v2=l*l;return;
62     }
63     long long mid=(l+r)/2;
64     build(lc,l,mid);
65     build(rc,mid+1,r);
66     e[x].v1=e[lc].v1+e[rc].v1;e[x].v2=e[lc].v2+e[rc].v2;
67 }
68 long long gcd(long long x,long long y){
69     while(y){
70         long long w=y;y=x%y;x=w;
71     }
72     return x;
73 }
74 int main(){
75     build(1,1,1<<17);
76     scanf("%I64d%I64d",&n,&m);
77     long long x,y,v;
78     for(int i=1;i<=m;i++){
79         scanf("%s",&ch);
80         if(ch[0]==‘C‘){
81             scanf("%I64d%I64d%I64d",&x,&y,&v);
82             cha(1,x,y-1,v);
83         }
84         else{
85             scanf("%I64d%I64d",&x,&y);
86             v1=v2=v3=0;sum(1,x,y-1);
87             long long ans=v1*(y-x*y)+v2*(x+y-1)-v3;
88             long long z=y-x;long long zong=z*(z+1)/2;
89             long long w=gcd(ans,zong);
90             printf("%I64d/%I64d\n",ans/w,zong/w);
91         }
92     }
93     return 0;
94 }

时间: 2024-10-07 20:03:24

JZYZOJ1527 [haoi2012]高速公路 线段树 期望的相关文章

BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]

2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1219  Solved: 446[Submit][Status][Discuss] Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1

[CF895E] Eyes Closed(线段树,期望)

Desctiption 传送门:Portal 大致题意: 给你一个序列, 支持两种操作: 1 l1 r1 l2 y2 在\([l1, r1]\)随机选择一个数a, \([l2, r2]\) 内随机选择一个数b, 交换a, b. 2 l r 询问一个区间的期望. \[ n \leq 200000; a_i \leq 1e9 \] Solution 根据==期望线性性==,只需要维护出==每个位置元素值的期望==就可以. ==区间操作期望==问题的经典套路是==维护出每个位置的期望==. 考虑一个数

BZOJ 4262 线段树+期望

思路: 把询问离线下来,查询max和查询min相似,现在只考虑查询max 令sum[l,r,x]表示l到r内的数为左端点,x为右端点的区间询问的答案 那么询问就是sun[l1,r1,r2]-sum[l1,r1,l1-1] 从1到n枚举x,维护区间线段树表示sum[l,r,x],发现从x-1转移到x的过程中,每个数加上了max(a[pos]..a[x])的答案. 用单调队列维护一个单调递减的序列,由于a数列是随机的,这个队列期望有log个元素,所以只需要对这log段暴力修改,复杂度nlog^2n

【BZOJ2752】[HAOI2012]高速公路(road) 线段树

[BZOJ2752][HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用.高速路刚建成时所有的路段都是免费的.政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政

BZOJ 2752:[HAOI2012]高速公路(road)(线段树)

[HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用.高速路刚建成时所有的路段都是免费的.政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价.无聊的

Bzoj 2752 高速公路 (期望,线段树)

Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时候把\(r - 1\)就好了. 这里的期望显然就是路径的平均值. 期望值: \[\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}\] 下面部分可以直接算出: 上面这一部分比较难维护. 考虑每一条边会被走过多少次. \[ans = \su

BZOJ 2752 [HAOI2012]高速公路(road) 线段树

题意:链接 方法:线段树 解析: 这道题刚开始脑抽想了个O(n/2*(logn)*m)的脑抽算法就写上交了=-= 然而当时我神奇地在草纸上写了个O(sqrt(n)/2*(logn)*m).. 当时在想另一个什么分块的什么东西就没过大脑=-= 然后开始找规律呗. 不妨把权值安到点上. 之后考虑一个点的贡献是什么. 其左边有多少个点,右边有多少个点的乘积. 这很显然啊,就是在枚举大长线段的左右端点啊.. 所以假设某个点的权值是val 那么就是val[i](i-x+1)(y-i+1)对吧. 之后就是展

hdu-5805 NanoApe Loves Sequence(线段树+概率期望)

题目链接: NanoApe Loves Sequence Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 262144/131072 K (Java/Others) Problem Description NanoApe, the Retired Dog, has returned back to prepare for the National Higher Education Entrance Examination! In

P3924 康娜的线段树(期望)

P3924 康娜的线段树 看起来$O(nlogn)$可过其实由于巨大常数是无法通过的 $O(nlogn)$:70pts 我们手玩样例发现 线段树上某个节点的期望值$f[o]=(f[lc]+f[rc])/2+sum[o]$ $s[o]$表示该节点代表的区间和. 每次$Add(l,r,x)$时,每个x对于$f[o]$的贡献是固定的,即$f[o]+=x*k[o]$ 这个$k[o]$可以在建树时预处理. 然鹅卡不过TAT #include<iostream> #include<cstdio>