线段树+概率

今天这道题爆零了,奥妙重重。

其实我们可以把式子化成这样:sigma((i-l+1)*(r-i+1)*ai) 这里r减了1

然后展开,(1-l)*(r+1)*ai+(r+l)*i*ai-i*i*ai

我们发现除了含有i的项其他都可以提到外面,也就是说我们要维护ai,i*ai,i*i*ai三个量。

那么就用线段树维护,打标记时用数列公式即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
int n, m;
struct seg {
ll tag[N << ], tree[N << ][];
void pushdown(int x, int l, int r)
{
if(!tag[x]) return;
tag[x << ] += tag[x];
tag[x << | ] += tag[x];
int mid = (l + r) >> ;
tree[x << ][] += tag[x] * (ll)(mid - l + 1ll);
tree[x << | ][] += tag[x] * (ll)(r - mid);
tree[x << ][] += tag[x] * (ll)(l + mid) * (ll)(mid - l + ) / 2ll;
tree[x << | ][] += tag[x] * (ll)(r + mid + 1ll) * (ll)(r - mid) / 2ll;
tree[x << ][] += tag[x] * ((ll)mid * (ll)(mid + 1ll) * (ll)(2ll * mid + 1ll) - (ll)(l - 1ll) * (ll)l * (ll)(2ll * l - 1ll)) / 6ll;
tree[x << | ][] += tag[x] * ((ll)r * (ll)(r + 1ll) * (ll)(2ll * r + 1ll) - (ll)mid * (ll)(mid + 1ll) * (ll)(2ll * mid + 1ll)) / 6ll;
tag[x]= 0ll;
}
void update(int l, int r, int x, int a, int b, ll delta)
{
if(l > b || r < a) return;
if(l >= a && r <= b)
{
tag[x] += delta;
tree[x][] += (ll)(r - l + 1ll) * delta;
tree[x][] += (ll)(l + r) * (ll)(r - l + ) / 2ll * delta;
tree[x][] += ((ll)r * (ll)(r + 1ll) * (2ll * r + ) - (ll)(l - 1ll) * (ll)l * (ll)(2ll * l - 1ll)) / 6ll * delta;
return;
}
pushdown(x, l, r);
int mid = (l + r) >> ;
update(l, mid, x << , a, b, delta);
update(mid + , r , x << | , a, b, delta);
for(int i = ; i <= ; ++i)
tree[x][i] = tree[x << ][i] + tree[x << | ][i];
}
ll query(int l, int r, int x, int a, int b, int type)
{
if(l > b || r < a) return 0ll;
if(l >= a && r <= b) return tree[x][type];
pushdown(x, l, r);
int mid = (l + r) >> ;
return (query(l, mid, x << , a, b, type) + (query(mid + , r, x << | , a, b, type)));
}
} t;
ll gcd(ll a, ll b)
{
return !b ? a : gcd(b, a % b);
}
int main()
{
// freopen("c.in", "r", stdin);
// freopen("c.out", "w", stdout);
scanf("%d%d", &n, &m);
--n;
while(m--)
{
char s[]; int l, r; ll delta; scanf("%s", s);
if(s[] == 'C')
{
scanf("%d%d%lld", &l , &r, &delta);
--r;
t.update(, n, , l, r, delta);
}
if(s[] == 'Q')
{
scanf("%d%d", &l, &r);
--r;
ll T1 = t.query(, n, , l, r, );
ll T2 = t.query(, n, , l, r, );
ll T3 = t.query(, n, , l, r, );
ll ans = (ll)(1ll - l) * (ll)(r + 1ll) * T1 + (ll)(r + l) * T2 - T3;
ll T4 = (ll)(r - l + 2ll) * (ll)(r - l + 1ll) / 2ll;
ll T = gcd(ans, T4);
printf("%lld/%lld\n", ans / T, T4 / T);
}
}
// fclose(stdin); fclose(stdout);
return ;
}

bzoj2752的更多相关文章

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

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

  2. 【BZOJ2752】【线段树】高速公路

    Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个 ...

  3. 【线段树】BZOJ2752: [HAOI2012]高速公路(road)

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

  4. [BZOJ2752][HAOI2012]高速公路

    BZOJ Luogu sol 看上去是道数学期望题但实际上是个傻逼数据结构 首先答案的形式应该就是 \[\frac{\mbox{[l,r]区间内的子区间权值之和}}{\mbox{[l,r]区间内的子区 ...

  5. 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)

    传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...

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

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

  7. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1820  Solved: 736[Submit][Status][Discuss] Descripti ...

  8. 【bzoj2752】[HAOI2012]高速公路(road) 线段树

    题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西 ...

  9. 【BZOJ2752】【Luogu P2221】 [HAOI2012]高速公路

    不是很难的一个题目.正确思路是统计每一条边被经过的次数,但我最初由于习惯直接先上了一个前缀和再推的式子,导致极其麻烦难以写对而且会爆\(longlong\). 推导过程请看这里. #include & ...

随机推荐

  1. ThinkPHP---thinkphp会话支持和文件载入

    [一]会话控制 会话支持一般指cookie和session,在ThinkPHP里为了方便开发,封装了cookie和session方法. (1)session方法 在函数库封装了session方法 se ...

  2. HDU_5783_DivideTheSequence

    HDU_5783_DivideTheSequence  点击打开链接 题意: 生成尽量多的连续的子串,且子串的前缀和大于等于0,输出符合题意的子串的数量. 这题目是参加四月份的个人训练赛遇到的,挺水的 ...

  3. [UVA11825]Hackers' Crackdown(状压dp)

    题解降智警告 吐槽降智警告 思路降智警告 代码降智警告 题目传送门 洛谷 果然水题做多了连半道难点的都能给咱干蒙... 水题做多了降智  --鲁迅 题目大意:见传送门 心路历程见末尾 正解(大概): ...

  4. 服务器做ssh免秘钥登陆

    集群内服务器做非root用户免秘钥登陆:1.node1新建用户abc1,制作公钥.私钥(一路回车键即可)ssh-keygen –t rsa将自动在/home/abc1/.ssh/目录下创建公私钥文件如 ...

  5. (四)Python3 循环语句——for

    for循环的一般格式如下: for <variable> in <sequence>: <statements> else: <statements> ...

  6. RabbitMq的简单使用

    本篇将介绍RabbitMq的一个简单使用例子,分别介绍生产者如何发送消息,消费者如何接收和处理消息 关于RabbitMQ的知识背景的文章非常多.我对它的总结是,解决高并发请求的瓶颈,将应用程序真正处理 ...

  7. 实验1“C语言开发环境使用和数据类型、运算符、表达式”总结与体会

    一.实验结论 1.判断奇偶 // 程序功能: // 要求用户从键盘输入一个整数,判断其是奇数还是偶数 #include <stdio.h> int main() { int x; prin ...

  8. 【16】AngularJS API

    AngularJS API API 意为 Application Programming Interface(应用程序编程接口). AngularJS 全局 API AngularJS 全局 API ...

  9. Oracle学习总结(4)——MySql、SqlServer、Oracle数据库行转列大全

    MySql行转列 以id分组,把name字段的值打印在一行,逗号分隔(默认) select CustomerDrugCode,group_concat(AuditItemName) from noau ...

  10. BZOJ3991 寻宝游戏 LCA 虚树 SET

    5.26 T1:寻宝游戏 Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄, ...