bzoj2752 高速公路

列式子:

如果把从i号收费站到i+1号收费站之间路段编号设为i。

假如查询l号收费站到r号收费站之间的期望值。

$ Ans_{l,r} = \sum\limits_{i=l}^{r-1} v_i \times (r-i) \times (i-l+1) $

$ = \sum\limits_{i=l}^{r-1} v_i \times (r \times i - r \times l + r - i^2 + i \times l - i) $

$ = \sum\limits_{i=l}^{r-1} v_i \times ( - i^2 + (r + l -1) \times i + r - r \times l) $

我们在线段树里维护$ \sum (i^2 \times v_i) $、$ \sum (i \times v_i) $、$ \sum v_i $

有公式:$ \sum\limits_{i=1}^{n} i^2 = \frac{n \times (n+1) \times (2 \times n + 1)}{6} $

然后什么东西都好办了。

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1e5+10;
int n,m;

long long aa,ff;char cc;
long long read() {
	aa=0;cc=getchar();ff=1;
	while(cc<‘0‘||cc>‘9‘) {
		if(cc==‘-‘) ff=-1;
		cc=getchar();
	}
	while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
	return aa*ff;
}

long long gcd(long long x,long long y) {
	return y==0? x:gcd(y,x%y);
}

struct Node{
	long long l,r,pf,yc,lc,laz;
}node[4*maxn];

void bld(int pos,long long l,long long r) {
	node[pos].l=l;node[pos].r=r;
	if(l==r) return;
	long long mid=(node[pos].l+node[pos].r)>>1;
	bld(pos<<1,l,mid); bld(pos<<1|1,mid+1,r);
}

long long f(long long t) {
	return t*(t+1)/2*(2*t+1)/3;
}

void ud(int pos) {
	long long v=node[pos].laz;
	long long l=node[pos].l,r=node[pos].r;
	if(!v) return ;
	node[pos].lc+=(r-l+1)*v;
	node[pos].yc+=(l+r)*(r-l+1)/2*v;
	node[pos].pf+=(f(r)-f(l-1))*v;
	if(node[pos].l!=node[pos].r) {
		node[pos<<1].laz+=v;
		node[pos<<1|1].laz+=v;
	}
	node[pos].laz=0;
}

void chge(int pos,long long l,long long r,long long v) {
	ud(pos);
	if(node[pos].l==l&&node[pos].r==r) {
		node[pos].laz+=v;
		return;
	}
	node[pos].lc+=(r-l+1)*v;
	node[pos].yc+=(l+r)*(r-l+1)/2*v;
	node[pos].pf+=(f(r)-f(l-1))*v;
	long long mid=(node[pos].l+node[pos].r)>>1;
	if(r<=mid) chge(pos<<1,l,r,v);
	else if(l>mid) chge(pos<<1|1,l,r,v);
	else chge(pos<<1,l,mid,v),chge(pos<<1|1,mid+1,r,v);
}

long long q(int pos,long long l,long long r,long long x,long long y) {
	ud(pos);
	if(node[pos].l==l&&node[pos].r==r)
		return node[pos].lc*(y-y*x)+(y+x-1)*node[pos].yc-node[pos].pf;

	long long mid=(node[pos].l+node[pos].r)>>1;
	if(r<=mid) return q(pos<<1,l,r,x,y);
	else if(l>mid) return q(pos<<1|1,l,r,x,y);
	else return q(pos<<1,l,mid,x,y)+q(pos<<1|1,mid+1,r,x,y);
}

int main() {
	n=read();m=read();
	long long l,r,ans,x,y;char op;
	bld(1,1,n-1);
	for(int i=1;i<=m;++i) {
		do op=getchar();while(op<‘C‘||op>‘Q‘);
		l=read();r=read();
		if(op==‘C‘) chge(1,l,r-1,read());
		else {
			ans=q(1,l,r-1,l,r);
			x=r-l+1;
			x=x*(x-1)/2;
			y=gcd(ans,x);
			ans/=y;x/=y;
			printf("%lld/%lld\n",ans,x);
		}
	}
	return 0;
}

  

时间: 2024-11-05 13:26:11

bzoj2752 高速公路的相关文章

bzoj-2752 高速公路 road

题意: 给出一个n个结点,n-1条边的链,边权初始为0: m次操作,操作有两种: 1. C:区间[l,r]的边权加上或减去一个数: 2. Q:查询区间随机取不相同两点之间的期望长度: 题解: 区间加减之类的东西显然是线段树的应用,恰巧这道题就在链上: 主要这题还是维护第二问的东西: 区间[l,r]的选路方式共有(r-l+1)*(r-l)/2这些种,那么只要求出所有路径总长度就好了: 对每一条路x来考虑的话,这条路被选的条件是同时选了左面的点和右面的点: 假设这条路的权值是val[x],那么这条路

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

[BZOJ2752][HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用.高速路刚建成时所有的路段都是免费的.政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政

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

2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 608  Solved: 199[Submit][Status] Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行

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

Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用.高速路刚建成时所有的路段都是免费的. 政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价. 无聊的小A同学总喜欢研究一些稀奇古怪的问题

HAOI2012高速公路bzoj2752 (线段树,数学)

题目大意: 给定一个长度为n的链,一共m次操作 对于每次操作 \(C\ l\ r\ x\)表示将第l个点到第r个点之间的所有道路的权值增加v \(Q\ l\ r\)在第l个到第r个点里等概率随机取出两个不同的点a和b,那么从a行驶到b将期望花费多少费用呢 QwQ我们可以考虑将期望分为分子和分母两部分 首先考虑分母,分母就是在\(r-l+1\)个点中选两个点的方案数,也就是\({r-l+1}\choose 2\) 而分子就是总权值了 对于一个在\([l,r]\)的点\(i\)来说 它会被计算\((

CCF试题:高速公路(Targin)

问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的计划.看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能.如果城市A可以通过高速公路到达城市B,而且城市B也可以通过高速公路到达城市A,则这两个城市被称为便利城市对. 国王想知道,在大臣们给他的计划中,有多少个便利城市对. 输入

安康5月28日将举办汉江龙舟节暨西康高速公路通车典礼(欢乐中国行-魅力安康,中央三套6月7日首播)

第九届中国安康汉江龙舟节,将于2009年5月28日至30日,在安康隆重举行. 今年举办的第九届中国安康汉江“泸康杯”龙舟节,将把龙舟节开幕式与西康高速公路通车典礼成功对接,央视著名栏目“欢乐中国行—魅力安康”,将尽情展示绿色安康的无限魅力. 欢乐中国行—魅力安康的具体播出时间是:中央三套6月7日晚7点30分. http://space.tv.cctv.com/podcast/huanlezhongguoxing 据悉,西康高速通车后,西安到安康仅需要2-3小时.目前,安康还是陕西唯一一个没有高速

高速公路

试题编号: 201509-4 试题名称: 高速公路 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的计划.看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能.如果城市A可以通过高速公路到达城市B,而且城市B也可以通

CCF 高速公路 tarjan求强连通分量

问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的计划.看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能.如果城市A可以通过高速公路到达城市B,而且城市B也可以通过高速公路到达城市A,则这两个城市被称为便利城市对. 国王想知道,在大臣们给他的计划中,有多少个便利城市对. 输入