bzoj2738矩阵乘法
题意:
给你一个N*N的矩阵,没有修改,每次询问一个子矩形中的第K小数。
题目链接
思路:
当它只有一列时,其实就是区间第K大,也就是整体二分可以解决的。
现在到了二维,只需要将之前的树状数组改成二维的就可以了。
注意事项:
二维的容斥稍显繁杂,注意一下
二维树状数组不要打错
code:
#include<bits/stdc++.h>
using namespace std;
const int N=505;
const int Q=60005;
struct node{int pt1_x,pt1_y,pt2_x,pt2_y,k,id,tp;}a[N*N+Q],a1[N*N+Q],a2[N*N+Q];
int n,q,cnt,ans[Q];
inline int read()
{
int s=0,w=1; char ch=getchar();
for(;'0'>ch||ch>'9';ch=getchar())if(ch=='-')w=-1;
for(;'0'<=ch&&ch<='9';ch=getchar())s=(s<<1)+(s<<3)+(ch^48);
return s*w;
}
struct tree{
int c[N][N];
inline int lowbit(int x){return x&(-x);}
inline void add(int x,int y,int v)
{
int yy=y;
for(;x<=n;x+=lowbit(x))
for(y=yy;y<=n;y+=lowbit(y))
c[x][y]+=v;
}
inline int query(int x,int y)
{
int yy=y,anss=0;
for(;x;x-=lowbit(x))
for(y=yy;y;y-=lowbit(y))
anss+=c[x][y];
return anss;
}
}T;
void solve(int L,int R,int l,int r)
{
if(l>r) return;
if(L==R)
{
for(int i=l;i<=r;++i)
if(a[i].tp) ans[a[i].id]=L;
return;
}
int mid=L+R>>1,cnt1=0,cnt2=0;
for(int i=l;i<=r;++i)
{
if(!a[i].tp)
{
if(a[i].k<=mid) T.add(a[i].pt1_x,a[i].pt1_y,1),a1[++cnt1]=a[i];
else a2[++cnt2]=a[i];
}
else
{
int num=T.query(a[i].pt2_x,a[i].pt2_y)-T.query(a[i].pt2_x,a[i].pt1_y-1)-T.query(a[i].pt1_x-1,a[i].pt2_y)+T.query(a[i].pt1_x-1,a[i].pt1_y-1);
if(a[i].k<=num) a1[++cnt1]=a[i];
else a2[++cnt2]=a[i],a2[cnt2].k-=num;
}
}
for(int i=l;i<=r;++i)
if(!a[i].tp&&a[i].k<=mid) T.add(a[i].pt1_x,a[i].pt1_y,-1);
for(int i=l;i<=l+cnt1-1;++i)a[i]=a1[i-l+1];
for(int i=l+cnt1;i<=r;++i)a[i]=a2[i-l-cnt1+1];
solve(L,mid,l,l+cnt1-1);
solve(mid+1,R,l+cnt1,r);
}
int main()
{
n=read(),q=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
a[++cnt]=node{i,j,0,0,read(),0,0};
for(int i=1;i<=q;++i)
{
int _x1=read(),_y1=read(),_x2=read(),_y2=read(),_k=read();
a[++cnt]=node{_x1,_y1,_x2,_y2,_k,i,1};
}
solve(0,1e9,1,cnt);
for(int i=1;i<=q;++i)
printf("%d\n",ans[i]);
return 0;
}
bzoj2738矩阵乘法的更多相关文章
- [bzoj2738]矩阵乘法_整体二分_树状数组
矩阵乘法 bzoj-2738 题目大意:给定一个$n*n$的矩阵.每次给定一个矩阵求矩阵$k$小值. 注释:$1\le n\le 500$,$1\le q\le 6\cdot 10^4$. 想法: 新 ...
- BZOJ2738: 矩阵乘法
Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Input 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N*N个数,表示这个矩阵: ...
- BZOJ2738矩阵乘法——整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...
- [BZOJ2738]矩阵乘法-[整体二分+树状数组]
Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. (N<=500,Q<=60000) Solution 考虑二分答案,问题转化为求矩阵内为1 ...
- [BZOJ2738]矩阵乘法 整体二分+二维树状数组
2738: 矩阵乘法 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1643 Solved: 715[Submit][Status][Discuss ...
- BZOJ2738: 矩阵乘法(整体二分)
Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Input 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N*N个数,表示这个矩阵: ...
- BZOJ2738 矩阵乘法 【整体二分 + BIT】
题目链接 BZOJ2738 题解 将矩阵中的位置取出来按权值排序 直接整体二分 + 二维BIT即可 #include<algorithm> #include<iostream> ...
- 【分块】【链表】bzoj2738 矩阵乘法
http://www.cnblogs.com/jianglangcaijin/p/3460012.html 首先将矩阵的数字排序.设置size,每次将size个数字插入.插入时,我们用h[i][j]记 ...
- BZOJ2738 矩阵乘法(整体二分+树状数组)
单个询问二分答案即可,多组询问直接整体二分再二维BIT.注意保证复杂度. #include<iostream> #include<cstdio> #include<cma ...
随机推荐
- 数据结构-链式栈c++
栈的最基本特点先进后出,本文简单介绍一下用c++写的链式栈 头文件 #ifndef LINKEDSTACK_H #define LINKEDSTACK_H template<class T> ...
- 知识不是来炫耀的,而是来分享的-----现在的人们却…似乎开始变味了…
我讨厌那些自以为是的人,哪些只有远大抱负却不付出的混蛋,我讨厌那些老生欺负小生,讨厌以大欺小,讨厌别人把知识拿来炫耀. 我自己也不愿做这类人,我渴望看到成功,我不怕一意孤行,我不怕失败,我只怕自己做的 ...
- javascript-state-machine
import StateMachine from 'javascript-state-machine' import EventEmitter from 'events' /** * 上传的文档的状态 ...
- Luogu5401 CTS2019珍珠(生成函数+容斥原理+NTT)
显然相当于求有不超过n-2m种颜色出现奇数次的方案数.由于相当于是对各种颜色选定出现次数后有序排列,可以考虑EGF. 容易构造出EGF(ex-e-x)/2=Σx2k+1/(2k+1)!,即表示该颜色只 ...
- iOS - SceneKit 3D引擎初探
最近到处搜集资料研究3D最后还是决定锁定OC框架,找到的学习资料随后慢慢整理 SceneKit 是一个OC 框架,开始之前,先熟悉一下SceneKit 的三维坐标系: 很清楚的看到,SceneKit ...
- iOS - 回顾总结Runtime原理及使用
runtime简介 因为Objc是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行时.也就是说只有编译器是不够的,还需要一个运行时系统 (runtime system) 来执行编译后的 ...
- HTTP协议超级详解
HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数据通信的基础. ...
- 【日语】日语单词N3_N4_N5
日语单词N3_N4_N5 单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. ...
- 一个 Git 分支协作模式的进化故事
从不用版本管理到使用 Git 分支管理的故事,也就是从这个时候开始的... 某公司只有一个程序员,一开始并没有版本管理的概念.项目开发只有一个人在参与,所以也没用版本管理工具. 后来,老板又招了两个程 ...
- 异常-Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=hdfs, access=WRITE, inode="/hbase":root:supergroup:drwxr-xr-x
1 详细异常 Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlExce ...