BZOJ2738 矩陣乘法

2022-05-03 23:18:11 字數 2405 閱讀 3065

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

矩陣中數字是10^9

以內的非負整數;

20%的資料:

n<=100,q<=1000

;40%

的資料:

n<=300,q<=10000

;60%

的資料:

n<=400,q<=30000

;100%

的資料:

n<=500,q<=60000

。我們可以整體二分,這樣可以轉換成對於每個矩形計算其內部有多少點。

掃瞄線+樹狀陣列就可以了,時間複雜度o(nlog^2n)。

#include#include

#include

#include

#include

#include

#define rep(i,s,t) for(int i=s;i<=t;i++)

#define dwn(i,s,t) for(int i=s;i>=t;i--)

#define ren for(int i=first[x];i;i=next[i])

using

namespace

std;

const

int buffersize=1

<<16

;char buffer[buffersize],*head,*tail;

inline

char

getchar()

return *head++;

}inline

intread()

const

int maxn=250010

;const

int maxm=60010

;const

int maxc=510

;struct

array

}a[maxn];

struct

query q[maxm];

intn,m,r,q[maxm],tmp[maxm],ans[maxm];

struct

point

}p[maxn];

intres[maxm];

struct

rect

}b[maxm

<<1

];int

sumv[maxc],cur[maxc],clo;

int query(int

x) void add(int x,int

v) void solve(int l,int r,int h,int

t)

int mid=l+r>>1,m1=0,m2=0

; rep(i,l,mid) p[++m1]=(point);

rep(i,h,t) ;

b[++m2]=(rect);

}sort(p+1,p+m1+1);sort(b+1,b+m2+1);int j=1;clo++;

rep(i,

1,m2)

int l=h,r=t;

rep(i,h,t)

if(res[i]>=q[q[i]].k) tmp[l++]=q[i];

else q[q[i]].k-=res[i],tmp[r--]=q[i];

rep(i,h,t) q[i]=tmp[i];//

開始手殘沒有寫這行話qaq(aq)*

solve(l,mid,h,r);solve(mid+1,r,r+1

,t);

}int

main() ;

sort(a+1,a+n+1

); rep(i,

1,m) q[q[i]=q[i].id=i].x=read(),q[i].l=read(),q[i].y=read(),q[i].r=read(),q[i].k=read();

solve(

1,n,1

,m);

rep(i,

1,m) printf("

%d\n

",ans[i]);

return0;

}

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