題意:求出子矩陣$k$小值。
果然除了最小割題面給什麼演算法不能用什麼演算法
實際上區間$k$大值離線通解大概就是整體二分吧……二分最大值和最小值,動態維護,如果這個區間有這麼多個小於它的數,就設為$mid$,接下來繼續遞迴修改。
1 #include 2 #include 3 #include 4 #include 5bzoj2738using
namespace
std;
6const
int maxn=505,maxq=60005;7
intc[maxn][maxn],n,q,cnt;
8int lowbit(intx)9
12int query(int x,int
y)13
19void modify(int x,int y,int
val)
2024
struct
point
2531 }p[maxn*maxn];
32struct
ques
33q[maxq];
36int
id[maxq],tmp[maxq],ans[maxq],t;
37bool
vis[maxq];
38int query(int
x)39
43void solve(int l,int r,int l,int
r)44
55int l1=l,l2=l+num;
56for(int i=l;i<=r;i++)
57if(vis[i])tmp[l1++]=id[i];else tmp[l2++]=id[i];
58for(int i=l;i<=r;i++)id[i]=tmp[i];
59 solve(l,l1-1,l,mid);solve(l1,l2-1,mid+1
,r);60}
61int
haha()
6270 sort(p+1,p+cnt+1
);71
for(int i=1;i<=q;i++)scanf("
%d%d%d%d%d
",&q[i].x1,&q[i].y1,&q[i].x2,&q[i].y2,&q[i].k);
72for(int i=1;i<=q;i++)id[i]=i;
73 solve(1,q,0,maxx+1
);74
for(int i=1;i<=q;i++)printf("
%d\n
",ans[i]);75}
76int sb=haha();
77int main()
BZOJ 2738 矩陣乘法 整體二分
題目大意 給出乙個n n的矩陣,每次詢問乙個子矩形的第k小數。整體二分即在二分答案的同時把詢問分到兩個集合中再分別二分直到每個詢問出解。相當於把多個詢問一起二分 如何判斷乙個數x是不是k小呢 把矩陣中的小於等於x的數設為1,大於x的數設為0,求詢問矩陣中的小於等於x的數有多少個,大於等於k說明x有可...
BZOJ 2738 矩陣乘法 整體二分
給你乙個n n的矩陣,不用算矩陣乘法,但是每次詢問乙個子矩形的第k小數。愚蠢的名字.整體二分,影響因子就是矩陣裡的數 把 le mid 的矩陣元素加到二維樹狀陣列裡然後詢問分成兩組就行了 可以把矩陣元素權值排序後直接二分矩陣元素而不是值 複雜度 o nlog 3n 用排序代替一維樹狀陣列理論上更快,...
BZOJ 2738 矩陣乘法 整體二分
給你乙個n n的矩陣,不用算矩陣乘法,但是每次詢問乙個子矩形的第k小數。愚蠢的名字.整體二分,影響因子就是矩陣裡的數 把 le mid 的矩陣元素加到二維樹狀陣列裡然後詢問分成兩組就行了 可以把矩陣元素權值排序後直接二分矩陣元素而不是值 複雜度 o nlog 3n 用排序代替一維樹狀陣列理論上更快,...