BZOJ2727 雙十字(動態規劃,樹狀陣列)

2021-08-21 10:10:00 字數 2646 閱讀 4763

bzoj

洛谷我們去年暑假的時候考試考過。

我當時寫了個大暴力混了

70 70

分。。。。

大暴力是這麼寫的:

預處理每個位置向左右/上/下能夠拓展的最多的長度(左右相當於分別求然後取mi

n min

) 接著列舉雙十字的中軸線,所在的列

然後列舉上面那一行,列舉下面那一行。

那麼,貢獻顯然是上面選擇的左右長度

∗ ∗

下面可以選擇的左右長度

∗' role="presentation">∗

∗上下兩行分別向上/下拓展的長度。

發現複雜度瓶頸在於列舉完上面那一行之後又去列舉下面那一行。

這個東西顯然可以字首和優化,那麼每次修改都是乙個區間加法,並且還是加等差數列。

線段樹或者樹狀陣列就好啦?

線段樹怎麼維護可以參考洛谷上那道無聊的數列

樹狀陣列的做法,首先要知道怎麼維護區間加法

核心思想是差分。

我們要加乙個等差數列,如果只進行一次差分,那麼就是給差分陣列做區間加法。

這樣顯然還不行,所以我們對於差分陣列再差分一次,假設得到的陣列是ci

c

i,原陣列是ai

a

i,差分一次的結果是bi

b

i那麼 ∑i

=1xa

i=∑i

=1x∑

j=1i

b[i]

=∑i=

1x(x

−i+1

)b[i

]=∑i

=1x(

x−i+

1)∑j

=1ic

[i]=

∑i=1

xc[i

]∑j=

ix(x

−j+1

)=∑i

=1xc

[i]×

12(n

−i+2

)(n−

i+1)

=12∑

i=1x

c[i]

((n2

+3n+

2)−(

i2+(

2n+3

)i))

∑ i=

1xai

=∑i=

1x∑j

=1ib

[i]=

∑i=1

x(x−

i+1)

b[i]

=∑i=

1x(x

−i+1

)∑j=

1ic[

i]=∑

i=1x

c[i]

∑j=i

x(x−

j+1)

=∑i=

1xc[

i]×1

2(n−

i+2)

(n−i

+1)=

12∑i

=1xc

[i](

(n2+

3n+2

)−(i

2+(2

n+3)

i)

)用樹狀陣列維護c[

i],i

c[i]

,i2c

[i] c[i

],ic

[i],

i2c[

i]

即可。

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define rg register

#define max 1500000

#define mod 1000000009

#define inv2 500000005

#define id(x,y) ((x-1)*m+y)

inline

int read()

void add(int &x,int y)

bool vis[max];

int n,m,l[max],u[max],d[max],ans,k;

int c1[max],c2[max],c3[max];

inline

int lb(int x)

void modify(int x,int w)

}int getsum(int x)

void modify(int l,int r,int w)

void init()

int main()

}for(int i=1;i<=n;++i)//right

}for(int j=1;j<=m;++j)//up

}for(int j=1;j<=m;++j)//down

}for(int j=2;jfor(int i=3;iint u=id(i,j);

if(!vis[u])

if(l[u])add(ans,1ll*d[u]*getsum(l[u]-1)%mod);

modify(1,l[u-m],u[u-m]);

}printf("%d\n",ans);

return

0;}

BZOJ 2727 雙十字(樹狀陣列)

題意 思路 思路來自這裡。首先對於每個位置 i,j 用c i j 表示該位置同時向左右能延伸的最大長度,用down i j 表示向下能延伸的最大長度 其實這裡可以用一維的 然後就是統計。我們一列一列列舉。對於每一列,一行一行來。每次到達一行,i,k 若c i k 0就可以統計答案了。若該行的上面有一...

2727 仙島求藥

總時間限制 1000ms 記憶體限制 65536kb 描述 少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。叛逆但孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由m n個方格組成,有的方格內有可以瞬秒李逍遙的怪物,而有的方格內則是安全。現...

題解 Loj2727舞會

n 個數,其中有 m 個位置的數是確定的,另外的數隨意排列。每次操作把最前面三個數取出,把它們的中位數取出來放到最後,然後刪掉這三個數。通過合適的排列,使最後留下來的數最大。首先這類有關中位數的問題,可以二分後轉化為操作 01 序列的問題。每次二分乙個有可能的答案 mid 把 mid 換成一,的數換...