题面

很套路的拆式子然后线段树上维护区间和的题。一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式。

考虑一次询问[l,r]的答案怎么算:

\[ans=\sum_{i=l}^{r}a_i*(i-l+1)*(r-i+1)
\]

把括号拆开,就成了:

\[(l+r)\sum_{i=l}^{r}a_i*i-\sum_{i=l}^{r}a_i*i^2-(l-1)*(r+1)\sum_{i=l}^{r}a_i
\]

线段树上维护区间\(\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]高速公路题解的更多相关文章

  1. 【题解】Luogu P2221 [HAOI2012]高速公路

    原题传送门 这道题还算简单 我们要求的期望值: \[\frac{\sum_{i=l}^r\sum_{j=l}^rdis[i][j]}{C_{r-l+1}^{2}}\] 当然是上下两部分分别求,下面肥肠 ...

  2. P2221 [HAOI2012]高速公路(线段树)

    P2221 [HAOI2012]高速公路 显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$ 下面倒是挺好算,组合数瞎搞 ...

  3. [Luogu 2221] HAOI2012 高速公路

    [Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+ ...

  4. BZOJ2752:[HAOI2012]高速公路——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2752 https://www.luogu.org/problemnew/show/P2221#sub ...

  5. 洛谷 P2221 [HAOI2012]高速公路

    链接: P2221 题意: 有 \(n(1\leq n\leq 10^5)\) 个点,从第 \(i(1\leq i< n)\) 个点向第 \(i+1\) 个点连有边.最初所有边长 \(v_i\) ...

  6. 洛谷P2221 [HAOI2012]高速公路

    线段树 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...

  7. P2221 [HAOI2012]高速公路

    思路 考虑每一条边的贡献,然后推式子 \[ \begin{align}&\sum_{i}V_i\times(R-i+1)\times(i-L+1)\\=&\sum_{i}V_i\lef ...

  8. 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)

    传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...

  9. BZOJ2752: [HAOI2012]高速公路(road)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 608  Solved: 199[Submit][ ...

随机推荐

  1. (四十二)golang--协程之间通信的方式

    假设我们现在有这么一个需求: 计算1-200之间各个数的阶乘,并将每个结果保存在mao中,最终显示出来,要求使用goroutime. 分析: (1)使用goroutime完成,效率高,但是会出现并发/ ...

  2. PDF文件添加二维码水印教程

    maven配置iText的jar,主要不是所有私服都有iText的jar,maven仓库没有的,可以去https://mvnrepository.com/artifact/com.itextpdf/i ...

  3. APP兼容性测试 (二) 最新 iPhone 机型分辨率总结

    iPhone手机发布时间及iOS发布 iPhone是美国苹果公司研发的智能手机系列,搭载苹果公司研发的iOS操作系统. 第一代iPhone于2007年1月9日由苹果公司前首席执行官史蒂夫·乔布斯发布, ...

  4. sql server中的临时表、表变量和公用表表达式

    在编写T-SQL语句的时候,SQL Server提供了三种方法临时存储某些结果集,分别是临时表.表变量和公用表表达式. 临时表 临时表需要在临时数据库TempDB中通过I/O操作来创建表结构,一旦用户 ...

  5. Django学习笔记(11)——开发图书管理页面

    一,项目题目: 开发图书管理页面 该项目主要练习Django对多个数据库进行增删改查的操作. 二,项目需求: 基础需求:75% 1. 列出图书列表.出版社列表.作者列表 2. 点击作者,会列出其出版的 ...

  6. 微信小程序小Demo

    微信小程序小Demo 调用API,轮播图,排行榜,底部BabTar的使用... board // board/board.js Page({ /** * 页面的初始数据 */ // 可以是网络路径图片 ...

  7. 第三章 web设计原则:

    程序员的修炼从优秀带卓越 第三章 web设计原则:    网站的评判标准     加载的速度要快     这到底是什么东西     给我看一个例子     清清楚楚的告诉我要做什么,并且扫除障碍   ...

  8. JVM 学习总结

    目录 Java内存区域 运行时数据区 & Java 内存结构 & Java 内存区域 1. 程序计数器 2. Java 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 6. 运行时 ...

  9. body的背景

    body的背景 背景background-color:默认border-box 画布canvas 一块区域 背景background-color的画布的特点:(画布大于等于视口) 最小宽度视口宽度 最 ...

  10. js中对象字面量

    一.对象字面量语法 var person={ name:'小王', age:18, _pri:233 } 成员名称的单引号不是必须的 最后一个成员结尾不要用逗号,不然在某些浏览器中会抛出错误 成员名相 ...