BZOJ 2752 高速公路(road)(线段树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2752
题意:给出一个数列A,维护两种操作:
(1)将区间[L,R]之内的所有数字增加det;
(2)给出区间[L,R],在该区间内任意选出两个位置l和r(L<=l<=r<=R),[l,r]的费用为该区间的数字之和。求费用的期望。
思路:对于区间[L,R],长度len=(R-L+1),可知不同的区间种类有(len+1)*len/2种,那么接下来就是计算所有区间下的数字和的和S。我们发现:
接下来我们看对于这个S我们在修改时怎么维护它?对于区间[L,R],我们设置参数sum,Lsum,Rsum,t,p,size:
那么对于区间[L,mid],[mid+1,R]以及区间[L,R],我们设其分别为p、q、a,那么区间合并为:
对于区间增加x:
struct node
{
int L,R;
i64 sum,Lsum,Rsum,S,det,t,p,size;
void add(i64 x)
{
det+=x;
sum+=x*size;
Lsum+=t*x;
Rsum+=t*x;
S+=x*p;
}
};
node a[N<<2];
i64 get(i64 n)
{
return n*(n+1)*(n+1)/2-n*(n+1)*(2*n+1)/6;
}
i64 get1(i64 n)
{
return n*(n+1)/2;
}
void build(int t,int L,int R)
{
a[t].L=L;
a[t].R=R;
a[t].size=R-L+1;
a[t].t=get1(R-L+1);
a[t].p=get(R-L+1);
a[t].sum=a[t].Lsum=a[t].Rsum=a[t].S=0;
a[t].det=0;
if(L==R) return;
int mid=(L+R)>>1;
build(t*2,L,mid);
build(t*2+1,mid+1,R);
}
void pushUp(node &a,node p,node q)
{
if(a.L==a.R) return;
a.sum=p.sum+q.sum;
a.Lsum=p.Lsum+q.Lsum+q.sum*p.size;
a.Rsum=q.Rsum+p.Rsum+p.sum*q.size;
a.S=p.S+p.Lsum*q.size+q.S+q.Rsum*p.size;
}
void pushDown(int t)
{
if(a[t].L==a[t].R) return;
if(a[t].det)
{
a[t*2].add(a[t].det);
a[t*2+1].add(a[t].det);
a[t].det=0;
}
}
void update(int t,int L,int R,i64 x)
{
if(a[t].L==L&&a[t].R==R)
{
a[t].add(x);
return;
}
pushDown(t);
int mid=(a[t].L+a[t].R)>>1;
if(R<=mid) update(t*2,L,R,x);
else if(L>mid) update(t*2+1,L,R,x);
else
{
update(t*2,L,mid,x);
update(t*2+1,mid+1,R,x);
}
pushUp(a[t],a[t*2],a[t*2+1]);
}
node getSum(int t,int L,int R)
{
if(a[t].L==L&&a[t].R==R) return a[t];
pushDown(t);
node l,r,ans;
int mid=(a[t].L+a[t].R)>>1;
if(R<=mid) ans=getSum(t*2,L,R);
else if(L>mid) ans=getSum(t*2+1,L,R);
else
{
l=getSum(t*2,L,mid);
r=getSum(t*2+1,mid+1,R);
ans.L=L;
ans.R=R;
ans.size=R-L+1;
pushUp(ans,l,r);
}
pushUp(a[t],a[t*2],a[t*2+1]);
return ans;
}
int n,m;
i64 Gcd(i64 x,i64 y)
{
if(y==0) return x;
return Gcd(y,x%y);
}
int main()
{
RD(n,m);
build(1,1,n-1);
int L,R;
i64 x,ans,S,k;
char op[5];
while(m--)
{
RD(op);
if(op[0]=='C')
{
RD(L,R); R--;
RD(x);
update(1,L,R,x);
}
else
{
RD(L,R); R--;
ans=getSum(1,L,R).S;
S=get1(R-L+1);
k=Gcd(ans,S);
ans/=k; S/=k;
printf("%lld/%lld\n",ans,S);
}
}
}
BZOJ 2752 高速公路(road)(线段树)的更多相关文章
- Bzoj 2752 高速公路 (期望,线段树)
Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...
- BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )
对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...
- BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1219 Solved: 446[Submit] ...
- BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1820 Solved: 736[Submit][Status][Discuss] Descripti ...
- 【bzoj2752】[HAOI2012]高速公路(road) 线段树
题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西 ...
- [bzoj2752]高速公路 题解(线段树)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2102 Solved: 887[Submit] ...
- [BZOJ 2752] 高速公路
Link: BZOJ 2752 传送门 Solution: 虽然有期望,但实际上就是除了个总数…… 此题计算总代价明显还是要使用对每个$w_i$计算贡献的方式: $w_i的贡献为w_i*(i-l+1) ...
- BZOJ.3938.Robot(李超线段树)
BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
随机推荐
- Memcached常用命令及使用说明
一.存储命令 存储命令的格式: 1 2 <command name> <key> <flags> <exptime> <bytes> < ...
- 【BZOJ】【1016】【JSOI2008】最小生成树计数
Kruskal/并查集+枚举 唉我还是too naive,orz Hzwer 一开始我是想:最小生成树删掉一条边,再加上一条边仍是最小生成树,那么这两条边权值必须相等,但我也可以去掉两条权值为1和3的 ...
- 【BZOJ】【2809】【APIO2012】派遣dispatching
贪心/可并堆 跪了……我这么弱果然还是应该回家种红薯去…… 考虑选人的时候,每个人对答案的贡献其实是一样的,都是1,那么我们就贪心地去选花钱少的就好啦~ 具体的做法:倒着枚举(因为有b[i]<i ...
- JavaScript在IE6,IE7下报错'expected identifier, string or number'
问题: 代码在Forefox和IE8下工作正常,但是在IE6下报错: expected identifier, string or number 假如变量options有多个选项,那么我们可以用逗号分 ...
- java如何操作注册表(Preferences类)(在windows的注册表中保存、读取)
我们经常需要将我们的程序运行中的一些信息(比如在选项对话框中的设置)记录下来,以做便再次运行的时候不用再重写填写这些数据.这对改善软件的人机可用性方面是很有用的.比如:数据库监控.日志工具,JDBMo ...
- [geeksforgeeks] Convert a given Binary Tree to Doubly Linked List
http://www.geeksforgeeks.org/in-place-convert-a-given-binary-tree-to-doubly-linked-list/ Given a Bin ...
- 说说Thread.Sleep(0)的那些奇怪的事
写在前面 最近在弄一个传输组件,用到很多多线程的知识,其中有个问题,困扰我很久,不知道是什么原因,脑子一热,在传输过程中,添加了一句代码Thread.Sleep(0).那个问题竟然解决了,耗费我一上午 ...
- Virtualbox网络设置和无UI启动
因工作需要,在Macbook上安装Ubuntu 14.04.2虚拟机,需要ssh连接操作. 一番查找资料,实践后可以正常工作了,记录一些信息以备用 无UI启动虚拟机,可使用以下命令: VBoxMana ...
- asp.net word ecxel类型文件在线预览
asp.net word ecxel类型文件在线预览 首先得引用COM: Microsoft Excel 10 Object Library Microsoft Word 10 Object Libr ...
- NET 查找程序集路径(CLR关于Assembly的搜索路径的过程)
最近在回顾.Net应用程序的执行环境,这里做一个很小的总结,方面以后需要的时候进行查找: CLR必须可以找到正确的Assembly,Net提供了Assembly搜索算法,可以根据.config文件(类 ...