jzoj5837 Omeed 線段樹 矩陣乘法

2021-08-25 08:40:45 字數 1897 閱讀 4918

好長啊

早上睡過頭了推出一堆假的柿子並不能過樣例

考慮怎麼求c(i)的期望。顯然有ci

=(ci

−1+1

)×pi

+ci−

1×t×

(1−p

i)c i=

(ci−

1+1)

×pi+

ci−1

×t×(

1−pi

)再考慮求combo分數的期望。顯然有co

mboi

=com

boi−

1+(c

i−1+

1)×p

i×b com

boi=

comb

oi−1

+(ci

−1+1

)×pi

×b這裡需要注意一下,只有當前i是perfect的情況才能拿貢獻,因此第i位我們要欽定為perfect

然後就能拿到50+pts

考慮這麼一類問題:我們知道乙個dp柿子,現在有多組詢問要求以不同位置作為起點做dp。

我們可以求出dp的轉移矩陣,對於給定的起點求出初始矩陣,對於詢問區間我們用線段樹維護轉移矩陣的區間積

那麼做法就非常顯然了。注意到我們的轉移矩陣只有3*3,部分位置始終為0且部分位置始終為1,那麼我們可以優化矩陣乘法的過程來底ka層chang優shu化

#include 

#include

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

#define fill(x,t) memset(x,t,sizeof(x))

#define lowbit(x) ((x)&(-(x)))

typedef

long

long ll;

const

int mod=998244353;

const

int n=500005*4;

struct matrix t[n],ret;

int n,q,ta,tb;

ll p[n],a,b,tt;

int read()

void write(int x)

inline ll ksm(ll x,ll dep)

return ret;

}inline

void mul(matrix &c,matrix a,matrix b)

inline

void modify(int now,int tl,int tr,int x,ll v)

int mid=(tl+tr)>>1;

if (x<=mid) modify(now<<1,tl,mid,x,v);

else modify(now<<1|1,mid+1,tr,x,v);

mul(t[now],t[now<<1],t[now<<1|1]);

}inline matrix query(int now,int tl,int tr,int l,int r)

void build(int now,int tl,int tr)

int mid=(tl+tr)>>1;

build(now<<1,tl,mid);

build(now<<1|1,mid+1,tr);

mul(t[now],t[now<<1],t[now<<1|1]);

}int main(void)

build(1,1,n);

for (;q--;) else

}return

0;}

JZOJ 3236 矮人排隊 線段樹

傳送門 小矮人們依據白雪公主的指令進行活動,我們需要做的是在一段移動後,高度連續的某些小矮人的位置是否也連續 因為涉及到區間詢問,所以我們自然而然的想到使用線段樹進行查詢 我們將線段樹的l r l rl r區間用來表示高度在l r l rl r內的小矮人,並維護他們的最左和最右的位置 因為如果位置是...

jzoj1278 排隊(線段樹)

1278.排隊 description 每天,農夫 john 的n 1 n 50,000 頭牛總是按同一序列排隊.有一天,john決定讓一些牛們玩一場飛盤比賽.他準備找一群在對列中為置連續的牛來進行比賽.但是為了避免水平懸殊,牛的身高不應該相差太大.john 準備了q 1 q 180,000 個可能...

Jzoj4747 被粉碎的線段樹

額這個題麼 有乙個很關鍵的點 結點個數依然為2n 1 證明可以看sam的講稿 不難發現以下性質 區間定位個數 區間所覆蓋的節點個數 2 區間長度 所以問題變為,乙個區間覆蓋了多少個節點?我們可以求出所有的節點,然後這個問題就是乙個二維偏序計數問題了 具體用離線 按照r排序套上樹狀陣列即可 inclu...