bzoj2752
线段树+概率
今天这道题爆零了,奥妙重重。
其实我们可以把式子化成这样: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的更多相关文章
- BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 608 Solved: 199[Submit][ ...
- 【BZOJ2752】【线段树】高速公路
Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个 ...
- 【线段树】BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1621 Solved: 627[Submit] ...
- [BZOJ2752][HAOI2012]高速公路
BZOJ Luogu sol 看上去是道数学期望题但实际上是个傻逼数据结构 首先答案的形式应该就是 \[\frac{\mbox{[l,r]区间内的子区间权值之和}}{\mbox{[l,r]区间内的子区 ...
- 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)
传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...
- BZOJ2752:[HAOI2012]高速公路——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2752 https://www.luogu.org/problemnew/show/P2221#sub ...
- 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】【Luogu P2221】 [HAOI2012]高速公路
不是很难的一个题目.正确思路是统计每一条边被经过的次数,但我最初由于习惯直接先上了一个前缀和再推的式子,导致极其麻烦难以写对而且会爆\(longlong\). 推导过程请看这里. #include & ...
随机推荐
- 华登区块狗系统APP开发
华登区块狗系统开发,陈翎:{.l8O..285l..l22O.}华登区块狗软件开发,华登区块狗APP开发,华登区块狗模式开发,华登区块狗现成源码,狗狗集市理财模式开发 华登区块狗是什么?华登区块狗ap ...
- selenium爬虫设置headers,代理IP等方法
https://blog.csdn.net/xc_zhou/article/details/80823855
- Script:shell脚本生成随机字符串
#!/bin/bash # bash generate random alphanumeric string # # bash generate random character alphanumer ...
- 洛谷——P3871 [TJOI2010]中位数
P3871 [TJOI2010]中位数 一眼秒掉,这不是splay水题吗,套模板 #include<bits/stdc++.h> #define IL inline #define N 1 ...
- java 十五周总结
- stall and flow separation on airfoil or blade
stall stall and flow separation Table of Contents 1. Stall and flow separation 1.1. Separation of Bo ...
- open random
open文件操作 f = open('文件路径',mode='rwab+',encoding='utf-8') # content = f.read(3) # 读出来的都是字符 # f.seek(3) ...
- ndk编译libpcap 1.7.4
android完全菜鸟,绝对的第一次接触,想做手机抓包,在网上搜又是NDK 又是JNI 又是JNETPCAP 完全蒙了,让我这种android和java都弄不明白什么关系的人情何以堪! 静下心想一想, ...
- Java8-如何将List转变为逗号分隔的字符串--https://blog.csdn.net/benjaminlee1/article/details/72860845
Java8-如何将List转变为逗号分隔的字符串 https://blog.csdn.net/benjaminlee1/article/details/72860845
- poj 1364 查分约束
#include<stdio.h> #include<iostream> #include<stack> #include<string.h> usin ...