题面在这里

题意

维护区间加操作+询问区间任选两不同点途中线段权值之和的期望

sol

一道假的期望题...

因为所有事件的发生概率都相同,所以答案就是所有方案的权值总和/总方案数

因为区间加法自然想到线段树,考虑将每条道路看作一个节点

那么对于区间l-r的路径(注意这里已经将道路看作节点,所以r--),可以计算第x条道路的贡献为

\((i-l+1)*(r-i+1)*val[i]\)(\(val[i]\)表示当前道路的权值大小)

那么我们要区间维护的就是这个东西

\[\sum_{r}^{i=l}{(i-l+1)*(r-i+1)*val[i]}
\]

\[=\sum_{r}^{i=l}{(-i^2*va[i])}+(l+r)*\sum_{r}^{i=l}{(i*val[i])+(-l*r-l+r+1)*\sum_{r}^{i=l}val[i]}
\]

分别维护\(\sum_{r}^{i=l}(i^2*val[i])\),\(\sum_{r}^{i=l}{(i*val[i])}\)和\(\sum_{r}^{i=l}{val[i]}\),最后再除以\(((r-l+1)*(r-l+2)/2)\)即可

代码

#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
const int mod=1e9+7;
const int N=100010;
const double eps=1e-10;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
il ll read(){
RG ll data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
} int n,m;char ch;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
#define ls (i<<1)
#define rs (i<<1|1)
#define mid ((l+r)>>1)
ll x[N],xx[N];
ll sum[N<<3],sumx[N<<3],sumxx[N<<3],lz[N<<3],cnt;
il void update(int i){
sum[i]=sum[ls]+sum[rs];
sumx[i]=sumx[ls]+sumx[rs];
sumxx[i]=sumxx[ls]+sumxx[rs];
} il void change(int i,int l,int r,ll v){
sum[i]+=v*(r-(l-1));sumx[i]+=v*(x[r]-x[l-1]);
sumxx[i]+=v*(xx[r]-xx[l-1]);lz[i]+=v;
} il void pushdown(int i,int l,int r){
if(!lz[i])return;
change(ls,l,mid,lz[i]);change(rs,mid+1,r,lz[i]);
lz[i]=0;
} il void modify(int i,int l,int r,int x,int y,ll v){
//区间修改
if(x<=l&&r<=y){change(i,l,r,v);return;}
pushdown(i,l,r);
if(x<=mid)modify(ls,l,mid,x,y,v);
if(mid+1<=y)modify(rs,mid+1,r,x,y,v);
update(i);
} il ll query_sum(int i,int l,int r,int x,int y){
if(x<=l&&r<=y)return sum[i];
RG ll s=0;pushdown(i,l,r);
if(x<=mid)s+=query_sum(ls,l,mid,x,y);
if(y>=mid+1)s+=query_sum(rs,mid+1,r,x,y);
return s;
}
il ll query_sumx(int i,int l,int r,int x,int y){
if(x<=l&&r<=y)return sumx[i];
RG ll s=0;pushdown(i,l,r);
if(x<=mid)s+=query_sumx(ls,l,mid,x,y);
if(y>=mid+1)s+=query_sumx(rs,mid+1,r,x,y);
return s;
}
il ll query_sumxx(int i,int l,int r,int x,int y){
if(x<=l&&r<=y)return sumxx[i];
RG ll s=0;pushdown(i,l,r);
if(x<=mid)s+=query_sumxx(ls,l,mid,x,y);
if(y>=mid+1)s+=query_sumxx(rs,mid+1,r,x,y);
return s;
} il void query(int l,int r){
//按照推导公式解决询问操作
RG ll ans1=query_sumxx(1,1,n-1,l,r)*(-1)+query_sumx(1,1,n-1,l,r)*(l+r)+query_sum(1,1,n-1,l,r)*(1ll*l*r*(-1)-l+r+1);
RG ll ans2=1ll*(r-l+1)*(r-l+2)/2;
RG ll g=gcd(ans1,ans2);
printf("%lld/%lld\n",ans1/g,ans2/g);
} int main()
{
n=read();m=read();
for(RG int i=1;i<n;i++){
x[i]=x[i-1]+i;xx[i]=xx[i-1]+1ll*i*i;
}
for(RG int i=1,l,r;i<=m;i++){
ch=0;while(ch!='C'&&ch!='Q')ch=getchar();
if(ch=='C'){
l=read();r=read()-1;RG ll v=read();
modify(1,1,n-1,l,r,v);
}
else{l=read();r=read()-1;query(l,r);}
}
return 0;
}

[HAOI2012]高速公路的更多相关文章

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

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

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

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

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

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

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

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

  5. P2221 [HAOI2012]高速公路(线段树)

    P2221 [HAOI2012]高速公路 显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$ 下面倒是挺好算,组合数瞎搞 ...

  6. [Luogu 2221] HAOI2012 高速公路

    [Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+ ...

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

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

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

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

  9. BZOJ2752:[HAOI2012]高速公路——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2752 https://www.luogu.org/problemnew/show/P2221#sub ...

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

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

随机推荐

  1. [Python Study Notes]进程信息(丁丁软件监控进程,http-post)

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  2. 脚本实现centos7修改二块网卡名称并配置ip信息

    #!/bin/bash interface1=`ls /sys/class/net|grep en|awk 'NR==1{print}'`interface2=`ls /sys/class/net|g ...

  3. H5 拖拽,一个函数搞定,直接指定对象设置可拖拽

    页面上,弹个小窗体,想让它可以拖拽,又不想 加载一堆js,就简单的能让他可以拖动? 嗯,下面有这样一个函数,调用下就好了! 1. 先来说说 H5的 拖拽 在 HTML5 中,拖放是标准的一部分,任何元 ...

  4. 940A Points on the line

    传送门 题目大意 给你n和d还有n个数,计算最少删除几个点可以是最大点与最小点之差小于等于d 分析 先对所有点排序,枚举每一个点ai到ai+d中有几个点,答案即n-其中最大的值 代码 #include ...

  5. TzObjectInspector 一例

    TzObjectInspector Github上的一个开源组件!可以做到类似Delphi IDE属性,事件面板的样式!作者持续更新中... 看起来是这个样子: 这个东西用起来并不像想象的那样可以直接 ...

  6. AVFoundation 框架初探究(四)

    叨叨两句 动手写这篇总结时候也是二月底过完年回来上班了,又开始新的一年了,今年会是什么样子?这问题可能得年底再回答自己了.在家窝了那么久,上班还是的接着看我们要看的东西,毕竟我们要做的事还真的太多的. ...

  7. 高通ASOC中的codec驱动

    ASOC的出现是为了让codec独立于CPU,减少和CPU之间的耦合,这样同一个codec驱动就无需修改就可以匹配任何一款平台. 在Machine中已经知道,snd_soc_dai_link结构就指明 ...

  8. ICQ

    我一直都想编一个自己的聊天软件,像QQ那种:最近有时间我就自己编了一个.编写的过程中收获很大…… 现在拿出来跟大家分享,有兴趣的朋友可以和我交流交流. 先给大家看一下效果: 启动服务器: 再给大家看一 ...

  9. nyoj234 吃土豆 01背包

    思路:假设我们先只考虑一行,规则就是取了i处的土豆,每一个土豆有两种选择,拿与不拿,那么i-1和i+1处的土豆都不能再取,那么要求某一行的最大取值就用一次动态规划即可,dp(i)表示前i个土豆能取得的 ...

  10. HDU - 2102 A计划 (BFS) [kuangbin带你飞]专题二

    思路:接BFS判断能否在限制时间内到达公主的位置,注意如果骑士进入传送机就会被立即传送到另一层,不会能再向四周移动了,例如第一层的位置(x, y, 1)是传送机,第二层(x, y, 2)也是传送机,这 ...