bzoj2738 矩陣乘法

2022-05-01 06:30:12 字數 2175 閱讀 3149

time limit: 20 sec  memory limit: 256 mb

submit: 1828  solved: 792

[submit][status][discuss]

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

第一行兩個數n,q,表示矩陣大小和詢問組數;

接下來n行n列一共n*n個數,表示這個矩陣;

再接下來q行每行5個數描述乙個詢問:x1,y1,x2,y2,k表示找到以(x1,y1)為左上角、以(x2,y2)為右下角的子矩形中的第k小數。

對於每組詢問輸出第k小的數。

2 22 1

3 41 2 1 2 1

1 1 2 2 313

100%的資料:n<=500,q<=60000。

分析:很容易看出是整體二分吧,只不過從一維變成了二維.

我用bzoj3110的方法去做,開了乙個二維線段樹,結果t了,原因是每次都要枚舉行,在每一行上進行操作,在列舉上非常浪費時間. 怎麼辦呢?樹狀陣列唄......只涉及到單點修改,區間查詢. 用二維樹狀陣列維護即可.

結果還是t了......為什麼呢,因為我直接用了long long.事實上int就可以了.  這也啟發了我如果確定不可能爆int的情況下不要輕易用long long!可能爆並且時間很寬鬆的話,全部上long long可以保證不出錯.  否則就只能把可能會爆int的變成long long咯.

#include #include 

#include

#include

using

namespace

std;

const

int maxn = 510

;int n,q,a[maxn][maxn],sum[maxn][maxn << 2],tag[maxn][maxn << 2

];int l[maxn][maxn << 2],r[maxn][maxn << 2],id[60010],cnt,tot,ans[60010

];int t1[60010],t2[60010],cover[maxn][maxn << 2

],c[maxn][maxn];

struct

node

e[60010

];struct

node2

e2[maxn *maxn];

bool

cmp(node2 a,node2 b)

void add(int x,int y,int

v)int query(int x,int

y)int query(int l1,int r1,int l2,int

r2)void solve(int l,int r,int l,int

r)

return

; }

int p1 = 0,p2 = 0

;

int mid = (l + r) >> 1

;

for (int i = l; i <= mid; i++)

add(e2[i].x,e2[i].y,1);

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

else

t1[++p1] =temp;

}for (int i = l; i <= mid; i++)

add(e2[i].x,e2[i].y,-1

);

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

id[i + l - 1] =t1[i];

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

id[i + l + p1 - 1] =t2[i];

solve(l,l + p1 - 1

,l,mid);

solve(l + p1,r,mid + 1

,r);

}int

main()

sort(e2 + 1,e2 + 1 +tot,cmp);

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

solve(

1,q,1,n *n);

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

printf(

"%d\n

",ans[i]);

return0;

}

BZOJ 2738 矩陣乘法

卡時卡的我心塞啊 因為插入操作太多而且沒有順序我們需要在sort後的插入操作上滾來滾去 其實並不需要排序opt陣列,而用int下標排序可避免複製的時間過長。include include include include include define maxn 510 using namespace ...

bzoj2738 矩陣乘法

time limit 20 sec memory limit 256 mb submit 1183 solved 504 submit status discuss 給你乙個n n的矩陣,不用算矩陣乘法,但是每次詢問乙個子矩形的第k小數。第一行兩個數n,q,表示矩陣大小和詢問組數 接下來n行n列一共...

bzoj2738 矩陣乘法

description 給你乙個n n的矩陣,不用算矩陣乘法,但是每次詢問乙個子矩形的第k小數。input 第一行兩個數n,q,表示矩陣大小和詢問組數 接下來n行n列一共n n個數,表示這個矩陣 再接下來q行每行5個數描述乙個詢問 x1,y1,x2,y2,k表示找到以 x1,y1 為左上角 以 x2...