P6834-[Cnoi2020]梦原【数学期望,树状数组】
生活随笔
收集整理的這篇文章主要介紹了
P6834-[Cnoi2020]梦原【数学期望,树状数组】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
題目鏈接: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]中的一個點。對于每個點有一個權(quán)值aia_iai?。每次可以選擇一個全部都是正權(quán)值的連通塊里所有權(quán)值減一,求最優(yōu)期望次數(shù)。
解題思路
考慮每個點的貢獻,對于一個節(jié)點xxx和它的父節(jié)點fafafa顯然根據(jù)鋪設(shè)道路那題的做法,這個點的貢獻就是max{ax?afa,0}max\{a_x-a_{fa},0\}max{ax??afa?,0}
所以我們需要維護一個數(shù)據(jù)結(jié)構(gòu)可以查詢比axa_xax?小的數(shù)的和,支持插入刪除。顯然離散化之后用樹狀數(shù)組即可。
時間復(fù)雜度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); }總結(jié)
以上是生活随笔為你收集整理的P6834-[Cnoi2020]梦原【数学期望,树状数组】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年最佳台式机的推荐(下)
- 下一篇: P6835-[Cnoi2020]线形生物