題目大意:給出乙個n*n的矩陣,每次詢問乙個子矩形的第k小數。
整體二分即在二分答案的同時把詢問分到兩個集合中再分別二分直到每個詢問出解。
相當於把多個詢問一起二分
如何判斷乙個數x是不是k小呢
把矩陣中的小於等於x的數設為1,大於x的數設為0,求詢問矩陣中的小於等於x的數有多少個,大於等於k說明x有可能是k小。
#include
#include
#define n 505
#define m 60005
#define inf 1000000000
using
namespace
std;
int n,m;
namespace bit
int c[n][n];
int sum(int x,int y)
void modify(int x,int y,int v)
}using
namespace bit;
struct data
data(int _x,int _y,int _v):x(_x),y(_y),v(_v) {}
bool
operator
< (const data& rhs) const
}a[n*n];
struct query
bool check()
}q[m],p[m];
int tot,now,ans[m];
void solve(int l,int r,int l,int r)
for(int i=l;i<=r;++i) q[i]=p[i];
solve(l,_l-1,l,mid-1), solve(_r+1,r,mid+1,r);
return ;
}int main()
BZOJ 2738 矩陣乘法 整體二分
給你乙個n n的矩陣,不用算矩陣乘法,但是每次詢問乙個子矩形的第k小數。愚蠢的名字.整體二分,影響因子就是矩陣裡的數 把 le mid 的矩陣元素加到二維樹狀陣列裡然後詢問分成兩組就行了 可以把矩陣元素權值排序後直接二分矩陣元素而不是值 複雜度 o nlog 3n 用排序代替一維樹狀陣列理論上更快,...
bzoj2738 矩陣乘法 整體二分
題意 求出子矩陣 k 小值。果然除了最小割題面給什麼演算法不能用什麼演算法 實際上區間 k 大值離線通解大概就是整體二分吧 二分最大值和最小值,動態維護,如果這個區間有這麼多個小於它的數,就設為 mid 接下來繼續遞迴修改。1 include 2 include 3 include 4 includ...
BZOJ 2738 矩陣乘法 整體二分
給你乙個n n的矩陣,不用算矩陣乘法,但是每次詢問乙個子矩形的第k小數。愚蠢的名字.整體二分,影響因子就是矩陣裡的數 把 le mid 的矩陣元素加到二維樹狀陣列裡然後詢問分成兩組就行了 可以把矩陣元素權值排序後直接二分矩陣元素而不是值 複雜度 o nlog 3n 用排序代替一維樹狀陣列理論上更快,...