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. C语言中.h和.c文件解析(转载)

    转载:http://www.cnblogs.com/laojie4321/archive/2012/03/30/2425015.html   简单的说其实要理解C文件与头文件(即.h)有什么不同之处, ...

  2. Python日记:基于Scrapy的爬虫实现

    安装 pywin32 和python版本一致 地址 https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/安装过程中提示 ...

  3. 教你如何在Deepin搭建Qt开发环境(sudo apt-get install qt5-default qt5-qmake g++ qtcreator,也许对龙芯版的Deepin也有用)

    首先教大家一种很简单的方法,打开终端输入以下命令: sudo apt-get install qt5-default qt5-qmake g++ qtcreator 上面的命令会自动帮你安装qt5开发 ...

  4. Dynamic linking is coming to iOS, tvOS, and watchOS ports of Qt in the 5.9 release

    http://blog.qt.io/blog/2017/01/23/qt-5-8-released/ Dynamic linking is coming to iOS, tvOS, and watch ...

  5. VCL比MFC好在哪里

    作者:刘国华链接:https://www.zhihu.com/question/35218485/answer/118472021来源:知乎著作权归作者所有,转载请联系作者获得授权. 从使用感受而言, ...

  6. Js 动态插入css js文件

    function loadjscssfile(filename,filetype){ var file, //动态插入的文件 doc = document; if(filetype == " ...

  7. Spring Boot2(三):使用Spring Boot2集成Redis缓存

    前言 前面一节总结了SpringBoot实现Mybatis的缓存机制,但是实际项目中很少用到Mybatis的二级缓存机制,反而用到比较多的是第三方缓存Redis. Redis是一个使用ANSI C编写 ...

  8. SpringBoot启动访问JSP页面,直接进入页面或者访问不到,报404,并且加载tomcat插件tomcat-embed-jasper也不行

    这个问题花费了两天的时间,解决路径: 我用的是SpringBoot1.5.2,SpringMVC和Spring,tomcat启动插件都是默认的版本,Spring是4.3.7,jdk是1.7.0_80, ...

  9. Django ORM基础篇【转载】

    ORM( Object relational mapping 对象关系映射)D:把面向对象中的类和数据库表一一对应起来,在django项目与数据库之间起着桥梁的                     ...

  10. Java学习笔记——MySQL创建表结构

    一.创建/删除数据库. create database t14; drop database t14; use t14; 二.创建若干表用于测试 这里预留了几个坑,下面要填坑的.. /*创建学生表*/ ...