●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;
}
●BZOJ 2752 [HAOI2012]高速公路(road)的更多相关文章
- 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] ...
- bzoj 2752: [HAOI2012]高速公路(road)
Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收 ...
- BZOJ 2752 [HAOI2012]高速公路(road):线段树【维护区间内子串和】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2752 题意: 有一个初始全为0的,长度为n的序列a. 有两种操作: (1)C l r v: ...
- 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)(线段树)
[HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y ...
- BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1820 Solved: 736[Submit][Status][Discuss] Descripti ...
- 【bzoj2752】[HAOI2012]高速公路(road) 线段树
题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西 ...
随机推荐
- Beta No.4
今天遇到的困难: 百度位置假死的问题研究发现并不是源于代码的问题,而是直接运行在主线程中会出现诸多问题 Fragment碎片刷新时总产生的固定位置的问题未果 今天完成的任务: 陈甘霖:修复了部分Bug ...
- 【Alpha版本】冲刺阶段 - Day5 - 破浪
今日进展 袁逸灏:解决音乐播放问题以及跳转问题.(5h) 刘伟康:大致检查了测试规范,参考了其他 alpha 阶段的博客.(1h) 刘先润:解决了敌车与障碍物溢出边界的代码问题,给用户车辆增加了火焰喷 ...
- alpha-咸鱼冲刺day3-紫仪
总汇链接 一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 今天把数据库的表给建好了,学长那边把登陆跟注册页面也做好了(纯页面,html5+css的那种) 四,问题困难 日常 ...
- Java作业-集合
1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Object o) { r ...
- 【iOS】swift-Binary operator '|' cannot be applied to two UIViewAutoresizing operands
let view = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) addSubview(view) view.autoresi ...
- 纯CSS垂直居中的四种解决方案
总结了几种解决方法 但也不是说除了我说的就没有其他方法了 第一个.利用flex布局 代码: 效果: 第二个.利用transform 的 translate属性 代码: 效果: 第三个.使用伪类::af ...
- JAVA_SE基础——49.多态的应用
因为多态对以后开发的重要性,因此我在这里专门开个多态的应用来加深讲解,希望想弄懂多态的同学能耐心看完. 了解了对象多态性后,那么这多态到底有哪些用处了? 下面要求设计一个方法,要求此方法可以接受A类的 ...
- Table点击某个td获取当前列的头名称
jq代码: $("td").click(function () { var tdHtml = $(this).attr("html"); var index = ...
- LeetCode & Q1-Two Sum-Easy
Array Hash Table Question Given an array of integers, return indices of the two numbers such that th ...
- django中HttpRequest请求
视图的第一个参数必须是HttpRequest对象 在视图函数中,接收的request有如下属性: path:一个字符串,表示请求的页面的完整路径,不包含域名. method:一个字符串,表示请求使用的 ...