[Luogu 2221] HAOI2012 高速公路
[Luogu 2221] HAOI2012 高速公路
比较容易看出的线段树题目。
由于等概率,期望便转化为 子集元素和/子集个数。
每一段l..r中,子集元素和为:
\(\sum w_{i}(i-l+1)(r-i)\) //\((i-l+1)(r-i)\)是每个数用到的次数
\(=\sum w_{i}((r-lr)+(l+r-1)i-i^{2})\)
\(=(r-lr)\sum w_{i}+(l+r-1)\sum i\times w_{i}-\sum i^{2}\times w_{i}\)
由此观之,线段树需要维护\(\sum w_{i}\)v[0]、\(\sum i\times w_{i}\)v[1]、\(\sum i^{2}\times w_{i}\)v[2]。
有这样一个神奇的公式:
\(1^{2}+2^{2}+\dots+n^{2}=n(n+1)(2n+1)/6\)
所以,在进行Update操作时,设size=r-l+1,改变量为v:
v[0]+=v*size;
v[1]+=v*size*(l+r)>>1;
v[2]+=v*(r*(r+1)*((r<<1)+1)-(l-1)*l*((l<<1)-1))/6LL;
记得开long long以及各种强制转int为long long!隐式类型转换简直天坑。
线段树基础不扎实的我这题调了一天…
#include <cstdio>
#include <cstring>
const int MAXN=100010;
int n,m;
class SegmentTree
{
public:
SegmentTree(void)
{
memset(s,0,sizeof s);
}
void BuildTree(int i,int l,int r)
{
s[i].l=l,s[i].r=r;
if(l==r)
return;
int j=i<<1,mid=l+r>>1;
BuildTree(j,l,mid),BuildTree(j+1,mid+1,r);
}
void Add(int i,int l,int r,long long v)
{
if(l==s[i].l && r==s[i].r)
{
Update(i,v);
return;
}
if(s[i].l!=s[i].r && s[i].lazy)
PushDown(i);
int j=i<<1,mid=s[i].l+s[i].r>>1;
if(r<=mid)
Add(j,l,r,v);
else if(l>mid)
Add(j+1,l,r,v);
else
Add(j,l,mid,v),Add(j+1,mid+1,r,v);
PushUp(i);
}
void Ans(long long l,long long r)
{
long long t,ans,cnt=(r-l+1)*(r-l)>>1LL,sum[3];
for(int i=0;i<3;++i)
sum[i]=Sum(1,l,r-1,i);
ans=sum[0]*(r-l*r)+sum[1]*(l+r-1)-sum[2];
t=GCD(ans,cnt);
printf("%lld/%lld\n",ans/t,cnt/t);
}
private:
struct node
{
int l,r;
long long lazy,v[3];
}s[MAXN<<2];
long long GCD(long long x,long long y)
{
return !y ? x : GCD(y,x%y);
}
void Update(int i,long long v)
{
long long l=s[i].l,r=s[i].r,size=r-l+1;
s[i].lazy+=v;
s[i].v[0]+=v*size;
s[i].v[1]+=v*size*(l+r)>>1;
s[i].v[2]+=v*(r*(r+1)*((r<<1)+1)-(l-1)*l*((l<<1)-1))/6LL;
}
void PushUp(int i)
{
for(int j=0;j<3;++j)
s[i].v[j]=s[i<<1].v[j]+s[i<<1|1].v[j];
}
void PushDown(int i)
{
int j=i<<1;
Update(j,s[i].lazy),Update(j+1,s[i].lazy);
s[i].lazy=0;
}
long long Sum(int i,int l,int r,int k)
{
if(l==s[i].l && r==s[i].r)
return s[i].v[k];
if(s[i].l!=s[i].r && s[i].lazy)
PushDown(i);
int j=i<<1,mid=s[i].l+s[i].r>>1;
if(r<=mid)
return Sum(j,l,r,k);
else if(l>mid)
return Sum(j+1,l,r,k);
else
return Sum(j,l,mid,k)+Sum(j+1,mid+1,r,k);
}
}T;
int main(int argc,char *argv[])
{
scanf("%d %d",&n,&m);
T.BuildTree(1,1,n-1);
for(int i=1,l,r,v;i<=m;++i)
{
char c;
scanf("\n%c %d %d",&c,&l,&r);
if(c=='C')
{
scanf("%d",&v);
T.Add(1,l,r-1,v);
}
else
T.Ans(l,r);
}
return 0;
}
谢谢阅读。
[Luogu 2221] HAOI2012 高速公路的更多相关文章
- 【题解】Luogu P2221 [HAOI2012]高速公路
原题传送门 这道题还算简单 我们要求的期望值: \[\frac{\sum_{i=l}^r\sum_{j=l}^rdis[i][j]}{C_{r-l+1}^{2}}\] 当然是上下两部分分别求,下面肥肠 ...
- luogu P2221 [HAOI2012]高速公路题解
题面 很套路的拆式子然后线段树上维护区间和的题.一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式. 考虑一次询问[l,r]的答案怎么算: ...
- BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 608 Solved: 199[Submit][ ...
- BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )
对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...
- 【线段树】BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1621 Solved: 627[Submit] ...
- BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1219 Solved: 446[Submit] ...
- P2221 [HAOI2012]高速公路(线段树)
P2221 [HAOI2012]高速公路 显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$ 下面倒是挺好算,组合数瞎搞 ...
- BZOJ 2752:[HAOI2012]高速公路(road)(线段树)
[HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y ...
- 【BZOJ2752】【Luogu P2221】 [HAOI2012]高速公路
不是很难的一个题目.正确思路是统计每一条边被经过的次数,但我最初由于习惯直接先上了一个前缀和再推的式子,导致极其麻烦难以写对而且会爆\(longlong\). 推导过程请看这里. #include & ...
随机推荐
- UESTC 1717 Journey(DFS+LCA)(Sichuan State Programming Contest 2012)
Description Bob has traveled to byteland, he find the N cities in byteland formed a tree structure, ...
- Thunder团队第五周 - Scrum会议2
Scrum会议2 小组名称:Thunder 项目名称:i阅app Scrum Master:胡佑蓉 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...
- 软工实践Alpha冲刺(2/10)
队名:我头发呢队 组长博客 作业博客 杰(组长) 过去两天完成了哪些任务 查看了讯飞开放平台的sdk 查阅了Google Material Design 2的官方文档 接下来的计划 继续打磨UI界面: ...
- HTML5 iframe sandbox javascript getTime
1 1 HTML5 iframe sandbox 1 1 <!DOCTYPE html> <html> <body> <iframe src="de ...
- javaBean默认接受request发送过来的数据,根据键自动设置属性
javaBean默认接受request发送过来的数据,根据键自动设置属性
- BZOJ4873 Shoi2017寿司餐厅(最小割)
选择了某个区间就必须选择其所有子区间,容易想到这是一个最大权闭合子图的模型.考虑将区间按长度分层,相邻层按包含关系连边,区间[i,j]的权值即di,j,其中最后一层表示长度为1的区间的同时也表示寿司本 ...
- 安装单机Hadoop系统(完整版)——Mac
在这个阴雨绵绵的下午,没有睡午觉的我带着一双惺忪的眼睛坐在了电脑前,泡上清茶,摸摸已是略显油光的额头(笑cry),,奋斗啊啊啊啊!!%>_<% 1.课程回顾. 1.1 Hadoop系统运行 ...
- POJ1743:Musical Theme——题解
http://poj.org/problem?id=1743 给一段数,求最大相似子串长度,如果没有输出0. 相似子串定义: 1.两个不重叠的子串,其中一个是另一个加/减一个数得来的. 2.长度> ...
- POJ3090:Visible Lattice Points——题解
http://poj.org/problem?id=3090 题目大意:你站在(0,0)的点上看向第一向限的点,点和点会互相阻挡,问最多看到多少点. 很容易想到,我们能看到的点,它的横纵坐标一定是互质 ...
- BZOJ4355:Play with sequence——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4355 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1] ...