也是因为一道题才来学的。。。

然后就发现这道模板貌似是暑假初期在某校集训的时候的比赛题 并且好像没改= =

前置芝士

1.二分= =

* CDQ分治[你要是知道CDQ分治的话这玩意就很好理解啦]

*本题使用二维树状数组

整体二分是类似CDQ分治的一类东西

CDQ分治是计算左边对右边的贡献

整体二分是计算左边的贡献来确定答案在哪边

具体来说就是这样一个过程

[l,r,L,R] : 小写代表答案区间 大写表示询问区间

我们通过计算 l 到 mid 的答案 来确定[L,R]的询问的答案是属于[l,mid]还是[mid,r]

对于这个题就是把<=mid的值计算贡献 然后对于这些询问看是否>=k 这样就可以同时二分答案和询问从而做到均摊nlgn

代码实现并不复杂。 注意权值和询问别放反了= =

附代码。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define lowbit(x) (x&(-x))
#define mxn 60010
using namespace std; struct node{int x,y,v;}t[250010];
struct query{int x1,x2,y1,y2,k;}q[mxn];
int f[510][510],n,ans[mxn],id[mxn];
int cur[mxn],cr[mxn],m,cnt=0;
int val[250010];
void modify(int x,int y,int v)
{
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
f[i][j]+=v;
} int query(int x,int y)
{
int ans=0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
ans+=f[i][j];
return ans;
} int get(int x1,int x2,int y1,int y2)
{
//puts("");
return query(x2,y2) - query(x1-1,y2) - query(x2,y1-1) + query(x1-1,y1-1);
} int now;
void work(int l,int r,int L,int R)// [L,R] val [l,r] query
{
//printf("%d %d %d %d\n",l,r,L,R);
if(l>r) return; if(L==R)
{
for(int i=l;i<=r;i++) ans[id[i]]=val[L];
return;
} int MID = L+R>>1;
while(now<MID) now++,modify(t[now].x,t[now].y,1);
while(now>MID) modify(t[now].x,t[now].y,-1),now--;
int l1=0,l2=0,mid;
for(int i=l;i<=r;i++)
{
int x=id[i];// printf("%d\n",i);
int tmp = get(q[x].x1,q[x].x2,q[x].y1,q[x].y2);
if(tmp >= q[x].k) cur[++l1] = x;
else cr[++l2] = x;
} mid = l+l1-1;
for(int i=1;i<=l1;i++)
id[l+i-1]=cur[i];
for(int i=1;i<=l2;i++)
id[mid+i]=cr[i]; work(l,mid,L,MID); work(mid+1,r,MID+1,R);
} bool cmp(node a,node b)
{
return a.v<b.v;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[++cnt].x=i,t[cnt].y=j,scanf("%d",&t[cnt].v);
sort(t+1,t+cnt+1,cmp);
for(int i=1;i<=cnt;i++) val[i]=t[i].v;
for(int i=1;i<=m;i++)
scanf("%d%d%d%d%d",&q[i].x1,&q[i].y1,&q[i].x2,&q[i].y2,&q[i].k),id[i]=i;
work(1,m,1,cnt);
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
return 0;
}

【学习笔记】整体二分(BZOJ2738矩阵乘法)的更多相关文章

  1. [bzoj2738]矩阵乘法_整体二分_树状数组

    矩阵乘法 bzoj-2738 题目大意:给定一个$n*n$的矩阵.每次给定一个矩阵求矩阵$k$小值. 注释:$1\le n\le 500$,$1\le q\le 6\cdot 10^4$. 想法: 新 ...

  2. BZOJ2738矩阵乘法——整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入   第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...

  3. BZOJ2738 矩阵乘法 【整体二分 + BIT】

    题目链接 BZOJ2738 题解 将矩阵中的位置取出来按权值排序 直接整体二分 + 二维BIT即可 #include<algorithm> #include<iostream> ...

  4. BZOJ2738: 矩阵乘法(整体二分)

    Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Input 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N*N个数,表示这个矩阵: ...

  5. [BZOJ2738]矩阵乘法-[整体二分+树状数组]

    Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. (N<=500,Q<=60000) Solution 考虑二分答案,问题转化为求矩阵内为1 ...

  6. [BZOJ2738]矩阵乘法 整体二分+二维树状数组

    2738: 矩阵乘法 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1643  Solved: 715[Submit][Status][Discuss ...

  7. BZOJ2738 矩阵乘法(整体二分+树状数组)

    单个询问二分答案即可,多组询问直接整体二分再二维BIT.注意保证复杂度. #include<iostream> #include<cstdio> #include<cma ...

  8. [BZOJ2738]矩阵乘法(整体二分+二维树状数组)

    整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...

  9. 学习心得:《十个利用矩阵乘法解决的经典题目》from Matrix67

    本文来自:http://www.matrix67.com/blog/archives/tag/poj大牛的博文学习学习 节选如下部分:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律:二,矩阵乘法满足 ...

随机推荐

  1. No module named 'requests'---问题解决记录

    今天在用Pycharm执行脚本时,报错.如下: 问题排查: 1,检查是否安装了requests cmd输入命令:pip install requests 提示有新版本可以升级,那 我就升级了. 然后输 ...

  2. ORACLE修改表字段顺序

    1.若'GYZL_BZPWL_TB' 为要修改的表名,注意表名一定要大写!此句可以获取表的id.select object_id from all_objects where object_name= ...

  3. [LeetCode] 137. Single Number II (位操作)

    传送门 Description Given an array of integers, every element appears three times except for one, which ...

  4. php用什么软件编程

    准备好好学习学习PHP了吗?那么你首先应该考虑用什么开发工具(IDE).市面上有很多这类工具,收费的有,免费的也有,选择起来并不轻松. 如果你说PHP编程用基础的文本编辑软件就可以了,比如用记事本.是 ...

  5. java Semaphore信号灯

    Semaphore实现的功能就类似2个公用电话,假如有10个人要打电话:那么只能2个人占有电话,8个需要等待.当2个人中 的任何一个人让开后,其中等待的另外8个人中又有一个人可以使用了等待的8个人中可 ...

  6. webpack4.0.1的坑

    webpack4在2月底正式发布后,原来的很多做法不能使用,下面把使用webpack4.0.1过程中,出现的问题,一一记录,也欢迎大家补充,谢谢!团结就是力量,众人拾柴火焰高,加油! 关于webpac ...

  7. android测试开发概念

    一:测试分类 1.分类概览 按测试阶段划分: 单元测试 集成测试 系统测试 验收测试 按是否覆盖源代码: 黑盒测试: 功能测试: 界面测试 逻辑测试 安装测试 应用性测试 兼容性测试 性能测试: 稳定 ...

  8. SpringBoot实现上传下载(二)

    这篇写下载. **1.实现思路** 上一篇的数据库设计中,我们有一个字段始终没有用到fileName,这是用来给Layer对象存储文件名的,以此来完成文件与对象的对应, ![image.png](ht ...

  9. BZOJ 3931 (网络流+最短路)

    题面 传送门 分析 考虑网络流 注意到数据包走的是最短路,所以我们只需要考虑在最短路上的边 由于最短路可能有多条,我们先跑一遍Dijkstra,然后再\(O(m)\) 遍历每条边(u,v,w) 如果d ...

  10. 第一天学习如何使用markdown写日志,一起来看看成果吧!

    目录 一级标题 二级标题 一级标题 二级标题 ==黄色== one two three one two three 性别 年龄 男 150 H~2~o hello markdown hello mar ...