题链:

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)的更多相关文章

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

    对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...

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

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1219  Solved: 446[Submit] ...

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

    Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收 ...

  4. BZOJ 2752 [HAOI2012]高速公路(road):线段树【维护区间内子串和】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2752 题意: 有一个初始全为0的,长度为n的序列a. 有两种操作: (1)C l r v: ...

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

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 608  Solved: 199[Submit][ ...

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

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1621  Solved: 627[Submit] ...

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

    [HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y ...

  8. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1820  Solved: 736[Submit][Status][Discuss] Descripti ...

  9. 【bzoj2752】[HAOI2012]高速公路(road) 线段树

    题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西 ...

随机推荐

  1. Alpha冲刺No.6

    站立式会议 继续页面设计 在安卓内构件数据库相应类 解决摄像头.照片的使用的异常问题 二.实际项目进展 页面设计完成百分80 类架构完成 在虚拟机中,能够完成摄像头的调用和程序的使用 三.燃尽图 四. ...

  2. 支付宝sdk集成,报系统繁忙 请稍后再试(ALI64)

    移动快捷支付,往往需要集成支付宝的sdk,集成的过程相对简单,只要按照支付宝的文档,进行操作一般不会出问题.            下面主要说明一下,集成sdk后报"系统繁忙 请稍后再试(A ...

  3. C实现单链表

    typedef int DataType; typedef struct ListNode { DataType data; struct ListNode* next; }ListNode; //初 ...

  4. SQL语句取多列的最小值(排除0)

    经常遇到获取数据表中多个列的最小值和最大值,例如: 获取这 4个价格的最小值和最大值: SELECT( SELECT min(minPrice) FROM ( VALUES (IIF(MarketSi ...

  5. caffe使用ctrl-c不能保存模型

    caffe使用Ctrl-c 不能保存模型: 是因为使用的是 tee输出日志 解决方法:kill -s SIGINT <proc_id> 或者使用 GLOG_log_dir=/path/to ...

  6. mongodb 定时备份

    通过centos 脚步来执行备份操作,使用crontab实现定时功能,并删除指定天数前的备份 具体操作: 1.创建Mongodb数据库备份目录 mkdir -p /home/backup/mongod ...

  7. crlf注入攻击

    1.crlf 注入攻击. 原理:http数据包通过\r\n\r\n来分开http header何http body 实现:首先这种攻击发生在应用层,且发生在服务器返回给我们的http reponse没 ...

  8. STM32常见问题

    一.STM32 下不了程序 提示: (1).JLink Info: CPU halted Erase Done. Programming Failed! 解决办法: 用isp把芯片全部擦除再试试,如果 ...

  9. c 存储类型

    1,c语言中的存储类型(定义变量和函数的可见范围和生命周期)这些说明符放置在它们所修饰的类型之前.下面列出 C 程序中可用的存储类: auto register static extern 2,aut ...

  10. Linq 对象的比较 Contains,Max

    IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, Studen ...