洛谷P4915 帕秋莉的魔導書

2022-04-14 03:49:57 字數 2727 閱讀 4934

帕秋莉有乙個巨大的圖書館,裡面有數以萬計的書,其中大部分為魔導書。

魔導書是一種需要鑰匙才能看得懂的書,然而只有和書寫者同等或更高熟練度的人才能看得見鑰匙。因此,每本魔導書都有它自己的等級\(a_i\)

,同時它也有自己的知識程度為\(w_i\),現在我們想要知道,乙個等級為\(b_i\)的生物(...),可以從這些魔導書中得到多少知識。

然而不幸的是,每個生物並不知道自己確切的等級,只有乙個等級的大致範圍,你需要計算出這個生物獲得知識程度的期望值。

第一行兩個正整數\(n,m\)代表起始書的個數,以及操作的個數。

以下\(n\)行,每行兩個正整數\(a_i\)和\(w_i\),代表每本書的等級以及知識程度。

接下來的\(m\)行,每行\(2\)或\(3\)個正整數。

操作 1:格式:1 x y。含義:求等級為 [x, y] 的生物能獲得的期望知識程度。

操作 2:格式:2 x y。含義:圖書館又收入了一本等級為\(x\),知識程度為\(y\)的魔導書。

輸出包含若干行實數,即為所有操作 1 的結果,答案保留四位小數。

對於\(30%\)的資料,保證\(1\leq\)所有輸入的數字\(\leq 10^3\) 。

對於\(100%\)的資料,保證\(1\leq n,m \leq 10^5\),對於其他數字,保證在\(32\)位帶符號整數範圍內(保證運算中所有的數均在\(-2^\)到\(2^-1\)之間)。

首先我們考慮一種簡單的情況,如果所有的等級都很小,我們可以對等級開乙個陣列 \(lv\) ,遇到一本書,如果他的等級是\(a_i\),知識是\(w_i\)那麼 lv[a[i]]以及之後的元素+=\(w_i\),因為這本書對於所有

lv更高的生物都有貢獻。查詢時,如果生物等級範圍是[l,r],那麼答案就是$$\frac^r lv[i]}$$可以看做每個等級的概率為\(\frac\),該等級所能獲得的知識為lv[i]。

我們只要維護分子部分,也就是區間加和區間查詢,那麼很明顯可以用線段樹解決。

讓我們回到原題,原題給的等級範圍是\(-2^\)到\(2^-1\),線段樹空間**,有沒有什麼機會呢,簡單分析一下可以發現,由於書的數量和詢問次數相對較少,那麼這些數(等級)雖然很大,但分布很

稀疏,也就是說,存在大量元素,他們的資訊是相同的,所以我們把相同資訊的節點合併,並賦予其乙個權值(區間長度),作為乙個葉子,那麼空間大大縮減。為了方便起見,我們把所有詢問和書涉及到

我的演算法欽定所有葉子代表的區間都是左開右閉的。(當然不一定要這麼寫)。

第一步:離散化。這裡有一些細節,插入時詢問左端點-1,右端點不變(因為s[r]-s[l-1]才是l~r的資訊);還有,書的等級-1,看圖理解。

第二步:建樹。每乙個節點對應的權值為其區間長度。

#include#include#include#define ll long long

#define maxn (int)1e6+10

using namespace std;

ll op[maxn][3],book[maxn][2];

ll data[maxn*3],d[maxn*3];

int cnt1=0,cnt2=0;

int id(ll x)

struct node tree[maxn<<4];

void update(int x)

void pushdown(int x)

void build(int x,int left,int right)

int mid=left+right>>1;

build(x<<1,left,mid);

build(x<<1|1,mid+1,right);

tree[x].w=tree[x<<1].w+tree[x<<1|1].w;

return;

}void modify(int x,int left,int right,ll key)

pushdown(x);

int mid=tree[x].l+tree[x].r>>1;

if(left<=mid) modify(x<<1,left,right,key);

if(right>mid) modify(x<<1|1,left,right,key);

update(x);

return;

}ll query(int x,int left,int right)

int mid=tree[x].l+tree[x].r>>1;

if(left<=mid) ans1=query(x<<1,left,right);

if(right>mid) ans2=query(x<<1|1,left,right);

update(x);

return ans1+ans2;

}int main()

for(i=1;i<=m;i++)

else

} sort(data+1,data+cnt1+1);

for(i=1;i<=cnt1;i++)

build(1,1,cnt2);

for(i=1;i<=n;i++)

for(i=1;i<=m;i++)

else

} return 0;

}

洛谷 P4910 帕秋莉的手環 矩陣乘法

傳送門 帕秋莉有乙個手環,有兩種珠子可以組成手環,乙個為金屬性,乙個為木屬性,當與金珠子相鄰的珠子都會發出金色 現在問我們有多少種方案能使得整個手環呈現金色 我們先手玩一般情況下我們的放置方案可行的個數 n1 2345 金123 58木1 1235 不難看出這便是斐波那契數列 但因為這乙個環,所以我...

Luogu P4910 帕秋莉的手環

帕秋莉是蕾公尺莉亞很早結識的朋友,現在住在紅魔館地下的大圖書館裡。不僅擅長許多魔法,還每天都會開發出新的魔法。只是身體比較弱,因為哮喘,會在詠唱符卡時遇到麻煩。她所用的屬性魔法,主要是生命和覺醒的 木 變化和活動的 火 基礎和不動的 土 果實和豐收的 金 寂靜和淨化的 水 機動和攻擊的 日 被動和防...

洛谷P3802 小魔女帕琪

從前有乙個聰明的小魔女帕琪,興趣是狩獵吸血鬼。帕琪能熟練使用七種屬性 金 木 水 火 土 日 月 的魔法,除了能使用這麼多種屬性魔法外,她還能將兩種以上屬性組合,從而唱出強力的魔法。比如說為了加強攻擊力而將火和木組合,為了掩蓋弱點而將火和土組合等等,變化非常豐富。現在帕琪與強大的夜之女王,吸血鬼蕾咪...