2752: [HAOI2012]高速公路(road)

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 1545  Solved: 593
[Submit][Status][Discuss]

Description

Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站。
Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用。高速路刚建成时所有的路段都是免费的。
政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价。
无聊的小A同学总喜欢研究一些稀奇古怪的问题,他开车在这条高速路上行驶时想到了这样一个问题:对于给定的l,r(l<r),在第l个到第r个收费站里等概率随机取出两个不同的收费站a和b,那么从a行驶到b将期望花费多少费用呢?

Input

第一行2个正整数N,M,表示有N个收费站,M次调整或询问
接下来M行,每行将出现以下两种形式中的一种
C l r v 表示将第l个收费站到第r个收费站之间的所有道路的通行费全部增加v
Q l r   表示对于给定的l,r,要求回答小A的问题
所有C与Q操作中保证1<=l<r<=N

Output

对于每次询问操作回答一行,输出一个既约分数
若答案为整数a,输出a/1

Sample Input

4 5
C 1 4 2
C 1 2 -1
Q 1 2
Q 2 4
Q 1 4

Sample Output

1/1
8/3
17/6

HINT

数据规模

所有C操作中的v的绝对值不超过10000

在任何时刻任意道路的费用均为不超过10000的非负整数

所有测试点的详细情况如下表所示

Test N M

1 =10 =10

2 =100 =100

3 =1000 =1000

4 =10000 =10000

5 =50000 =50000

6 =60000 =60000

7 =70000 =70000

8 =80000 =80000

9 =90000 =90000

10 =100000 =100000  

  考试前一天晚上做梦,梦见自己考试140,倒数第二,一开始以为自己只是日有所思夜有所梦,然后……这道题助我梦想成真/(ㄒoㄒ)/~~然而最终只有20分……
  其实当天已经推出来了式子,然而由于不敢去打,只能打了区间修改单点查询的打法,结果还全E了,好尴尬啊,连暴力的40分都没拿到。
  基本大多数人都可以推到这里——一个边对于答案的贡献(不算分母):设这条边为第i条边,询问为l,r:(i-l+1)*(r-i)*v[i]。
  然后我们大可把这个式子展开为:
      r*(i+1)*v[i]+i*l*v[i]-l*r*v[i]-i*(i+1)*v[i]。
  由于l,r随询问而变,我们无从得知,但由于求得是上述式子的最终值,我们可以去维护上式中的四个单项式,以及他们的系数。
  通过系数我们就可以很轻松的应对区间修改,因为系数是不受任何影响的,而对于每一个修改,对于答案的影响就是修改值乘以系数,这样我们的修改查询都是log n的了。
  最后叮嘱的一点是long long 不然会死的很惨。
 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define N 100004
#define int long long
using namespace std;
int n,m;
struct no
{
int left,right,mid;
long long lazy;
long long data[];
long long sum[];
}node[N*];
long long gcd(long long a,long long b)
{
if(b==)return a;
return gcd(b,a%b);
}
void pushup(int x)
{
for(int i=;i<=;i++)
{
node[x].data[i]=node[x*].data[i]+node[*x+].data[i];
node[x].sum[i]=node[x*].sum[i]+node[*x+].sum[i];
}
}
void build(int left,int right,int x)
{
node[x].left=left,node[x].right=right;
if(left==right)
{
node[x].data[]=left+;
node[x].data[]=left;
node[x].data[]=;
node[x].data[]=left*(left+);
return;
}
int mid=(left+right)>>;
node[x].mid=mid;
build(left,mid,*x);
build(mid+,right,*x+);
pushup(x);
}
struct inf
{
long long a,b;
};
char b[];
void pushdown(int x)
{
if(node[x].lazy)
{
node[*x].lazy+=node[x].lazy;
node[x*+].lazy+=node[x].lazy;
for(int i=;i<=;i++)
{
node[*x].sum[i]+=node[x].lazy*node[*x].data[i];
node[*x+].sum[i]+=node[x].lazy*node[*x+].data[i];
}
node[x].lazy=;
}
}
void add(int left,int right,int x,int z)
{
if(node[x].left==left&&node[x].right==right)
{
node[x].lazy+=z;
for(int i=;i<=;i++)
node[x].sum[i]+=node[x].data[i]*z;
return;
}
pushdown(x);
int mid=node[x].mid;
if(left>mid)
add(left,right,x*+,z);
else if(right<=mid)
add(left,right,*x,z);
else
add(left,mid,x*,z),add(mid+,right,*x+,z);
pushup(x);
}
inf get(long long left,long long right,int x,long long l,long long r)
{
if(node[x].left==left&&node[x].right==right)
{
inf aa;
aa.a=node[x].sum[]*r-l*r*node[x].sum[];
aa.a-=node[x].sum[];
aa.a+=l*node[x].sum[];
aa.b=(r-l+)*(r-l)/;
long long t=gcd(aa.a,aa.b);
aa.a/=t;
aa.b/=t;
return aa;
}
pushdown(x);
int mid=node[x].mid;
if(left>mid)
return get(left,right,*x+,l,r);
else if(right<=mid)
return get(left,right,*x,l,r);
else
{
inf aa=get(left,mid,*x,l,r);
inf bb=get(mid+,right,*x+,l,r);
if(aa.b==bb.b)
{
aa.a+=bb.a;
long long t=gcd(aa.a,aa.b);
if(t!=)
aa.a/=t,aa.b/=t;
return aa;
}
else
{
long long tt=gcd(aa.b,bb.b);
long long c;
if(aa.b%tt==)
{
c=aa.b/tt;
c*=bb.b;
}
else if(bb.b%tt==)
{
c=bb.b/tt;
c*aa.b;
}
else
{
c=aa.b*bb.b/tt;
}
aa.a*=c/aa.b;
bb.a*=c/bb.b;
aa.a+=bb.a;
aa.b=c;
long long t=gcd(aa.a,aa.b);
if(t!=)
aa.a/=t,aa.b/=t;
return aa;
}
}
}
signed main()
{
scanf("%lld%lld",&n,&m);
build(,n-,);
while(m--)
{
scanf("%s",b);
if(b[]=='C')
{
int l,r,z;
scanf("%lld%lld%lld",&l,&r,&z);
add(l,r-,,z);
}
else
{
long long l,r;
scanf("%lld%lld",&l,&r);
inf tt=get(l,r-,,l,r);
printf("%lld/%lld\n",tt.a,tt.b);
}
}
return ;
}

bzoj 2752 9.20考试第三题 高速公路(road)题解的更多相关文章

  1. 9.5 考试 第三题 奇袭题解(codeforce 526f)

    问题 C: 奇袭 时间限制: 1 Sec  内存限制: 256 MB 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯 ...

  2. 9.18考试 第三题chess题解

    在讲这道题之前我们先明确一个丝薄出题人根本没有半点提示却坑死了无数人的注意点: 走敌人和不走敌人直接到时两种走法,但只走一个敌人和走一大坨敌人到同一个点只算一种方案(当然,前提是步骤一致). 当时看完 ...

  3. 【BZOJ】【2752】【HAOI2012】高速公路(Road)

    数学期望/线段树 然而又是一道road= =上一道是2750…… 下次不要一看期望题就弃疗么…… 期望题≠不可做题……!! 其实在这题中,期望就是(所有情况下 权值之和)/(总方案数) 因为是等概率抽 ...

  4. JXJJOI2018_三题

    这次比赛的话其实还挺满意的,虽然T1 20pts(指的是分数,考试时知道有坑但是考完都没找到的我就知道切不掉这题qwq),T3爆零是在意料之外,不过其实T2贪心能切掉也是意料之外的,所以作此判断.当然 ...

  5. C语言考试解答十题

    学院比较奇葩,大一下期让学的VB,这学期就要学C++了,然后在开学的前三个周没有课,就由老师讲三个周的C语言,每天9:30~11:30听课,除去放假和双休日,实际听课时间一共是12天*2小时,下午是1 ...

  6. NOIP2005-普及组复赛-第三题-采药

    题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山 ...

  7. 看雪.TSRC 2017CTF秋季赛第三题

    看雪.TSRC 2017CTF秋季赛第三题 wp 这是一道很简单的题,反调试的坑略多.这道题采用了很多常用的反调试手段,比如调用IsDebuggerPresent.进程名检查等等.另外也有利用SEH的 ...

  8. 【LOJ6067】【2017 山东一轮集训 Day3】第三题 FFT

    [LOJ6067][2017 山东一轮集训 Day3]第三题 FFT 题目大意 给你 \(n,b,c,d,e,a_0,a_1,\ldots,a_{n-1}\),定义 \[ \begin{align} ...

  9. test20181016 B君的第三题

    题意 B 君的第三题(haskell) 题目描述 大学四年,我为什么,为什么不好好读书,没找到和你一样的工作. B 君某天看到了这样一个题,勾起了无穷的回忆. 输入\(n, k\) 和一棵\(n\) ...

随机推荐

  1. Codejock.Xtreme.Toolkit.Pro.v15.3.1 下载 与 VS2015补丁使用方法

    Codejock.Xtreme.Toolkit.Pro.v15.3.1 下载 与 VS2015补丁使用方法 打算放在CSDN进行下载的,上传完成后发现资源分设置的1分,本打算赚点下载分的.在页面上没有 ...

  2. 图像滤镜艺术---球面(Spherize)滤镜

    原文:图像滤镜艺术---球面(Spherize)滤镜 球面(Spherize)滤镜 球面滤镜是通过极坐标变换实现图像的球面特效. 代码如下:         //         ///        ...

  3. win10 uwp 异步转同步

    原文:win10 uwp 异步转同步 有很多方法都是异步,那么如何从异步转到同步? 可以使用的方法需要获得是否有返回值,返回值是否需要. 如果需要返回值,使用GetResults 如从文件夹获取文件: ...

  4. SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步

    原文:SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步 由于之前的需要,禁止了复制架构更改,以至在发布中添加一个字段,并不会同步到订阅中,而现在又在订阅中添加了一个同名 ...

  5. iBatisNet 中 iterate标签的使用

    <iterate>标签,顾名思义是用来遍历标签用的. 支持的属性如下: 属性 说明 是否必选 open 遍历后生成的这些sql,开始的第一个符号 可选 close 遍历后生成的这些sql, ...

  6. C#图片灰度处理(位深度24→位深度8)

    #region 灰度处理 /// <summary> /// 将源图像灰度化,并转化为8位灰度图像. /// </summary> /// <param name=&qu ...

  7. ShellExecute的跨平台实现OpenUrl

    OpenUrl 是 iOS 中 UIApplication 提供的一个函数,用于调用其它程序.实际上各个平台都有自己的实现,这里提供一个直接封装完的跨平台版本给大家.   uses {$IFDEF M ...

  8. C++ Builder 控件的卸载

    控件卸载: 1.选择   BCB   菜单   File→Close   All   (关闭所有文件)     选择BCB   菜单:   Project→Options→Packages   在   ...

  9. 20 如何通过pycharm快速的创建一个html页面

    1.打开pycharm并且新建一个html页面,如下图所示. 2.删除html页面中默认的内容,之后在页面中输入!,之后点击tab即可完成一个html页面的框架新增.

  10. Spring Boot 集成配置 HTTPS

    这是泥瓦匠的第108篇原创 文章工程: * JDK 1.8 * Maven 3.5.2 * Spring Boot 1.5.9.RELEASE ## 一.HTTPS 是什么 问:什么是HTTP? 答: ...