当前位置: 首页 > news >正文

[luogu P1527]矩阵乘法(矩形k小)

传送门

Description

给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数。

Solution

整体二分

练习一波。。。

就是一堆询问放在一起二分

另外的,第一次发现原来矩形求和是可以用二维树状数组来维护的

果然是pac太菜了

class BIT
{
    #define NM 505
    #define lb(x) (x&(-x))
    private:
        int t[NM][NM],N,M;
        BIT() {}
    public:
        BIT(int _N=0,int _M=0):N(_N),M(_M){memset(t,0,sizeof t);}
        inline void C(int x,int y,int v)
        {
            register int i,j;
            for(i=x;i<=N;i+=lb(i))for(j=y;j<=M;j+=lb(j)) t[i][j]+=v;
        }
        inline int G(int x,int y)
        {
            register int i,j,ret=0;
            for(i=x;i;i-=lb(i))for(j=y;j;j-=lb(j)) ret+=t[i][j];
            return ret;
        }
        inline int GM(int x,int y,int a,int b){return G(a,b)-G(x-1,b)-G(a,y-1)+G(x-1,y-1);}
};


Code 

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x*f;
}
#define MN 60002
#define MS 250005
int N,Q,Ans[MN];
struct ques{int x1,y1,x2,y2,k,id;}q[MN],b[MN];
struct nums{
    int x,y,val;
    bool operator <(const nums &o) const{return val<o.val;}
}s[MS];
class BIT
{
    #define NM 505
    #define lb(x) (x&(-x))
    private:
        int t[NM][NM],N,M;
        BIT() {}
    public:
        BIT(int _N=0,int _M=0):N(_N),M(_M){memset(t,0,sizeof t);}
        inline void C(int x,int y,int v)
        {
            register int i,j;
            for(i=x;i<=N;i+=lb(i))for(j=y;j<=M;j+=lb(j)) t[i][j]+=v;
        }
        inline int G(int x,int y)
        {
            register int i,j,ret=0;
            for(i=x;i;i-=lb(i))for(j=y;j;j-=lb(j)) ret+=t[i][j];
            return ret;
        }
        inline int GM(int x,int y,int a,int b){return G(a,b)-G(x-1,b)-G(a,y-1)+G(x-1,y-1);}
};
void solve(int l=1,int r=N*N,int ql=1,int qr=Q)
{
    static BIT T(N,N);
    register int i;
    if(ql>qr) return;
    if(l==r)
    {
        for(i=ql;i<=qr;++i) Ans[q[i].id]=l;
        return;
    }
    register int mid=(l+r)>>1,tmpl=ql,tmpr=qr,gm;
    for(i=l;i<=mid;++i) T.C(s[i].x,s[i].y,1);
    for(i=ql;i<=qr;++i) (gm=T.GM(q[i].x1,q[i].y1,q[i].x2,q[i].y2))>=q[i].k?b[tmpl++]=q[i]:(q[i].k-=gm,b[tmpr--]=q[i]);
    for(i=ql;i<=qr;++i) q[i]=b[i];
    for(i=l;i<=mid;++i) T.C(s[i].x,s[i].y,-1);
    solve(l,mid,ql,tmpl-1);solve(mid+1,r,tmpr+1,qr);
}
int main()
{
    N=read();Q=read();
    register int i,j;
    for(i=1;i<=N;++i)for(j=1;j<=N;++j) s[(i-1)*N+j]=(nums){i,j,read()};
    for(i=1;i<=Q;++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;
    std::sort(s+1,s+N*N+1);
    solve();
    for(i=1;i<=Q;++i) printf("%d\n",s[Ans[i]].val);
    return 0;
}



Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10170947.html

相关文章:

  • Node单线程高并发原理
  • 支付宝简单使用
  • docker pull 详解
  • 解决-bash: /usr/bin/yum: /usr/bin/python2.7.15: 坏的解释
  • egg(89)--egg之redis的发布和订阅
  • Apache Zeppelin在Apache Trafodion上的可视化
  • 图标设计的意思是什么?资深UI设计师告诉你图标的含义!
  • 使用 flutter 的ListView实现滚动列表
  • 脚本处理iOS的Crash日志
  • 大家都在用HTTP/2了,而你还没听说过?
  • ➹使用webpack配置多页面应用(MPA)
  • Linux服务器配置---ntp
  • 基于NetCore C#的在线代码生成器
  • CSS3 动画卡顿解决方案
  • ywy_c_asm题
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • SQLServer之创建显式事务
  • 闭包--闭包之tab栏切换(四)
  • 编写符合Python风格的对象
  • 翻译:Hystrix - How To Use
  • 分类模型——Logistics Regression
  • 工作手记之html2canvas使用概述
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 使用Swoole加速Laravel(正式环境中)
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • Nginx实现动静分离
  • # 安徽锐锋科技IDMS系统简介
  • $L^p$ 调和函数恒为零
  • (pojstep1.3.1)1017(构造法模拟)
  • (层次遍历)104. 二叉树的最大深度
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (分布式缓存)Redis分片集群
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (转)大型网站架构演变和知识体系
  • .Family_物联网
  • .NET delegate 委托 、 Event 事件
  • .Net中的集合
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [Android]竖直滑动选择器WheelView的实现
  • [Assignment] C++1
  • [C#][DevPress]事件委托的使用
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [hive] 窗口函数 ROW_NUMBER()
  • [IE编程] IE中使网页元素进入编辑模式
  • [Java] 图说 注解
  • [Java性能剖析]Sun JDK基本性能剖析工具介绍
  • [js] 正则表达式
  • [NSSCTF]-Web:[SWPUCTF 2021 新生赛]easyrce解析
  • [Python从零到壹] 五十三.图像增强及运算篇之直方图均衡化处理
  • [swust1745] 餐巾计划问题(费用流)
  • [Web 开发] 获取页面元素的坐标及大小
  • [创业之路-100] :结构工程师的角色划分与结构设计的流程