卡時卡的我心塞啊
因為插入操作太多而且沒有順序我們需要在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...