bzoj 1227 虔誠的墓主人(樹狀陣列)

2021-08-15 01:45:02 字數 1576 閱讀 9738

傳送門biu~

上下左右沒有樹的墓地必然沒有虔誠度,所以將原圖離散化成乙個最大為w×

w w×w

的圖。

對於每塊墓地,令在它上、下、左、右方向常青樹的數目分別為

u u

,p' role="presentation" style="position: relative;">pp,

l l

,r' role="presentation" style="position: relative;">r

r。則以這個點為中心的十字架的數目是ck

u×ck

p×ck

l×ck

r cuk

×cpk

×clk

×crk

。 顯然列舉每塊墓地,時間複雜度為o(

w2) o(w

2)

會tle。那麼我們考慮在同一行,即

x x

座標相同的兩棵常青樹之間的所有墓地,它們的

l' role="presentation" style="position: relative;">ll和

r r

值是相同的。那麼這些墓地的虔誠度之和為cl

k×cr

k×σc

uk×σ

cdk' role="presentation" style="position: relative;">ckl

×ckr

×σck

u×σc

kdcl

k×cr

k×σc

uk×σ

cdk。採用樹狀陣列來求和。

首先預處理出每棵樹的

u u

,p' role="presentation" style="position: relative;">pp,

l l

,r' role="presentation" style="position: relative;">r

r值,按行列舉每棵樹。用當前行的樹來修改樹狀陣列中σc

ku×σ

ckd σcu

k×σc

dk

的值。每次將兩棵樹之間的貢獻加到答案裡。

ps:因為模數特殊,可以直接用in

t int

的自然溢位,最後取答案的後31位即可。

#include

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

using

namespace

std;

struct dataa[100005];

inline

bool cmp(data a,data b)

}inline

void add(int x,int val)

inline

int search(int x)

int main()

for(int cnt=0,y=-1,i=w;i>=1;--i)

for(int i=1;i<=w;++i)

printf("%d",ans&(~0u>>1));

return

0;}

BZOJ 1227 虔誠的墓主人

題解 長這樣的題好像都有固定套路 所有點按座標排序 處理組合數,然後用樹狀陣列維護奇怪的資訊 編不下去了 黃學長的題解 ac code include include include using namespace std inline void read int x const int mo 21...

SDOI2009 虔誠的墓主人

題目大意 n times m 的點陣,有的點是樹木,定義乙個空點的度數為正上,正左,正右,正下分別有 k 個點的選法 求點陣的總度數.挺好的一道題,排列組合和資料結構糅合在一塊 include include include define lowbit x x x 巨集定義樹狀陣列操作 using ...

洛谷 SDOI2009 虔誠的墓主人

初見安 這裡是傳送門 洛谷p2154 sdoi2009 虔誠的墓主人 題意很簡單 在n m的網格上,求所有未標記點的權值和。乙個未標記點的權值為 設其上下左右有 首先資料範圍很夠,k很小,我們就預處理 暴力做法列舉每個格點的話,我們可以預處理出每行每列標記點的字首和然後離散化,這樣的話複雜度就是 我...