BZOJ2738 矩陣乘法

2022-05-27 22:33:22 字數 1484 閱讀 2391

n<=500,n*n的矩陣,m<=60000個詢問每次問子矩陣第k小。

方法一:第k小什麼的是可以二分的,那就整體二分套二維樹狀陣列吧!

這裡有乙個細節優化,本來整體二分是logmax的嘛,可以先把數字排個序,就變成logn了。這是沒優化的後果(話說3個log確實極卡)

方法二:分塊,n*n個數字從小到大排,然後分n次加入,每次加入n個算貢獻,在詢問裡把這些數字的貢獻減掉,如果某個詢問的k<=0了,說明他的答案在這幾個數裡面,暴力查一下即可。n^3+nq也極卡。。

1 #include

2 #include3 #include4

//#include

5 #include6

//#include

7using

namespace

std;89

intn,m;

10#define maxn 350011

11struct

ope12

q[maxn],al[maxn],ar[maxn]; int len=0;17

intans[maxn];

1819

struct

bit20

28int query(int x,int

y)29

36}t;

3738

void solve(int l,int r,int ql,int

qr)39

46int mid=(l+r)>>1,lal=0,lar=0;47

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

4854

else

5561}62

for (int i=1;i<=lal;i++) if (al[i].type) t.add(al[i].x,al[i].y,-1

);63

for (int i=1,j=ql;i<=lal;i++,j++) q[j]=al[i];

64for (int i=1,j=ql+lal;i<=lar;i++,j++) q[j]=ar[i];

65 solve(l,mid,ql,ql+lal-1

);66 solve(mid+1,r,ql+lal,qr);67}

6869

intmain()

7078

for (int i=1;i<=m;i++) len++,scanf("

%d%d%d%d%d

",&q[len].x,&q[len].y,&q[len].z,&q[len].w,&q[len].u),

79 q[len].id=i,q[len].type=0

;80 solve(0,0x3f3f3f3f,1

,len);

81for (int i=1;i<=m;i++) printf("

%d\n

",ans[i]);

82return0;

83 }

view code

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