bzoj 2738 矩陣乘法

2021-08-02 12:58:21 字數 2043 閱讀 6113

2738: 矩陣乘法

time limit: 20 sec memory limit: 256 mb

submit: 1529 solved: 660

[submit][status][discuss]

description

給你乙個n*n的矩陣,不用算矩陣乘法,但是每次詢問乙個子矩形的第k小數。

input

第一行兩個數n,q,表示矩陣大小和詢問組數;

接下來n行n列一共n*n個數,表示這個矩陣;

再接下來q行每行5個數描述乙個詢問:x1,y1,x2,y2,k表示找到以(x1,y1)為左上角、以(x2,y2)為右下角的子矩形中的第k小數。

output

對於每組詢問輸出第k小的數。

sample input

2 22 1

3 41 2 1 2 1

1 1 2 2 3

sample output

hint

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

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

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

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

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

source

題目與題幹完全沒有關係系列。

整體二分。

首先把整個矩陣雜湊排序,然後做整體二分。

設當前答案為mid,那麼將雜湊排好序的矩陣中所有val < mid的數字加入bit中,對於每個詢問拆成四個容斥一發,統計出來詢問範圍內 < mid的數字有多少個,即為cnt。如果k > cnt,把詢問劃分到[mid,r],否則劃分到[l,mid-1]。

注意bit的新增與刪除設立乙個指標now來完成,否則暴力加入刪除會tle。

//bzoj 2738 矩陣乘法

#include

#define ll long long

#define p(i,j) ((i-1)*n+(j))

#define m(a) memset(a,0,sizeof a)

#define fo(i,j,k) for(i=j;i<=k;i++)

using namespace std;

const int mxn=505;

int n,q,mx,now;

int c[mxn][mxn],ans[60005];

struct node a[250005];

struct query q[60005],tmp[60005];

inline int

read()

while(ch>='0'&&ch<='9') x=(x

<<1)+(x

<<3)+ch-'0',ch=getchar();

return

x*f;

}inline bool comp(node u,node v)

inline void add(int

x,int

y,int v)

inline int getsum(int

x,int

y)inline void cdq(int l,int r,int l,int r)

while(now*n && a[now].valx,a[now].y,1);

while(now && a[now].val>=mid)

add(a[now].x,a[now].y,-1),--now;

fo(i,l,r)

reverse(tmp+l2+1,tmp+r+1);

fo(i,l,r) q[i]=tmp[i];

cdq(l2+1,r,mid,r),cdq(l,l1-1,l,mid-1);

}int main()

; fo(i,1,q)

sort(a+1,a+n*n+1,comp);

cdq(1,q,0,a[n*n].val);

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

return

0;}

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