傳送門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很小,我們就預處理 暴力做法列舉每個格點的話,我們可以預處理出每行每列標記點的字首和然後離散化,這樣的話複雜度就是 我...