BZOJ 2738 矩陣乘法 整體二分

2022-04-06 20:18:06 字數 1590 閱讀 5782

給你乙個n*n的矩陣,不用算矩陣乘法,但是每次詢問乙個子矩形的第k小數。

愚蠢的名字......

整體二分,影響因子就是矩陣裡的數

把$\le mid$的矩陣元素加到二維樹狀陣列裡然後詢問分成兩組就行了

可以把矩陣元素權值排序後直接二分矩陣元素而不是值

複雜度$o(nlog^3n)$

用排序代替一維樹狀陣列理論上更快,但需要把矩陣裡的元素和查詢放到乙個陣列裡再排序貌似常數太大

然後發現黃學長的做法是錯誤的複雜度不對....但竟然比我快....

二維樹狀陣列一定不要寫錯!!!

#include#include

#include

#include

#include

using

namespace

std;

const

int n=505,m=6e4+5,inf=1e9;

typedef

long

long

ll;inline

intread()

while(c>='

0'&&c<='9')

return x*f;

}int

n,q;

struct

factor

factor(

int a,int b,int

c):x(a),y(b),v(c){}

bool

operator

<(const factor &r)const

}a[n*n];

int m,now=0

;struct

queryq[m];

intid[m],t1[m],t2[m],cur[m];

intc[n][n];

inline

int lowbit(int x)

inline

void add(int x,int y,int

v)inline

int sum(int x,int

y)inline

int que(int

i)int

ans[m];

void sol(int l,int r,int ql,int

qr)

int mid=(l+r)>>1

;

for(int i=l;i<=mid;i++) add(a[i].x,a[i].y,1

);

int p1=0,p2=0

;

for(int i=ql;i<=qr;i++)

for(int i=l;i<=mid;i++) add(a[i].x,a[i].y,-1

);

for(int i=1;i<=p1;i++) id[ql+i-1]=t1[i];

for(int i=1;i<=p2;i++) id[ql+p1+i-1]=t2[i];

sol(l,mid,ql,ql+p1-1

); sol(mid+1,r,ql+p1,qr);

}int

main()

BZOJ 2738 矩陣乘法 整體二分

題目大意 給出乙個n n的矩陣,每次詢問乙個子矩形的第k小數。整體二分即在二分答案的同時把詢問分到兩個集合中再分別二分直到每個詢問出解。相當於把多個詢問一起二分 如何判斷乙個數x是不是k小呢 把矩陣中的小於等於x的數設為1,大於x的數設為0,求詢問矩陣中的小於等於x的數有多少個,大於等於k說明x有可...

BZOJ 2738 矩陣乘法 整體二分

給你乙個n n的矩陣,不用算矩陣乘法,但是每次詢問乙個子矩形的第k小數。愚蠢的名字.整體二分,影響因子就是矩陣裡的數 把 le mid 的矩陣元素加到二維樹狀陣列裡然後詢問分成兩組就行了 可以把矩陣元素權值排序後直接二分矩陣元素而不是值 複雜度 o nlog 3n 用排序代替一維樹狀陣列理論上更快,...

bzoj2738 矩陣乘法 整體二分

題意 求出子矩陣 k 小值。果然除了最小割題面給什麼演算法不能用什麼演算法 實際上區間 k 大值離線通解大概就是整體二分吧 二分最大值和最小值,動態維護,如果這個區間有這麼多個小於它的數,就設為 mid 接下來繼續遞迴修改。1 include 2 include 3 include 4 includ...