[BZOJ2738]矩阵乘法(整体二分+二维树状数组)
整体二分+二维树状数组。
好题啊!写了一个来小时。
一看这道题,主席树不会搞,只能用离线的做法了。
整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西。
我们二分答案,然后用二维树状数组实现 \(\log^2 n\) 的单点修改,时间复杂度 \(O(q\log^2 n\log 10^9)\)
\(Code\ Below:\)
#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-(x)))
#define id(x,y) (((x)-1)*n+(y))
using namespace std;
const int maxn=300000+10;
const int lim=1e9;
int n,m,c[510][510],ans[maxn];
struct Element{
int x,y,k;
}e[maxn],e1[maxn],e2[maxn];
bool cmp(Element a,Element b){
return a.k<b.k;
}
struct Query{
int x1,y1,x2,y2,k,id;
}q[maxn],q1[maxn],q2[maxn];
inline int read(){
register int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return (f==1)?x:-x;
}
inline void add(int x,int y,int z){
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j)) c[i][j]+=z;
}
inline int sum(int x,int y){
int ans=0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j)) ans+=c[i][j];
return ans;
}
void solve(int L,int R,int Le,int Ri,int l,int r){
if(L>R||Le>Ri) return ;
if(l==r){
for(int i=Le;i<=Ri;i++) ans[q[i].id]=l;
return ;
}
int mid=(l+r)>>1,cnt1=0,cnt2=0,tot1=0,tot2=0,val;
for(int i=L;i<=R;i++){
if(e[i].k<=mid) add(e[i].x,e[i].y,1),e1[++cnt1]=e[i];
else e2[++cnt2]=e[i];
}
for(int i=1;i<=cnt1;i++) e[L+i-1]=e1[i];
for(int i=1;i<=cnt2;i++) e[L+i+cnt1-1]=e2[i];
for(int i=Le;i<=Ri;i++){
val=sum(q[i].x2,q[i].y2)-sum(q[i].x1-1,q[i].y2)-sum(q[i].x2,q[i].y1-1)+sum(q[i].x1-1,q[i].y1-1);
if(val>=q[i].k) q1[++tot1]=q[i];
else q[i].k-=val,q2[++tot2]=q[i];
}
for(int i=L;i<=L+cnt1-1;i++) add(e[i].x,e[i].y,-1);
for(int i=1;i<=tot1;i++) q[Le+i-1]=q1[i];
for(int i=1;i<=tot2;i++) q[Le+i+tot1-1]=q2[i];
solve(L,L+cnt1-1,Le,Le+tot1-1,l,mid);
solve(L+cnt1,R,Le+tot1,Ri,mid+1,r);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) e[id(i,j)].x=i,e[id(i,j)].y=j,e[id(i,j)].k=read();
sort(e+1,e+n*n+1,cmp);
for(int i=1;i<=m;i++) q[i].x1=read(),q[i].y1=read(),q[i].x2=read(),q[i].y2=read(),q[i].k=read(),q[i].id=i;
solve(1,n*n,1,m,0,lim);
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}
[BZOJ2738]矩阵乘法(整体二分+二维树状数组)的更多相关文章
- BZOJ2738矩阵乘法——整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...
- [BZOJ2738]矩阵乘法 整体二分+二维树状数组
2738: 矩阵乘法 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1643 Solved: 715[Submit][Status][Discuss ...
- 【bzoj2738】矩阵乘法 整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...
- BZOJ.2738.矩阵乘法(整体二分 二维树状数组)
题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...
- BZOJ 2738 矩阵乘法(整体二分+二维树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2738 [题目大意] 给出一个方格图,询问要求求出矩阵内第k小的元素 [题解] 我们对答 ...
- 【清澄A1333】【整体二分+二维树状数组】矩阵乘法(梁盾)
试题来源 2012中国国家集训队命题答辩 问题描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入格式 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共 ...
- 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分
题目:https://www.luogu.org/problemnew/show/P1527 不难想到(?)可以用二维树状数组.但维护什么?怎么查询是难点. 因为求第k小,可以考虑记权值树状数组,把比 ...
- 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]
题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...
- 洛谷P1527 矩阵乘法——二维树状数组+整体二分
题目:https://www.luogu.org/problemnew/show/P1527 整体二分,先把所有询问都存下来: 然后二分一个值,小于它的加到二维树状数组的前缀和里,判断一遍所有询问,就 ...
随机推荐
- “matplotlib display text must have all code points < 128 or use Unicode strings”解决方法
import sys reload(sys) sys.setdefaultencoding('utf-8') 插入以上代码,便可解决.
- 2019.01.22 bzoj3875: [Ahoi2014&Jsoi2014]骑士游戏(spfa+dp)
传送门 题意简述:nnn个怪物,对于编号为iii的怪物可以选择用aia_iai代价将其分裂成另外的bib_ibi个怪物或者用cic_ici代价直接消灭它,现在问消灭编号为1的怪物用的最小代价. ...
- caffe 笔记
caffe模块: blob:caffe中数据的封装,用于layer上流动 layer:输入层.输出层.神经网络层的抽象 net:神经网络结构,将layer层叠关联起来 solver:定义神经网络训练和 ...
- 启动Android App时,动态将Sqlite数据库文件导入到手机中类方法
package com.aqioo.db; import java.io.File; import java.io.FileOutputStream; import java.io.InputStre ...
- Atcoder Regular-074 Writeup
C - Chocolate Bar 题面 There is a bar of chocolate with a height of H blocks and a width of W blocks. ...
- MyBatis(二)最简易的增、删、改、查
这篇是承接上一篇的helloWorld程序.首先将一系列初始化的步骤再做一个工厂类进行包装,代码如下: package com.tinaluo.sun; import java.io.InputStr ...
- 手把手教Electron+vue的使用
.现如今前端框架数不胜数,尤其是angular.vue吸引一大批前端开发者,在这个高新技术快速崛起的时代,自然少不了各种框架的结合使用.接下来是介绍electron+vue的结合使用. 2.Elect ...
- 模块import,from ..import...
首次导入模块发生3件事 1.创建一个模块的名称空间 2.执行文件spam.py,将执行过程中产生的名字都放到模块的名称空间中 3.在当前执行文件中直接拿到一个名字,该名字就是执行模块中相对应的名字 f ...
- noip第3课资料
- Greys--JVM异常诊断工具
https://github.com/oldmanpushcart/greys-anatomy/wiki/greys-pdf 一.简介 我们平时在线上或者开发中会遇到各种性能.功能等问题,在运行过程中 ...