題目描述
乙個n*m的棋盤,』.』表示可以通過,』#』表示不能通過,給出q個詢問,給定起點和終點,判斷兩點是否聯通,如聯通輸出「yes」,否則輸出「no」。
資料範圍
n,m <=500,q <=10^6。
題解:
①由於存在兩個方向和不可逆性,標記聯通分量的方法不可行
②分治演算法。按照行將棋盤一分為二,進行dp處理:
用f[i][j]表示點(i,j)與中線上每個點的聯通性,可用bitset壓位處理。
轉移方程式:f[i][j]=f[i][j+1]|f[i+1][j]
③離線詢問,將詢問隨著分治區間而分開處理。
④時間複雜度: o(n2*logn)
#include #include #include using std::vector;那神秘的光芒像暴風雨般凜冽著,大地在無情的追問中幻滅成輓歌,using std::bitset;
const int query_size = 600006;
const int map_size = 511;
int n, m, q;
char map[map_size][map_size];
int ans[query_size];
bitsetf[map_size][map_size], g[map_size][map_size];
struct query ;
query q;
void solve(vectorv, int l, int r)
} for (int i = m; i <= r; i++)
for (int j = 1; j <= m; j++)
} vectorvl, vr;
for (vector::iterator it = v.begin(); it != v.end(); it++)
solve(vl, l, m - 1);
solve(vr, m + 1, r);
}int main()
solve(v, 1, n);
for (int i = 0; i < q; i++)
puts(ans[i] ? "yes" : "no");
return 0;
}//czy020202
如夢的迷霧隨著詩篇消逝在遠山…… ————————————汪峰《信仰在空中飄揚》
CZY選講 吃東西
題目描述 乙個神秘的村莊裡有4家美食店。這四家店分別有a,b,c,d種不同的美食。lyk想在每一家店都吃其中一種美食。每種美食需要吃的時間可能是不一樣的。現在給定第1家店a種不同的美食所需要吃的時間a1,a2,aa。給定第2家店b種不同的美食所需要吃的時間b1,b2,bb。以及c和d。lyk擁有n個...
CZY選講 黑白染色
題目描述 給出平面上n 個點,試將他們黑白染色,要求染色後無法用一條直線把黑白完全分開。隨便輸出一種方案。資料範圍 n 100000 題解 點數很多,但是可以發現至多需要4個點就可以完成。根據上述結論進行分類討論即可 找三個點,若三點共線,則按圖1方法染色。若三點不共線,再找第四個點,若與其中兩點共...
CZY選講 最大子矩陣和
題目描述 有乙個n m的矩陣,恰好改變其中乙個數變成給定的常數p,使得改變後的這個矩陣的最大子矩陣最大。資料範圍 n,m 300。題解 如果沒有p,那麼二維矩陣和就是一維最長連續子串行的dp公升級就可以了 設f i j k 表示在i行j行之間1 k列這乙個矩形中的最大子矩陣的值 轉移方程 f i j...