Luogu-1527 [国家集训队]矩阵乘法

题面

Luogu-1527

题解

昨天学CDQ分治时做了一些题,但是因为题(wo)太(tai)水(lan)了(le)并没有整理

学了一晚上的整体二分,拿这道模板题练练手qaq

整体二分的思想:对答案进行分治

每次处理一段答案区间时,二分一个mid答案

以mid为依据把询问分成两部分(在这道题中就是“小于等于mid的数的数量”大于等于k和小于k这两部分)

然后再继续递归处理这两部分,写起来和CDQ分治特别像...

第一次写二维BIT+第一次因为二维BIT的sb错误调30min XD

没刻意卡常还在luogu跑了rk1,开心qwq

代码

#include<map>
#include<queue>
#include<cmath>
#include<ctime>
#include<stack>
#include<bitset>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
inline char gc(){
static char buf[100000],*p1,*p2;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
return getchar();
}
inline int read(){
int ans=0,fh=1;
char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-') fh=-1; ch=gc();}
while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=gc();
return ans*fh;
}
const int maxl=600,maxn=6e4+100,inf=0x7fffffff;
struct BIT{
int n;
int s[maxl][maxl];
inline int lowbit(int x){return x&(-x);}
inline void revise(int x,int y,int z){
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
s[i][j]+=z;
}
inline 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+=s[i][j];
return ans;
}
inline int query(int sx,int sy,int tx,int ty){
int ans=query(tx,ty);
ans-=query(sx-1,ty)+query(tx,sy-1);
return ans+query(sx-1,sy-1);
}
}bt;
struct node{
int x,y,poi;
}mt[maxl*maxl];
int n,m,sx[maxn],sy[maxn],tx[maxn],ty[maxn],k[maxn],p[maxn];
int b[maxl*maxl],tot,ans[maxn],now,tmp1[maxn],tmp2[maxn];
inline bool cmp(node x,node y){return x.poi<y.poi;}
inline bool check(int x){return bt.query(sx[x],sy[x],tx[x],ty[x])>=k[x];}
void cdq(int l,int r,int L,int R){
if(L>R) return;
if(l==r){for(int i=L;i<=R;i++) ans[p[i]]=b[l];return;}
int mid=l+r>>1;
while(mt[now+1].poi<=b[mid]) now++,bt.revise(mt[now].x,mt[now].y,1);
while(mt[now].poi>b[mid]) bt.revise(mt[now].x,mt[now].y,-1),now--;
int lc=0,rc=0,cnt=L-1;
for(int i=L;i<=R;i++)
if(check(p[i])) tmp1[++lc]=p[i];
else tmp2[++rc]=p[i];
for(int i=1;i<=lc;i++) p[++cnt]=tmp1[i];
for(int i=1;i<=rc;i++) p[++cnt]=tmp2[i];
cdq(l,mid,L,L+lc-1),cdq(mid+1,r,L+lc,R);
}
int main(){
// freopen("1527.in","r",stdin);
// freopen("1527.out","w",stdout);
n=bt.n=read(),m=read();
int cnt=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mt[++cnt]=(node){i,j,read()};
sort(mt+1,mt+cnt+1,cmp);
mt[0].poi=-1;mt[cnt+1].poi=inf;
for(int i=1;i<=cnt;i++)
if(mt[i].poi!=mt[i-1].poi)
b[++tot]=mt[i].poi;
for(int i=1;i<=m;i++){
sx[i]=read(),sy[i]=read();
tx[i]=read(),ty[i]=read();
k[i]=read();p[i]=i;
}
now=0,cdq(1,tot,1,m);
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}

Luogu-1527 [国家集训队]矩阵乘法的更多相关文章

  1. 【LG1527】[国家集训队]矩阵乘法

    [LG1527][国家集训队]矩阵乘法 题面 洛谷 题解 我也不知道为什么取个这样的名字... 其实就是区间\(kth\)扩展到二维 还是用整体二分搞啦,把树状数组换成二维的 其他的基本没有什么差别 ...

  2. 洛谷 P1527 [国家集训队]矩阵乘法 解题报告

    P1527 [国家集训队]矩阵乘法 题目描述 给你一个\(N*N\)的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第\(K\)小数. 输入输出格式 输入格式: 第一行两个数\(N,Q\),表示矩阵大 ...

  3. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

  4. 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]

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

  5. P1527 [国家集训队]矩阵乘法

    \(\color{#0066ff}{ 题目描述 }\) 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. \(\color{#0066ff}{输入格式}\) 第一行两个数N,Q ...

  6. [Luogu1527][国家集训队]矩阵乘法

    luogu 题意 给你一个\(N*N\)的矩阵,每次询问一个子矩形的第K小数.(居然连修改都不带的) \(N\le500,Q\le60000\) sol 整体二分+二维树状数组裸题. 复杂度是\(O( ...

  7. 洛谷$P1527$ [国家集训队]矩阵乘法 整体二分

    正解:整体二分 解题报告: 传送门$QwQ$ 阿看到这种查询若干次第$k$小显然就想到整体二分$QwQ$? 然后现在就只要考虑怎么快速求出一个矩形内所有小于某个数的数的个数? 开始我的想法是离散化然后 ...

  8. P1527 [国家集训队]矩阵乘法 [整体二分]

    权值排序,整体二分,没了. // by Isaunoya #include <bits/stdc++.h> using namespace std; #define rep(i, x, y ...

  9. P1527 [国家集训队]矩阵乘法(整体二分)

    Link 整体二分的经典例题. 对于整体二分,我个人的理解是二分答案套分治. 具体来说就是对答案进行二分,然后对于询问进行类似于权值线段树求区间第 \(k\) 大的分治做法. 首先,我们暴力做法就是对 ...

随机推荐

  1. eclipse 4.3 汉化

    打开浏览器,浏览“参考资料”内给出的“eclipse语言包下载”地址,在博客新页面找到地址链接,如图所示.“Babel Language...”开头的一栏下面就是各个eclise版本的语言包,此处以I ...

  2. 深入理解line

    什么是行间距? 古时候我们使用印刷机来出来文字.印刷出来的每个字,都位于独立的一个块中. 行间距,即传说中控制两行文字垂直距离的东东.在CSS中,line-height被用来控制行与行之间垂直距离. ...

  3. 【BZOJ4716】假摔 二分+暴力

    [BZOJ4716]假摔 Description [题目背景] 小Q最近喜欢上了一款游戏,名为<舰队connection>,在游戏中,小Q指挥强大的舰队南征北战,从而成为了一名dalao. ...

  4. Java+selenium自动化测试基础

    Java+selenium maven配置 maven的配置,但还需要建立maven的本地库,修改apach-maven的setting.xml http://www.cnblogs.com/haoa ...

  5. 任务03—简单程序测试及 GitHub Issues 的使用

    任务三主要是测试别人的代码找bug,和根据别人提出的bug修改自己的代码. 首先是测试的对象是jinlinchao的代码,根据他的代码很容易发现几个问题,一开始,我是打算,将发现的问题一个一个提上去, ...

  6. 洛谷 P2261 [CQOI2007]余数求和

    洛谷 一看就知道是一个数学题.嘿嘿- 讲讲各种分的做法吧. 30分做法:不知道,这大概是这题的难点吧! 60分做法: 一是直接暴力,看下代码吧- #include <bits/stdc++.h& ...

  7. python模块学习(二)

    configparser模块 软件常见文档格式如下: [DEFAULT]ServerAliveInterval = 45Compression = yesCompressionLevel = 9For ...

  8. trait特性

    1.trait特性可以和特化或者偏特化结合. 2.trait可以和类型转换结合.

  9. Summaries On Java

    @1:== 和 equals(): ==用于比较引用和比较基本数据类型时具有不同的功能: 比较基本数据类型:如果两个值相同,则结果为true. 比较引用:如果引用指向内存中的同一对象,结果为true( ...

  10. gearman知识文章

    一篇文章: Gearman介绍.调研.测试与原理分析 gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/ ...