●BZOJ 2752 [HAOI2012]高速公路(road)

题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=2752
题解:

期望,线段树。
把每个路段看成一个点,那么对于l~R的操作,就可以转化为对l~r(r=R-1)的路段的操作。
对于每个询问,我们只需要依次考虑每个路段出现在多少个区间里面。
令cnt[i]表示i号路段在cnt[i]个区间包含。
即答案为$$\frac{\sum_{i=l}^{r}v[i]*cnt[i]}{(r-l+1)*(r-l+2)/2(区间总数)}$$
那么就需要在线维护一些,使得能够快速求出上面的值。
考虑每个路段的贡献:
i号路段被(i-l+1)*(r-i+1)个区间包含,
所以贡献为:(i-l+1)*(r-i+1)*v[i],把其展开:
=(l+r)*i*v[i]-l*r*v[i]-l*v[i]+r*v[i]-i*i*v[i]+v[i]。
所以,我们只需要用线段树维护每个区间的路段的v[i]的和,i*v[i]的和,i*i*v[i]的和;

代码:

#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
long long sumi[MAXN],sumi2[MAXN];
struct SGT{
	int size,root;
	int ls[MAXN*2],rs[MAXN*2],lazy[MAXN*2];
	long long sumval[MAXN*2],sumival[MAXN*2],sumi2val[MAXN*2];
	void Pushup(int u){
		sumval[u]=sumval[ls[u]]+sumval[rs[u]];
		sumival[u]=sumival[ls[u]]+sumival[rs[u]];
		sumi2val[u]=sumi2val[ls[u]]+sumi2val[rs[u]];
	}
	void Add(int &u,int l,int r,int v){
		if(!u) u=++size;
		sumval[u]+=1ll*(r-l+1)*v;
		sumival[u]+=(sumi[r]-sumi[l-1])*v;
		sumi2val[u]+=(sumi2[r]-sumi2[l-1])*v;
		lazy[u]+=v;
	}
	void Pushdown(int u,int l,int mid,int r){
		Add(ls[u],l,mid,lazy[u]);
		Add(rs[u],mid+1,r,lazy[u]);
		lazy[u]=0;
	}
	void Modify(int &u,int l,int r,int al,int ar,int v){
		if(!u) u=++size;
		if(al<=l&&r<=ar) return Add(u,l,r,v);
		int mid=(l+r)>>1;
		if(lazy[u]) Pushdown(u,l,mid,r);
		if(al<=mid) Modify(ls[u],l,mid,al,ar,v);
		if(mid<ar) Modify(rs[u],mid+1,r,al,ar,v);
		Pushup(u);
	}
	long long Contribution(int u,int al,int ar){
		return sumival[u]*(al+ar)-sumval[u]*al*ar-sumval[u]*al+sumval[u]*ar-sumi2val[u]+sumval[u];
//		return sumival[u]*(al+ar)-sumval[u]*al*ar+sumval[u]*ar-sumival[u]-sumi2val[u];
	}
	long long Query(int u,int l,int r,int al,int ar){
		if(!u) return 0;
		if(al<=l&&r<=ar) return Contribution(u,al,ar);
		int mid=(l+r)>>1; long long ret=0;
		if(lazy[u]) Pushdown(u,l,mid,r);
		if(al<=mid) ret+=Query(ls[u],l,mid,al,ar);
		if(mid<ar) ret+=Query(rs[u],mid+1,r,al,ar);
		return ret;
	}
}DT;
int N,M;
long long gcd(long long a,long long b){
	while(b^=a^=b^=a%=b);
	return a;
}
int main(){
	char ch; int l,r,v;
	scanf("%d%d",&N,&M);
	for(int i=1;i<=N;i++)
		sumi[i]=sumi[i-1]+i,sumi2[i]=sumi2[i-1]+1ll*i*i;
	for(int i=1;i<=M;i++){
		scanf(" %c %d %d",&ch,&l,&r); r--;
		if(ch==‘C‘) scanf("%d",&v),DT.Modify(DT.root,1,N,l,r,v);
		else {
			long long a=DT.Query(DT.root,1,N,l,r);
			long long b=1ll*(r-l+1)*(r-l+2)/2;
			long long g=gcd(a,b);
			a/=g; b/=g; printf("%lld/%lld\n",a,b);
		}
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/zj75211/p/8541937.html

时间: 2024-10-16 09:26:19

●BZOJ 2752 [HAOI2012]高速公路(road)的相关文章

BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]

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

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

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

BZOJ 2752 [HAOI2012]高速公路(road) 线段树

题意:链接 方法:线段树 解析: 这道题刚开始脑抽想了个O(n/2*(logn)*m)的脑抽算法就写上交了=-= 然而当时我神奇地在草纸上写了个O(sqrt(n)/2*(logn)*m).. 当时在想另一个什么分块的什么东西就没过大脑=-= 然后开始找规律呗. 不妨把权值安到点上. 之后考虑一个点的贡献是什么. 其左边有多少个点,右边有多少个点的乘积. 这很显然啊,就是在枚举大长线段的左右端点啊.. 所以假设某个点的权值是val 那么就是val[i](i-x+1)(y-i+1)对吧. 之后就是展

【BZOJ 2752】 [HAOI2012]高速公路(road)

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

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行

BZOJ 2752:[HAOI2012]高速公路(road)(线段树)

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

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

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

bzoj 2752 9.20考试第三题 高速公路(road)题解

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

Bzoj 2752 高速公路 (期望,线段树)

Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时候把\(r - 1\)就好了. 这里的期望显然就是路径的平均值. 期望值: \[\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}\] 下面部分可以直接算出: 上面这一部分比较难维护. 考虑每一条边会被走过多少次. \[ans = \su