BZOJ 2738 矩陣乘法

2021-07-10 01:27:59 字數 1578 閱讀 5312

卡時卡的我心塞啊

因為插入操作太多而且沒有順序我們需要在sort後的插入操作上滾來滾去= =

其實並不需要排序opt陣列,而用int下標排序可避免複製的時間過長。

#include #include #include #include #include #define maxn 510

using namespace std;

void read(int &num)

int n, q;

//bit

x += lowbit_cal(x);

} }int ask(int x, int y)

x -= lowbit_cal(x);

} return ans; }

int ask(const int& x1, const int& y1, const int& x2, const int& y2)

int n;

#define maxq 310010

struct opt

}q[maxq], q1[maxq], q2[maxq];

const int inf = 0x7fffffff;

int tmp, ans[maxq];

int t = 0;

void solve(int head, int tail, int l, int r)

int mid = l + r >> 1;

while(q[t + 1].tp <= mid && t < tmp)

t ++, update(q[t].x1, q[t].y1, 1);

while(q[t].tp > mid && t)

update(q[t].x1, q[t].y1, -1), t --;

int l1 = 0, l2 = 0;

for(int i = head; i <= tail; i ++) }

int cnt = head;

for(int i = 1; i <= l1; i ++)q[cnt ++] = q1[i];

for(int i = 1; i <= l2; i ++)q[cnt ++] = q2[i];

// memcpy(q + head, q1 + 1, sizeof (q[0]) * l1);

// memcpy(q + head + l1, q2 + 1, sizeof (q[0]) * l2);

solve(head, head + l1 - 1, l, mid);

solve(head + l1, tail, mid + 1, r);

}int main()

} sort(q + 1, q + 1 + n);

int id = 0;

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

solve(tmp + 1, n, mn, mx);

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

printf("%d\n", ans[i]);

return 0;

}

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

bzoj2738 矩陣乘法

m id,每次把權值小於等於mi d 的數對應位置上 1 可以用二維bit實現 然後掃瞄當前的詢問,對於乙個詢問看它對應的那個子矩形中已經插入了幾個數,如果插入的數的個數比詢問的 k 大,就說明列舉的答案過大,就把當前詢問加入左邊,否則加入右邊。然後分治下去。整體二分 二維bit include i...