luogu P2221 [HAOI2012]高速公路题解
题面
很套路的拆式子然后线段树上维护区间和的题。一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式。
考虑一次询问[l,r]的答案怎么算:
\]
把括号拆开,就成了:
\]
线段树上维护区间\(\sum i^2*a_i\)的和即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 200007
#define ll long long
struct data
{
ll s1,s2,s3;
};
data operator +(data l,data r)
{
return (data){l.s1+r.s1,l.s2+r.s2,l.s3+r.s3};
}
data operator *(data v,ll d)
{
return (data){v.s1*d,v.s2*d,v.s3*d};
}
int n;
struct Tree
{
#define lc (k<<1)
#define rc (k<<1|1)
data val[N<<2],sum[N<<2];
ll add[N<<2];
void mark(int k,ll d)
{
val[k]=val[k]+sum[k]*d;
add[k]+=d;
}
void pushdown(int k)
{
mark(lc,add[k]);
mark(rc,add[k]);
add[k]=0;
}
void build(int k,int l,int r)
{
if(l==r)
{
sum[k]={1,l,1ll*l*l};
return;
}
int mid=l+r>>1;
build(lc,l,mid),build(rc,mid+1,r);
sum[k]=sum[lc]+sum[rc];
}
void modify(int k,int l,int r,int x,int y,ll d)
{
if(l>=x&&r<=y)return mark(k,d);
int mid=l+r>>1;
pushdown(k);
if(x<=mid)modify(lc,l,mid,x,y,d);
if(y>mid)modify(rc,mid+1,r,x,y,d);
val[k]=val[lc]+val[rc];
}
data query(int k,int l,int r,int x,int y)
{
if(l>=x&&r<=y)return val[k];
int mid=l+r>>1;
data ans={0,0,0};
pushdown(k);
if(x<=mid)ans=ans+query(lc,l,mid,x,y);
if(y>mid)ans=ans+query(rc,mid+1,r,x,y);
return ans;
}
void mdy(int l,int r,ll d)
{
modify(1,1,n,l,r,d);
}
ll ask(ll l,ll r)
{
data ans=query(1,1,n,l,r);
return (l+r)*ans.s2-ans.s3-(l-1)*(r+1)*ans.s1;
}
}T;
ll gcd(ll x,ll y)
{
return y?gcd(y,x%y):x;
}
int main()
{
int m;
scanf("%d%d",&n,&m),n--;
int l,r;
ll d;
char s[10];
T.build(1,1,n);
for(int i=1;i<=m;i++)
{
scanf("%s%d%d",s,&l,&r);r--;
if(s[0]=='C')
{
scanf("%lld",&d);
T.mdy(l,r,d);
}
else
{
ll x=T.ask(l,r),len=r-l+1,y=1ll*len*(len+1)/2;
ll gd=gcd(x,y);
printf("%lld/%lld\n",x/gd,y/gd);
}
}
return 0;
}
luogu P2221 [HAOI2012]高速公路题解的更多相关文章
- 【题解】Luogu P2221 [HAOI2012]高速公路
原题传送门 这道题还算简单 我们要求的期望值: \[\frac{\sum_{i=l}^r\sum_{j=l}^rdis[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}$ 下面倒是挺好算,组合数瞎搞 ...
- [Luogu 2221] HAOI2012 高速公路
[Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+ ...
- BZOJ2752:[HAOI2012]高速公路——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2752 https://www.luogu.org/problemnew/show/P2221#sub ...
- 洛谷 P2221 [HAOI2012]高速公路
链接: P2221 题意: 有 \(n(1\leq n\leq 10^5)\) 个点,从第 \(i(1\leq i< n)\) 个点向第 \(i+1\) 个点连有边.最初所有边长 \(v_i\) ...
- 洛谷P2221 [HAOI2012]高速公路
线段树 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...
- P2221 [HAOI2012]高速公路
思路 考虑每一条边的贡献,然后推式子 \[ \begin{align}&\sum_{i}V_i\times(R-i+1)\times(i-L+1)\\=&\sum_{i}V_i\lef ...
- 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)
传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...
- BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 608 Solved: 199[Submit][ ...
随机推荐
- 【转】pywinauto教程
一.环境安装 1.命令行安装方法 pip install pywinauto==0.6.7 2.手动安装方法 安装包下载链接:pyWin32: python调用windows api的库https:/ ...
- 原生javascript 共享onload事件
在工作时,我们给一个元素绑定了事件,如果dom还没加载完成,就执行了js代码,就不会绑定成功.常规解决方案就是用: window.onload = EventFunction; 可是如果有两个 事件, ...
- ICP&TPS:最近邻
经过了一段时间的研bai究gei...终于可以偷得几天闲了. 这里来补个档. 无论是ICP还是TPS,缺乏锚点的前提下.你总是要通过找另一个曲面的最近的点来实现你的work beimat:点数*3,f ...
- Sitecore 8.2 渠道简介
渠道是联系人通过广告系列或面对面与您的品牌互动时所使用的路径.联系人可以通过手机上的应用与您的品牌互动,点击社交网络上的广告访问您的网站,或访问实体店购买商品.使用Sitecore体验平台,您可以使用 ...
- Python Jupyter 网站编辑器
Python Jupyter 网站编辑器 jupyter 是 python的网站编辑器可以直接在网页内编写python代码并执行,内置是通过ipython来调用的.很方便灵活. 安装 1.安装ipyt ...
- mysql建表中auto_increment=21
CREATE TABLE `demo` ( `id` ) NOT NULL AUTO_INCREMENT, `img` ) DEFAULT NULL COMMENT '大图', `status` ) ...
- QT+OpenGL(02)-- zlib库的编译
1.zlib库的下载 http://www.zlib.net/ zlib1211.zip 2.解压 3.进入 zlib1211\zlib-1.2.11\contrib\vstudio\vc14 目录 ...
- vs2015 创建MVC项目
直接上图吧! 第一步:新建项目 第二步:选择模板 第三步:系统自动生成项目文件 第四步:创建控制器(C):找到Controllers文件夹->右键->添加->控制器 第五步:添加控制 ...
- 小鸟初学Shell编程(四)管道符
管道作用 管道实际上就是进程之间的一个通信工具,那么用在Linux命令中主要是方便两条命令互相之间可以相互通信. 管道符 管道符(匿名管道)是Shell编程经常用到的通信工具. 管道符是"| ...
- 玄学 npm报错记录
刚开始是版本原因npm报错,ok卸载重装就可以了, 后面报错 npm ERR! code ENOGIT npm ERR! No git binary found in $PATH npm ERR! n ...