矩陣乘法 BZOJ 2738

2022-08-20 03:48:06 字數 2393 閱讀 2496

矩陣乘法

【問題描述】

給你乙個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 3

【樣例輸出】13

【樣例說明】

矩陣中數字是109以內的非負整數;

20%的資料:n<=100,q<=1000;

40%的資料:n<=300,q<=10000;

60%的資料:n<=400,q<=30000;

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

題解:將每個點儲存下來,排序一下,和詢問進行二分

我們將小於等於當前列舉的答案(即為mid)的點加入樹狀陣列

對於區間內的詢問,查詢子矩陣內的小於等於mid的個數,如果大於等於這個詢問要求的k,將其放置在左區間,表示第k小在l到mid之間

否則放置在右區間,表示第k小在mid+1到r之間

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8 inline void scan(int &x)916

const

int maxn = 1233;17

const

int maxq = 300233;18

struct

dot19;22

dot c[maxq];

23struct

ask24;27

ask a[maxq];

28int

n, q;

29int

p;30

intnum;

31int

ans[maxq];

32int

id[maxq], tmp[maxq];

33bool

lr[maxq];

34int

tr[maxn][maxn];

35 inline void ins(int x, int y, int

z)36

41 inline int ask(int x, int

y)42

49 inline void two(int x, int y, int l, int

r)50

57int mi = l + r >> 1;58

while(c[p + 1].v <= mi) ++p, ins(c[p].x, c[p].y, 1

);59

while(c[p].v > mi) ins(c[p].x, c[p].y, -1), --p;

60int tot, cnt = 0;61

for(int i = x; i <= y; ++i)

6268

int le = x - 1, ri = x + cnt - 1;69

for(int i = x; i <= y; ++i)

70if(lr[i]) tmp[++le] =id[i];

71else tmp[++ri] =id[i];

72for(int i = x; i <= y; ++i) id[i] =tmp[i];

73 two(x, le, l, mi), two(le + 1, ri, mi + 1

, r);74}

75 inline bool

rule(dot a, dot b)

7679

intmain()80;

88}89 sort(c + 1, c + 1 +num, rule);

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

91 scan(a[i].x), scan(a[i].y), scan(a[i].a), scan(a[i].b), scan(a[i].c), id[i] =i;

92 two(1, q, 0

, c[num].v);

93for(int i = 1; i <= q; ++i) printf("

%d\n

", ans[i]);

94 }

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...