Spotlights 思維 字首和優化

2022-03-03 03:16:21 字數 1419 閱讀 9607

原部落格位址

題目鏈結

題目大意:

給你乙個n*m的空間,其中0表示沒有人,1表示有人,對應乙個好位子以及方向的定義為:

①首先這個位子不能有人。

②其次對應這個位子安排乙個照明方向,這個方向上必須有人才行。

讓你求一共有多少個這樣滿足的放置方案。

思路:1、首先我們o(n*m)暴力列舉出所有的沒有人的位子。然後我們如果暴力判斷其一行一列的四個方向是否有人的話,時間複雜度會高達:o(n^3)【我們若視n==m的情況下】顯然會tle。

2、那麼我們考慮優化:

①設定sum【i】【j】表示第i行,從第乙個數加到第j個數的和(字首和),那麼如果我們此時保證(i,j)是沒有人的,並且sum【i】【j】>0,那麼說明位子(i,j)的左側有人,那麼對應這個位子放置照明方向為左,即是乙個可行解。那麼同理,如果sum【i】【m】-sum【i】【j】>0,那麼說明位子(i,j)的右側有人,那麼對應這個位子放置照明方向為右,即也是乙個可行解。

②同理,再設定sum2【i】【j】表示第j列,從第乙個數加到第i個數的和,那麼同理,如果我們此時保證(i,j)是沒有人的,並且sum2【i】【j】>0,那麼說明位子(i,j)的上邊有人,那麼對應這個位子放置照明方向為上,即是乙個可行解。那麼也是同理,如果sum2【n】【j】-sum2【i】【j】>0,那麼說明位子(i,j)的下邊有人,那麼對應這個位子放置照明方向為下,即也是乙個可行解。

③那麼此時我們暴力列舉出沒有人的位子之後,只需要常數級的操作既可以搞定這個問題了。

1 #include2 #include3 #include4 #include5 #include6 #include

7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define ll long long

13#define se second

14#define fi first

15const

int mos = 0x7fffffff; //

2147483647

16const

int nmos = 0x80000000; //

-2147483648

17const

int maxn=1e6+5;18

19int mp[1005][1005

];20

int sum1[1005][1005],sum2[1005][1005

];21

int n,m,cnt=0;22

23int

main()

2433

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

34for(int j=1;j<=m;j++)

3542

43 cout44 }

數學考試 (字首和 思維)

題目 找出數列中不連續的最大的k區間 和第二大的k區間 這樣的貪心思想是錯誤的。例如7 3 5 6 6 8 10 12 7 不連續的第一大3區間 和第二大分別為 8 10 12 和 5 6 6 這樣計算答案為47.實際上應該選 6 6 8 和 10 12 7 答案為49 以i為分界線,i的左邊包括i...

CodeForces 519D(思維 字首和)

給定每個小寫字母乙個數值,給定乙個只包含小寫字母的字串 s,求 s 的子串 t 個數,使 t滿足 考慮abca的值為1 1 1 1,字首和為1 2 1 0,用map維護每個字元的各字首和的個數,設兩個a位置分別為l,r,那麼對於後乙個a它的答案是map a prer 因為l 1 r 1的和為0,所以...

雷射炸彈(二維字首和 思維)

題目 一種炸彈可以將邊長為r的正方形內的所有目標摧毀,問一顆炸彈最多能摧毀多少價值的目標 以 1,1 為起始點,v i j 表示點 1,1 到點 i,j 矩陣的目標價值和。那麼如何計算v i j 模擬一維裡面 psum i psum i 1 右下角的位置為 i,j 左上角為 1,1 v i j 1 ...