正题

题目链接:https://www.luogu.com.cn/problem/P6834?contestId=34123


题目大意

nnn个点,每个点i(i≠1)i(i\neq 1)i(i​=1)随机连接[i−k,i−1][i-k,i-1][i−k,i−1]中的一个点。对于每个点有一个权值aia_iai​。每次可以选择一个全部都是正权值的连通块里所有权值减一,求最优期望次数。


解题思路

考虑每个点的贡献,对于一个节点xxx和它的父节点fafafa显然根据铺设道路那题的做法,这个点的贡献就是max{ax−afa,0}max\{a_x-a_{fa},0\}max{ax​−afa​,0}

所以我们需要维护一个数据结构可以查询比axa_xax​小的数的和,支持插入删除。显然离散化之后用树状数组即可。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
#define ll long long
using namespace std;
const ll N=1e6+10,XJQ=998244353;
ll n,k,num,answer,cnt;
ll inv[N],a[N],b[N],t[N],z[N];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
void Change(ll x,ll val,ll flag){while(x<=cnt){t[x]=(t[x]+val)%XJQ;z[x]=z[x]+flag;x+=lowbit(x);}return;
}
ll Ask(ll x){ll ans=0;num=0;while(x){num=num+z[x];ans=(ans+t[x])%XJQ;x-=lowbit(x);}return ans;
}
int main()
{scanf("%lld%lld",&n,&k);inv[1]=1;for(ll i=2;i<=k;i++)inv[i]=XJQ-XJQ/i*inv[XJQ%i]%XJQ;for(ll i=1;i<=n;i++)scanf("%lld",&a[i]),b[++cnt]=a[i];sort(b+1,b+1+cnt);cnt=unique(b+1,b+1+cnt)-b-1;ll l=1,sum=0;answer=a[1];for(ll i=1;i<=n;i++){while(l<=n&&l<i-k){ll y=lower_bound(b+1,b+1+cnt,a[l])-b;Change(y,-a[l],-1);l++;}ll x=lower_bound(b+1,b+1+cnt,a[i])-b;ll w=Ask(x),ans=0;ans=(num*a[i]%XJQ-w+XJQ)%XJQ;answer=(answer+ans*inv[min(i-1,k)]%XJQ)%XJQ;Change(x,a[i],1);}printf("%lld",answer);
}

P6834-[Cnoi2020]梦原【数学期望,树状数组】相关推荐

  1. BZOJ 2141 排队(块套树,分块,树状数组)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2141 是 hydro 的 BZOJ ...

  2. 树状数组 思路以及性能分析

    特点 代码短.常数很小 应用及时间复杂度 区间查询:求前缀和 单点修改:给某个位置上的数加上一个数(同时能以非常小的代价维护前缀和) 时间复杂度:O(logn)O(logn)O(logn) 与一般前缀 ...

  3. HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景

    http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...

  4. Codeforces数学1600----day1[同余定理,树状数组+两次二分,,组合计数]

    1.C. Kuroni and Impossible Calculation **知识点:同余定理 ** #include <iostream> #include <cstdio&g ...

  5. 【HDU - 5869】Different GCD Subarray Query(思维,数学,gcd,离线处理,查询区间不同数,树状数组 或 二分RMQ)

    题干: This is a simple problem. The teacher gives Bob a list of problems about GCD (Greatest Common Di ...

  6. [CF808B] Average Sleep Time([强行]树状数组,数学)

    题目链接:http://codeforces.com/contest/808/problem/B 题意:n个数,求其中每k个数的和的平均值. 鬼知道我怎么会石乐志上来就用了树状数组. 1 #inclu ...

  7. 数据结构--树状数组

    文章目录 1. 树状数组 2. 单点修改 3. 区间修改 4. 完整代码 5. 参考文献 1. 树状数组 类似数据结构:线段树(Segment Tree) 树状数组 跟 线段树 的区别: 树状数组能做 ...

  8. Codeforces 1096F(dp + 树状数组)

    题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...

  9. 吊打线段树的超级树状数组

    你是否讨厌线段树那冗长的代码?你是否还在因为线段树的难调试而满头♂dark汗?那么,请不要错过!超级树状数组特价!只要998,只要998! ##¥--#--¥%--&%¥--ER#%$#$#^ ...

最新文章

  1. mysql常用命令操作
  2. 心电信号的PQRST模拟matlab代码(转载+自己调研汇总)
  3. java 静态绑定原理_Java方法的静态绑定与动态绑定讲解
  4. [js] 说说你对JS中暂性死区的理解,它有什么运用场景?
  5. 关键段 互斥量 以及信号量
  6. [已解决] 日常开发中禁用Tomcat自动重启
  7. requireJS(一)
  8. 全面认识openstack:OpenStack架构详解
  9. POJ 1398 Complete the sequence! ★ (差分)
  10. ARDUINO LCD显示简单的汉字、符号(保姆级教程!)
  11. c语言代码混淆器,工具:c 混淆器——AvIator
  12. k8s通过Service访问Pod
  13. PBI培训(3):Power BI主题设置方法汇总及示例
  14. Habor镜像仓库的使用
  15. 抖音直播伴侣和快手直播伴侣如何实现无人直播还能防封号
  16. Cesium中绘制矩形,根据四角/对角坐标绘制矩形
  17. C++中sprintf_s与sprintf的不同
  18. Android获取所有App信息
  19. ZCMU 1600: 卡斯丁狗要吃糖葫芦
  20. 计算机科学与技术专业导论3500,计算机科学与技术专业导论.docx

热门文章

  1. python如何安装扩展库openpyxl和numpy_Python第三方库之openpyxl(2)
  2. php 实现类,php如何实现类
  3. 如何讲页面打入jar包中_如何把我的Java程序变成exe文件?
  4. python socket自动重连_详解python3中socket套接字的编码问题解决
  5. ab压力测试_Apache ab压力测试的知识点
  6. phpsotrm怎么 搜索功能_Windows 10 网络搜索设计太反人类?教你如何彻底关闭它
  7. 7-20 表达式转换 (25 分)(代码详解+题目分析)
  8. 二叉树最近公共祖先相关题目(Leetcode题解-Python语言)
  9. [SpringBoot2]web场景_SpringBoot2_SpringMVC自动配置概览
  10. [Java基础]Lambda表达式和匿名内部类的区别