【xsy2274】 平均值 线段树
题目大意:给你一个长度为$n$的序列$a$,请你求:
$\sum\limits_{l=1}^{n}\sum\limits_{r=l}^{n}\dfrac{mex(a_l,a_{l+1},...,a_r)}{r-l+1}$
对998244353取模
数据范围:$n≤5\times 10^5$
我们考虑把原先的式子转化一下
令$s[i]=\sum\limits_{j=1}^{i} \frac{1}{i}$。
令$f[i][l]$表示最小的$x$,满足$mex(a_l,a_{l+1},...,a_x)≥i$。若找不到这样的$x$,$f[i][l]=n+1$
不难发现,原先答案的式子我们可以转化:
$\sum\limits_{i=1}^{lim}\sum\limits_{l=1}^{n}s[n-l+1]-s[f[i][l]-l]$
其中lim表示最大的数x,满足0到x-1中的数都出现过
然后我们发现,当i不变时,$f[i]$的值是递增的,且有大量的值是相同的,且以区间的形式出现。
我们可以基于这个性质,通过线段树打标记,快速地将$f[i]$的值更新至$f[i+1]$。
线段树统计的同时维护答案的式子,每次累加即可。
#include<bits/stdc++.h>
#define M (1<<19)
#define L long long
#define mid ((a[x].l+a[x].r)>>1)
#define MOD 998244353
using namespace std; L pow_mod(L x,L k){L ans=;for(;k;k>>=,x=x*x%MOD) if(k&) ans=ans*x%MOD; return ans;}
L inv[M]={},s[M]={},n;
L S(int l,int r){return (s[r]-s[max(l-,)]+MOD)%MOD;} struct seg{int l,r,tag,minn,maxn;L sum;}a[M*]; void pushup(int x){
a[x].minn=min(a[x<<].minn,a[x<<|].minn);
a[x].maxn=max(a[x<<].maxn,a[x<<|].maxn);
a[x].sum=(a[x<<].sum+a[x<<|].sum);
}
void upd(int x,int k){
a[x].tag=a[x].minn=a[x].maxn=k;
a[x].sum=S(k-a[x].r,k-a[x].l);
}
void pushdown(int x){
if(a[x].tag) upd(x<<,a[x].tag),upd(x<<|,a[x].tag);
a[x].tag=;
} int build(int x,int l,int r){
a[x].l=l; a[x].r=r; if(l==r) return a[x].minn=a[x].maxn=l;
build(x<<,l,mid); build(x<<|,mid+,r); pushup(x);
} void updata(int x,int l,int r,int k){
if(a[x].minn>=k) return;
if(a[x].l==a[x].r){
a[x].minn=a[x].maxn=max(a[x].maxn,k);
a[x].sum=S(k-a[x].l,k-a[x].l);
return;
}
if(l<=a[x].l&&a[x].r<=r){
if(a[x].maxn<k){
upd(x,k);
return;
}
}
pushdown(x);
if(l<=mid) updata(x<<,l,r,k);
if(mid<r) updata(x<<|,l,r,k);
pushup(x);
} struct node{
int x,id; node(){x=id=;}
friend bool operator <(node a,node b){return a.x==b.x?a.id<b.id:a.x<b.x;}
}p[M]; int main(){
for(int i=;i<M;i++) inv[i]=pow_mod(i,MOD-);
for(int i=;i<M;i++) s[i]=(s[i-]+inv[i])%MOD;
for(int i=;i<M;i++) s[i]=(s[i-]+s[i])%MOD; scanf("%d",&n); build(,,n);
for(int i=;i<=n;i++) scanf("%d",&p[i].x),p[i].id=i;
sort(p+,p+n+); p[].x=-; p[n+].x=; L ans=,hh=; for(int i=,j=;i<=n;hh++){
if(p[i].x!=p[i-].x+) break;
while(p[i].x==p[j].x) j++; for(int last=;i<=j;i++){
if(i==j){
if(last<n) updata(,last+,n,n+);
break;
}
updata(,last+,p[i].id,p[i].id);
last=p[i].id;
} ans=(ans+a[].sum)%MOD;
} cout<<(s[n]*hh-ans+MOD)%MOD<<endl;
}
【xsy2274】 平均值 线段树的更多相关文章
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- ural1855 线段树区间更新+推公式维护一元二次式
和威威猫系列故事差不多,都是根据条件推出公式 /* 操作c a b d:a到b道路上的所有边权值加d 操作e a b:问a到b中包含的道路的平均权值 区间平均值=所有可能路径权值/所有路径数, 而路径 ...
- 51Nod 1199 Money out of Thin Air (树链剖分+线段树)
1199 Money out of Thin Air 题目来源: Ural 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 一棵有N个节点的树,每 ...
- 线段树(I tree)
Codeforces Round #254 (Div. 2)E题这题说的是给了一个一段连续的区间每个区间有一种颜色然后一个彩笔从L画到R每个区间的颜色都发生了 改变然后 在L和R这部分区间里所用的颜色 ...
- 【洛谷】【线段树】P1471 方差
[题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...
- bzoj 3779 重组病毒 好题 LCT+dfn序+线段树分类讨论
题目大意 1.将x到当前根路径上的所有点染成一种新的颜色: 2.将x到当前根路径上的所有点染成一种新的颜色,并且把这个点设为新的根: 3.查询以x为根的子树中所有点权值的平均值. 分析 原题codec ...
- Bzoj 2752 高速公路 (期望,线段树)
Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...
- ZOJ 2706 Thermal Death of the Universe (线段树)
题目链接:ZOJ 2706 Thermal Death of the Universe (线段树) 题意:n个数.m个操作. 每一个操作(a,b)表示(a,b)全部值更新为这个区间的平均数:1.当前的 ...
- Atcoder E - Meaningful Mean(线段树+思维)
题目链接:http://arc075.contest.atcoder.jp/tasks/arc075_c 题意:问数组a有多少子区间平均值为k 题解:一开始考虑过dp,但是显然不可行,其实将每一个数都 ...
随机推荐
- 2018.11.09 洛谷P1110 [ZJOI2007]报表统计(multiset)
传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/std ...
- 2018.11.06 bzoj1093: [ZJOI2007]最大半连通子图(缩点+拓扑排序)
传送门 先将原图缩点,缩掉之后的点权就是连通块大小. 然后用拓扑排序统计最长链数就行了. 自己yyyyyy了一下一个好一点的统计方法. 把所有缩了之后的点都连向一个虚点. 然后再跑拓扑,这样最后虚点的 ...
- c# richTextBox1添加内容并将滚动条滚动到当前焦点处
1. StringBuilder sb = new StringBuilder(); StringBuilder的改变比string快多了 2. sb.Append("\r\n" ...
- js实现锚点定位
js实现锚点定位的原理是,算出定位的标签距离顶部的高度,点击触发标签,重新赋值滚动条的高度到达指定位置. <!DOCTYPE html> <html> <head> ...
- python中global 和 nonlocal的使用
1.global关键字用来在函数或其他局部作用域中使用全局变量.但是如果不修改全局变量也可以不使用global关键字. gcount = 0 def global_test(): gcount+=1 ...
- rpcbind.service启动失败
新装的服务器,启动rpcbind.service通常失败,执行下面的两个命令经常卡死,一直不返回,也不报错 #systemctl start nfs-server.service #systemctl ...
- 开源HIS之C/S选型
客户端/服务的形式是我中爱的,我认可只有这样软件跑起来不会失控.因为你不知道每一个程序员是否足够清醒.但一开始我说过要从基本的应急的门诊收费开始,所以我并不打算一启动就写一个服务,并为之选型:TCP/ ...
- android-基础编程之开篇
先唠叨两句,机缘巧合现在来做android开发了,之前做后台c的,对这块不是很了解,要慢慢学习,对于framework层的学习感觉需要app开发经验更好点,在完成工作之余积累一些基础知识.既来之则安之 ...
- spring mvc使用ModelAndView时发生No request handling method with name '方法 名' in class [类名]的错误
我日,下午关于标题错误查了好久,网上啥说法都有, 后来发现是ModelAndView的路径引错了 正确路径应该为: import org.springframework.web.servlet.Mod ...
- Installing Apache Hadoop Single Node
转载请注明出处:http://www.cnblogs.com/wubdut/p/4681286.html platform: Ubuntu 14.04 LTS hadoop 1.2.1 1. inst ...