題解 打地鼠 SDOI2011 模擬 行列無關

2022-05-20 09:08:15 字數 1183 閱讀 7213

為什麼洛谷上的題解都是剪枝做的啊!就沒有人寫複雜度靠譜的演算法嗎!

傳送到洛谷:( ̄、 ̄)

傳送到bzoj:( ´・・)ノ(._.`)

首先\(o(n^6)\),或者是\(o(n^4 \log^2 n)\)的模擬非常好想,列舉錘子的長寬,然後從左上角開始挨個砸就可以了。

列舉的複雜度是\(o(n^2)\)的,模擬一次的複雜度是\(o(n^4)\)的,也可以用bit做到一次模擬\(o(n^2 \log^2 n)\)。

仔細想了想發現似乎沒法合理列舉,那就只能發掘性質了。

直覺告訴我似乎是行列無關的。

具體來說,我們首先固定錘子的長為1,然後列舉錘子的寬,求出當長為1的時候最大可行的寬,叫做\(c\)。

然後再固定錘子的寬為1,列舉錘子的長,求出當寬為1的時候最大可行的長,叫做\(r\)。

上面兩步可以用\(o(n^4)\)的暴力模擬來做,或者是用bit做到\(o(n^3 \log n)\)。

那麼這個\(r\)和\(c\)就是最終答案。

試著證明了一下,確實是這樣的,具體證明我沒有仔細想,大概感覺是從「每個格仔被敲打的次數是行列無關的」這條入手?

然後就a掉了。

因為我比較懶,所以寫的是\(o(n^4)\)的方法,畢竟這個模擬常數小嘛,\(o(n^4)\)過100肯定沒問題啦。

#include #include #include using namespace std;

const int maxn = 110;

int _w;

int n, m, a[maxn][maxn], tot;

int r, c, b[maxn][maxn];

int t[maxn][maxn];

bool check( int x )

void solve()

r = m, c = n;

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

for( int j = 1; j <= c; ++j )

b[i][j] = a[j][i];

for( int y = c; y >= 1; --y )

if( check(y) )

printf( "%d\n", tot );

}int main()

solve();

return 0;

}

SDOI2011 染色 題解

題目大意 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段數量 連續相同顏色被認為是同一段 思路 樹剖之後,維護其兩端的顏色 答案和標記即可。include include define n 100001 using...

SDOI2011 飛彈攔截 題解

論printf lf 0.0 的重要性 給你nn 個三維的點 x,y,z x,y z 求出最長的三維不下降序列,並輸出每乙個點在最長的序列上的概率。這個肯定和普通的飛彈攔截不同了,普通的是沒有速度的,也就是二維的,且時間一維已經有序,那麼對高度求乙個lis lis 最長不下降序列 就好了。但是現在還...

題解 SDOI 2011計算器

bzoj codevs 洛谷給定 y y z role presentation zz,p p 求 1 yz modp role presentation yz modp y z modp 2 x y z modp x y z modp 中x x 的最小非負整數解 3 yx z modp role ...