【题解】HAOI2012高速公路
一节政治课的结果……推式子+推式子+推式子……
首先注意到一个区间里面,选择(x, y)和(y, x)的费用是一样的。所以我们把这两种情况合为一种,那么现在询问的区间为(l, r),则一共的情况就有 1 / (k + 1)*(k)种 (k = r - l + 1)。所以我们只需要求出区间内所有的子集之和 * 2 / (k + 1) * k(每种情况有两种)。但这样复杂度还是太高了,我们考虑继续推下式子。
顺着一个比较常见的思路想:分离出每一段路对于答案的贡献再累加起来。那么我们的ans = Vx(这一段路的代价) * 包含了这条道路的区间个数。包含了第x条道路的区间个数一共是(x - l + 1) * (r - x)。但这个东西我们不好维护,所以将它拆分一下,尽量分离出不变的量。这个东西就等于:((rx + lx) - (x * x + x) + (r - l * r))* Vx。由此, 问题转化为维护区间内的 Vx 之和, Vx * x之和, 与 Vx * x * (x + 1)之和。线段树完美解决!
// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
#define int unsigned long long
int n, m, mark[maxn * ]; struct tree
{
int l, r, num[], size, x, xx;
}T[maxn * ]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void Build(int p, int l, int r)
{
T[p].l = l, T[p].r = r, T[p].size = (r - l + );
if(l == r)
{
T[p].num[] = T[p].num[] = T[p].num[] = ;
T[p].x = l, T[p].xx = T[p].x * (T[p].x + );
return;
}
int mid = (l + r) >> ;
Build(p << , l, mid), Build(p << | , mid + , r);
T[p].x = T[p << ].x + T[p << | ].x;
T[p].xx = T[p << ].xx + T[p << | ].xx;
return;
} void push_up(int p, int num)
{
T[p].num[] += num * T[p].x;
T[p].num[] += num * T[p].xx;
T[p].num[] += num * T[p].size;
mark[p] += num;
} void push_down(int p)
{
if(!mark[p]) return;
push_up(p << , mark[p]);
push_up(p << | , mark[p]);
mark[p] = ;
} void update(int p, int l, int r, int num) // num1 :Vx * x, num2 :Vx * x * (x + 1), num3 : Vx;
{
int mid = (l + r) >> ;
int L = T[p].l, R = T[p].r;
if(L >= l && R <= r)
{
push_up(p, num);
return;
}
if(R < l || L > r) return;
push_down(p);
update(p << , l, r, num), update(p << | , l, r, num);
T[p].num[] = T[p << ].num[] + T[p << | ].num[];
T[p].num[] = T[p << ].num[] + T[p << | ].num[];
T[p].num[] = T[p << ].num[] + T[p << | ].num[];
} int query(int p, int l, int r, int opt)
{
int L = T[p].l, R = T[p].r;
if(R < l || L > r) return ;
if(L >= l && R <= r) return T[p].num[opt];
push_down(p);
return query(p << , l, r, opt) + query(p << | , l, r, opt);
} int Get(int a, int b)
{
while(b)
{
int c = a % b;
a = b;
b = c;
}
return a;
} signed main()
{
n = read(), m = read();
Build(, , n);
for(int i = ; i <= m; i ++)
{
char c;
cin >> c;
int l = read(), r = read();
if(c == 'C')
{
int v = read();
update(, l, r - , v);
}
else // num1 :Vx * x, num2 :Vx * x * (x + 1), num3 : Vx;
{
int ans = query(, l, r - , ) * (l + r);
ans -= query(, l, r - , );
ans += query(, l, r - , ) * (r - l * r);
int K = (r - l + ) * (r - l);
int GCD = Get(ans * , K);
printf("%lld/%lld\n", ans * / GCD, K / GCD);
}
}
return ;
}
【题解】HAOI2012高速公路的更多相关文章
- BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 608 Solved: 199[Submit][ ...
- 【线段树】BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1621 Solved: 627[Submit] ...
- BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )
对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...
- 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}$ 下面倒是挺好算,组合数瞎搞 ...
- [Luogu 2221] HAOI2012 高速公路
[Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+ ...
- BZOJ 2752:[HAOI2012]高速公路(road)(线段树)
[HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y ...
- BZOJ2752:[HAOI2012]高速公路——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2752 https://www.luogu.org/problemnew/show/P2221#sub ...
- 【题解】Luogu P2221 [HAOI2012]高速公路
原题传送门 这道题还算简单 我们要求的期望值: \[\frac{\sum_{i=l}^r\sum_{j=l}^rdis[i][j]}{C_{r-l+1}^{2}}\] 当然是上下两部分分别求,下面肥肠 ...
随机推荐
- Tornado异步之-协程与回调
回调处理异步请求 回调 callback 处理异步官方例子 # 导入所需库 from tornado.httpclient import AsyncHTTPClient def asynchronou ...
- Git配置技巧及常用命令总结
如果你想精通Git,直接到 Git官网 把这本ProGit掌握已足以Pro Git 配置用户信息 user和email,--global参数全局配置,当然你也可以不加此参数,不同的项目用不同的用户名和 ...
- JAVA 泛型方法<T>
public static void main(String[] args) throws Exception { String[] arr = new String[]{"1", ...
- go学习笔记-结构体
结构体 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 定义 格式 type struct_variable_type struct { member definition; member ...
- linux io 学习笔记(01)---锁,信号量
1.采用信号量访问:当有段临界代码,需要保证排他的访问一个资源. 2.sudo dmesg -c 消除dmesg缓冲 3.互斥锁:代表的是一种锁资源,互斥锁的工作原理是:保证对共享资源操作的原子性 ...
- 对mysqlbinlog日志进行操作的总结包括 启用,过期自动删除
操作命令: show binlog events in 'binlog.000016' limit 10; reset master 删除所有的二进制日志 flush logs 产生一个新的binl ...
- ExtJs4.1目录结构介绍和使用说明[转]
一.在做ExtJs开发之前首先要到网站上下载ExtJs的开发包,我用的最新版本是4.1.1.此版本相对于之前的版本目录结构发生了一些变化,没有了adapter目录, 目录结构如下 文件/文件夹名的作用 ...
- 关于python的闭包与装饰器的实验
首先看闭包,在嵌套函数内添加返回值,可以通过外部函数读取内部函数信息 #encoding=utf-8 #闭包应用 #先定义闭包函数,并使用 def outer(func): def inner(): ...
- AcCoder Contest-115 D - Christmas
D - Christmas Time limit : 2sec / Memory limit : 1024MB Score : 400 points Problem Statement In some ...
- Paper Reading - Show and Tell: Lessons learned from the 2015 MSCOCO Image Captioning Challenge
Link of the Paper: https://arxiv.org/abs/1609.06647 A Correlative Paper: Show and Tell: A Neural Ima ...