洛谷$P1527$ [国家集训队]矩阵乘法 整体二分
正解:整体二分
解题报告:
阿看到这种查询若干次第$k$小显然就想到整体二分$QwQ$?
然后现在就只要考虑怎么快速求出一个矩形内所有小于某个数的数的个数?
开始我的想法是离散化然后开个桶前缀和下,然后发现还要计入坐标,显然会$MLE$,就$GG$了$QwQ$
这时候考虑如果是一维,就可以直接树状数组,关于范围的限制可以提前对询问排个序就成.
然后现在是二维?所以用二维树状数组就成昂
然后就做完了?
$QwQ$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rb register bool
#define rc register char
#define lowbit(x) (x&(-x))
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define lb(x) lower_bound(st+1,st+1+sum,x)-st const int N=6e5+,M=+,inf=1e9;
int n,m,st[N],nod_cnt,tr[M][M],sum;
struct node{int l1,r1,l2,r2,K,id,as;}nod[N],tmp1[N],tmp2[N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il bool cmp(node gd,node gs){return gd.id<gs.id;}
il void modify(ri x,ri y,ri val)
{ri tmp=y;while(x<=n){y=tmp;while(y<=n)tr[x][y]+=val,y+=lowbit(y);x+=lowbit(x);}}
il int query(ri x,ri y)
{ri ret=,tmp=y;while(x){y=tmp;while(y)ret+=tr[x][y],y-=lowbit(y);x-=lowbit(x);}return ret;}
void solv(ri l,ri r,ri dat_l,ri dat_r)
{
if(l>r)return;
if(dat_l==dat_r){rp(i,l,r)nod[i].as=dat_l;return;}
ri mid=(dat_l+dat_r)>>,t1=,t2=;
rp(i,l,r)
{
if(!nod[i].id)if(nod[i].K<=mid)tmp1[++t1]=nod[i],modify(nod[i].l2,nod[i].r2,);else tmp2[++t2]=nod[i];
else
{
ri d=query(nod[i].l2,nod[i].r2)-query(nod[i].l1-,nod[i].r2)-query(nod[i].l2,nod[i].r1-)+query(nod[i].l1-,nod[i].r1-);
if(d>=nod[i].K)tmp1[++t1]=nod[i];else nod[i].K-=d,tmp2[++t2]=nod[i];
}
}
rp(i,l,r)if(!nod[i].id && nod[i].K<=mid)modify(nod[i].l2,nod[i].r2,-);
rp(i,,t1)nod[i+l-]=tmp1[i];rp(i,t1+,t1+t2)nod[i+l-]=tmp2[i-t1];
solv(l,l+t1-,dat_l,mid);solv(l+t1,r,mid+,dat_r);
} int main()
{
freopen("1527.in","r",stdin);freopen("1527.out","w",stdout);
n=read();m=read();rp(i,,n)rp(j,,n)++nod_cnt,nod[nod_cnt]=(node){,,i,j,st[nod_cnt]=read(),};
sort(st+,st++nod_cnt);sum=unique(st+,st++nod_cnt)-st-;rp(i,,nod_cnt)nod[i].K=lb(nod[i].K);
rp(i,,m){ri d1=read(),d2=read(),d3=read(),d4=read(),K=read();nod[++nod_cnt]=(node){d1,d2,d3,d4,K,nod_cnt};}
solv(,nod_cnt,,sum);
sort(nod+,nod+nod_cnt+,cmp);rp(i,,nod_cnt)if(nod[i].l1)printf("%d\n",st[nod[i].as]);
return ;
}
洛谷$P1527$ [国家集训队]矩阵乘法 整体二分的更多相关文章
- 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]
题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...
- P1527 [国家集训队]矩阵乘法 [整体二分]
权值排序,整体二分,没了. // by Isaunoya #include <bits/stdc++.h> using namespace std; #define rep(i, x, y ...
- Luogu1527 [国家集训队]矩阵乘法 (整体二分)(Unfinished)
全线RE的代码... 先搁这吧,下次再说.flag //#include <iostream> #include <cstdio> //#include <cstring ...
- [洛谷P1527] [国家集训队]矩阵乘法
洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...
- 洛谷 P1527 [国家集训队]矩阵乘法 解题报告
P1527 [国家集训队]矩阵乘法 题目描述 给你一个\(N*N\)的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第\(K\)小数. 输入输出格式 输入格式: 第一行两个数\(N,Q\),表示矩阵大 ...
- 【LG1527】[国家集训队]矩阵乘法
[LG1527][国家集训队]矩阵乘法 题面 洛谷 题解 我也不知道为什么取个这样的名字... 其实就是区间\(kth\)扩展到二维 还是用整体二分搞啦,把树状数组换成二维的 其他的基本没有什么差别 ...
- Luogu-1527 [国家集训队]矩阵乘法
Luogu-1527 [国家集训队]矩阵乘法 题面 Luogu-1527 题解 昨天学CDQ分治时做了一些题,但是因为题(wo)太(tai)水(lan)了(le)并没有整理 学了一晚上的整体二分,拿这 ...
- P1527 [国家集训队]矩阵乘法(整体二分)
Link 整体二分的经典例题. 对于整体二分,我个人的理解是二分答案套分治. 具体来说就是对答案进行二分,然后对于询问进行类似于权值线段树求区间第 \(k\) 大的分治做法. 首先,我们暴力做法就是对 ...
- P1527 [国家集训队]矩阵乘法
\(\color{#0066ff}{ 题目描述 }\) 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. \(\color{#0066ff}{输入格式}\) 第一行两个数N,Q ...
随机推荐
- js获取当前日期及获取当前日期的前一天日期函数
function getcurrentdate(){ //获取系统时间var LSTR_ndate=new Date();var LSTR_Year=LSTR_ndate.getFullYear(); ...
- 2019-8-31-dotnet-通过-WMI-拿到显卡信息
title author date CreateTime categories dotnet 通过 WMI 拿到显卡信息 lindexi 2019-08-31 16:55:58 +0800 2019- ...
- 4、安装supervisor
1.安装 sudo apt-get install supervisor 2.如果报phthond2.7错误,则执行 easy_install supervisor 3.配置文件位置和配置文件例子 配 ...
- EC round 33 D. Credit Card 贪心
因为到为0的点,充钱的范围都是不确定的,我们维护一个满足条件的最小值以及满足条件的最大值. 当min>d时,代表已经满足条件限制了 当a[ i ] = 0 并且 max<0,代表需要充钱, ...
- CODE FESTIVAL 2017 qual B C 3 Steps(补题)
总感觉这题是个题意杀,理解错题目了,看了好久才发现题目意思:操作是让,只要两点没有直接相连,而且只要有一条路的距离3,就可以把这两点连接起来. 按照题解中讲的,可以把图分为二分图和非二分图来解.不过题 ...
- centos6 名字服务dnsmasq配置
1 主机名配置 主机hd1配置(后面配置为名字服务器) [grid_hd@hd1 Desktop]$ cat /etc/sysconfig/network NETWORKING=yes HOSTNAM ...
- H3C 星型以太网拓扑扩展
- C# 判断两条直线距离
本文告诉大家获得两条一般式直线距离 一般式的意思就是 Ax+By+C=0" role="presentation">Ax+By+C=0Ax+By+C=0 如果有两个 ...
- Java 参数的值传递和引用传递
在Java中,方法的参数的传递分为值传递(基本数据)和引用传递(引用数据:对象.字符串),这是最容易接受的.如果你能知道有这两种情况存在,那么,在遇到调用方法时,你可以避免很多问题的产生.但是,仔细查 ...
- 扶桑号战列舰 (单调栈+线段树区间更新懒惰标记 or 栈)
传送门 •题目描述 题目描述 众所周知,一战过后,在世界列强建造超无畏级战列舰的竞争之中,旧日本海军根据“个舰优越主义”,建造了扶桑级战列舰,完工时为当时世界上武装最为强大的舰只. 同时,扶桑号战列舰 ...