BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]
2752: [HAOI2012]高速公路(road)
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 1219 Solved: 446
[Submit][Status][Discuss]
Description
Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站。
Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用。高速路刚建成时所有的路段都是免费的。
政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价。
无聊的小A同学总喜欢研究一些稀奇古怪的问题,他开车在这条高速路上行驶时想到了这样一个问题:对于给定的l,r(l<r),在第l个到第r个收费站里等概率随机取出两个不同的收费站a和b,那么从a行驶到b将期望花费多少费用呢?
Input
第一行2个正整数N,M,表示有N个收费站,M次调整或询问
接下来M行,每行将出现以下两种形式中的一种
C l r v 表示将第l个收费站到第r个收费站之间的所有道路的通行费全部增加v
Q l r 表示对于给定的l,r,要求回答小A的问题
所有C与Q操作中保证1<=l<r<=N
Output
对于每次询问操作回答一行,输出一个既约分数
若答案为整数a,输出a/1
Sample Input
C 1 4 2
C 1 2 -1
Q 1 2
Q 2 4
Q 1 4
Sample Output
8/3
17/6
HINT
数据规模
所有C操作中的v的绝对值不超过10000
在任何时刻任意道路的费用均为不超过10000的非负整数
所有测试点的详细情况如下表所示
Test N M
10 =100000 =100000
期望恐惧症.............然而本题还是能做的
边权转点权
直接用定义,只要求所有选择的费用和/((qr-ql+1)*(qr-ql)/2)就行了
然后想到vi的前缀和,列出式子来考虑每个前缀和的贡献,发现可搞...然后意识到前缀和更新起来费劲了..........
其实直接考虑每个vi的贡献就行了,就是vi*(i-l+1)*(r-i),注意是边权
化简后vi*i*(l+r-1)-vi*i^2+vi*i*(r-l*r)
线段树维护vi和vi*i和vi*i^2
不要忘了平方数列的求和公式
注意:
1.因为是边权,所以vi*(i-l+1)*(r-i)中的vi最多到v[r-1],而不能直接qr--!!!
2.n*n可能爆int啊啊啊啊啊啊啊啊啊
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- #define lc x<<1
- #define rc x<<1|1
- #define m ((l+r)>>1)
- #define lson x<<1,l,m
- #define rson x<<1|1,m+1,r
- const int N=1e5+;
- typedef long long ll;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,Q;
- ll ql,qr,v;
- char s[N];
- struct node{
- int add;
- ll s[];
- }t[N<<];
- inline void merge(int x){
- for(int i=;i<;i++) t[x].s[i]=t[lc].s[i]+t[rc].s[i];
- }
- inline ll cal(ll l,ll r){return (ll)r*(r+)*(*r+)/-(ll)(l-)*l*(*l-)/;}
- inline void paint(int x,int l,int r,ll d){
- ll len=r-l+;
- t[x].add+=d;
- t[x].s[]+=(ll)len*d;
- t[x].s[]+=(ll)len*(l+r)/*d;
- t[x].s[]+=cal(l,r)*d;
- }
- inline void pushDown(int x,int l,int r){
- if(t[x].add){
- paint(lson,t[x].add);
- paint(rson,t[x].add);
- t[x].add=;
- }
- }
- void build(int x,int l,int r){
- if(l==r) paint(x,l,r,);
- else{
- build(lson);
- build(rson);
- merge(x);
- }
- }
- void segAdd(int x,int l,int r,int ql,int qr,ll d){
- if(ql<=l&&r<=qr) paint(x,l,r,d);
- else{
- pushDown(x,l,r);
- if(ql<=m) segAdd(lson,ql,qr,d);
- if(m<qr) segAdd(rson,ql,qr,d);
- merge(x);
- }
- }
- ll segQue(int x,int l,int r,int ql,int qr,int k){
- if(ql<=l&&r<=qr) return t[x].s[k];
- else{
- pushDown(x,l,r);
- ll ans=;
- if(ql<=m) ans+=segQue(lson,ql,qr,k);
- if(m<qr) ans+=segQue(rson,ql,qr,k);
- return ans;
- }
- }
- inline ll gcd(ll a,ll b){return b==?a:gcd(b,a%b);}
- int main(){
- //freopen("in.txt","r",stdin);
- n=read();Q=read();
- build(,,n-);
- while(Q--){
- scanf("%s",s);ql=read();qr=read();
- if(s[]=='C') v=read(),segAdd(,,n,ql,qr-,v);
- else{
- ll a=segQue(,,n,ql,qr-,)*(qr-ql*qr)+segQue(,,n,ql,qr-,)*(ql+qr-)-segQue(,,n,ql,qr-,);
- ll b=((qr-ql+)*(qr-ql)/);
- ll g=gcd(a,b);//printf("hi %lld %lld %lld\n",a,b,g);
- printf("%lld/%lld\n",a/g,b/g);
- }
- }
- }
BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]的更多相关文章
- BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )
对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...
- BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1820 Solved: 736[Submit][Status][Discuss] Descripti ...
- BZOJ 2752 [HAOI2012]高速公路(road):线段树【维护区间内子串和】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2752 题意: 有一个初始全为0的,长度为n的序列a. 有两种操作: (1)C l r v: ...
- bzoj 2752: [HAOI2012]高速公路(road)
Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收 ...
- ●BZOJ 2752 [HAOI2012]高速公路(road)
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2752题解: 期望,线段树. 把每个路段看成一个点,那么对于l~R的操作,就可以转化为对l~r ...
- 【bzoj2752】[HAOI2012]高速公路(road) 线段树
题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西 ...
- 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)
传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...
- P2221 [HAOI2012]高速公路(线段树)
P2221 [HAOI2012]高速公路 显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$ 下面倒是挺好算,组合数瞎搞 ...
- 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)
传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...
随机推荐
- POI读写大数据量excel,解决超过几万行而导致内存溢出的问题
1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384 ...
- ubantu下su命令Authentication failure失败的解决方式
Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许 su 到 root . 可以使用: sudo passwd 来重新设置root密码,后即可登陆root. ortonwu@ubu ...
- Linux-vmware tools安装与cdrom挂载(转)
昨天想直接复制虚拟机centos系统中命令行的内容到主机的txt文档上进行保存,发现不能实现虚拟机与主机之间的直接通讯,后来查资料发现原来是由于我的虚拟机没有安装vwmare tools的缘故. 一个 ...
- oracle游标的使用
--游标的使用 步骤1.声明游标 .打开游标 .获取数据 .关闭游标 declare cursor cur is select * from emp; t_sal cur%rowtype; begin ...
- 基础二 day4 日记
1.list增删改查 l1 = [1,'alex',True,[1,2,3],(2,3,4),{'name':'alex'}]l1 = ['alex',True,'wusir','ritian','t ...
- 解决spring定时任务执行2次和tomcat部署缓慢的问题
spring定时任务执行2次 问题重现和解析 最近使用quartz定时任务框架,结果发现开发环境执行无任何问题,部署到服务器上后,发现同一时间任务执行了多次.经过搜索发现是服务器上tomcat的配置文 ...
- APACHE服务器出现No input file specified.的完美解决方案
转自:http://www.upupw.net/server/n53.html 启用REWRITE的伪静态功能的时候,首页可以访问,而访问内页的时候,就提示:"No input file s ...
- alert一般用来调试客户端的javascript代码,以及更好的调试方法
alert一般用来调试客户端的javascript代码 调试利器--console.log 如今主流浏览器(Chrome,IE8及后续版本,FireFox,Opera等)都支持控制台功能. Chrom ...
- 全新的软件项目,好的开始决定了成功一半!(需求&计划)
刚看完“无问西东”,电影里说人总归还是要留下些足迹(文字)的,那么赶紧跑图书馆来留下些文字. 最近去瑞士启动了一个新的项目,那么早上做项目,晚上总结留下了一张张思维导图来记录当时的感受, 手稿如下,字 ...
- Redis持久化磁盘IO方式及其带来的问题 有Redis线上运维经验的人会发现Redis在物理内存使用比较多,但还没有超过实际物理内存总容量时就会发生不稳定甚至崩溃的问题,有人认为是基于快照方式持
转自:http://blog.csdn.net/kaosini/article/details/9176961 一.对Redis持久化的探讨与理解 redis是一个支持持久化的内存数据库,也就是 ...