帕秋莉有乙個巨大的圖書館,裡面有數以萬計的書,其中大部分為魔導書。
魔導書是一種需要鑰匙才能看得懂的書,然而只有和書寫者同等或更高熟練度的人才能看得見鑰匙。因此,每本魔導書都有它自己的等級\(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 小魔女帕琪
從前有乙個聰明的小魔女帕琪,興趣是狩獵吸血鬼。帕琪能熟練使用七種屬性 金 木 水 火 土 日 月 的魔法,除了能使用這麼多種屬性魔法外,她還能將兩種以上屬性組合,從而唱出強力的魔法。比如說為了加強攻擊力而將火和木組合,為了掩蓋弱點而將火和土組合等等,變化非常豐富。現在帕琪與強大的夜之女王,吸血鬼蕾咪...