【LG1527】[国家集训队]矩阵乘法
【LG1527】[国家集训队]矩阵乘法
题面
题解
我也不知道为什么取个这样的名字。。。
其实就是区间\(kth\)扩展到二维
还是用整体二分搞啦,把树状数组换成二维的
其他的基本没有什么差别
复杂度\(nlog^3\)
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
namespace IO {
const int BUFSIZE = 1 << 20;
char ibuf[BUFSIZE], *is = ibuf, *it = ibuf;
inline char gc() {
if (is == it) it = (is = ibuf) + fread(ibuf, 1, BUFSIZE, stdin);
return *is++;
}
}
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (ch != '-' && (ch > '9' || ch < '0')) ch = IO::gc();
if (ch == '-') w = -1 , ch = IO::gc();
while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = IO::gc();
return w * data;
}
const int SIZE = 400005, MAX_N = 505;
struct Query { int op, x, y, _x, _y, k; } q[SIZE], rq[SIZE], lq[SIZE];
void Output(int x) {
printf("%d %d %d %d %d %d\n", q[x].op, q[x].x, q[x].y, q[x]._x, q[x]._y, q[x].k);
}
int N, M, ans[SIZE];
int c[MAX_N][MAX_N];
inline int lb(int x) { return x & -x; }
void add(int x, int y, int v) {
for (int i = x; i <= N; i += lb(i))
for (int j = y; j <= N; j += lb(j))
c[i][j] += v;
}
int sum(int x, int y) {
int res = 0;
for (int i = x; i > 0; i -= lb(i))
for (int j = y; j > 0; j -= lb(j))
res += c[i][j];
return res;
}
void Div (int lval, int rval, int st, int ed) {
if (st > ed) return ;
if (lval == rval) {
for (int i = st; i <= ed; i++) if (q[i].op != 0) ans[q[i].op] = lval;
return ;
}
int mid = (lval + rval) >> 1;
int lt = 0, rt = 0;
for (int i = st; i <= ed; i++) {
int x = q[i].x, y = q[i].y;
if (q[i].op == 0) {
if (q[i].k <= mid) lq[++lt] = q[i], add(x, y, 1);
else rq[++rt] = q[i];
} else {
int _x = q[i]._x, _y = q[i]._y;
int res = sum(_x, _y) - sum(x - 1, _y) - sum(_x, y - 1) + sum(x - 1, y - 1);
if (q[i].k <= res) lq[++lt] = q[i];
else q[i].k -= res, rq[++rt] = q[i];
}
}
for (int i = st; i <= ed; i++) if (q[i].op == 0 && q[i].k <= mid) add(q[i].x, q[i].y, -1);
for (int i = 1; i <= lt; i++) q[st + i - 1] = lq[i];
for (int i = 1; i <= rt; i++) q[st + lt + i - 1] = rq[i];
Div(lval, mid, st, st + lt - 1);
Div(mid + 1, rval, st + lt, ed);
}
int main () {
N = gi(), M = gi();
int cnt = 0;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
q[++cnt] = (Query){0, i, j, 0, 0, gi()};
for (int i = 1; i <= M; i++) q[++cnt] = (Query){i, gi(), gi(), gi(), gi(), gi()};
Div(1, 1e9, 1, cnt);
for (int i = 1; i <= M; i++) printf("%d\n", ans[i]);
return 0;
}
【LG1527】[国家集训队]矩阵乘法的更多相关文章
- 洛谷 P1527 [国家集训队]矩阵乘法 解题报告
P1527 [国家集训队]矩阵乘法 题目描述 给你一个\(N*N\)的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第\(K\)小数. 输入输出格式 输入格式: 第一行两个数\(N,Q\),表示矩阵大 ...
- [洛谷P1527] [国家集训队]矩阵乘法
洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...
- Luogu-1527 [国家集训队]矩阵乘法
Luogu-1527 [国家集训队]矩阵乘法 题面 Luogu-1527 题解 昨天学CDQ分治时做了一些题,但是因为题(wo)太(tai)水(lan)了(le)并没有整理 学了一晚上的整体二分,拿这 ...
- 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]
题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...
- P1527 [国家集训队]矩阵乘法
\(\color{#0066ff}{ 题目描述 }\) 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. \(\color{#0066ff}{输入格式}\) 第一行两个数N,Q ...
- [Luogu1527][国家集训队]矩阵乘法
luogu 题意 给你一个\(N*N\)的矩阵,每次询问一个子矩形的第K小数.(居然连修改都不带的) \(N\le500,Q\le60000\) sol 整体二分+二维树状数组裸题. 复杂度是\(O( ...
- 洛谷$P1527$ [国家集训队]矩阵乘法 整体二分
正解:整体二分 解题报告: 传送门$QwQ$ 阿看到这种查询若干次第$k$小显然就想到整体二分$QwQ$? 然后现在就只要考虑怎么快速求出一个矩形内所有小于某个数的数的个数? 开始我的想法是离散化然后 ...
- P1527 [国家集训队]矩阵乘法 [整体二分]
权值排序,整体二分,没了. // by Isaunoya #include <bits/stdc++.h> using namespace std; #define rep(i, x, y ...
- P1527 [国家集训队]矩阵乘法(整体二分)
Link 整体二分的经典例题. 对于整体二分,我个人的理解是二分答案套分治. 具体来说就是对答案进行二分,然后对于询问进行类似于权值线段树求区间第 \(k\) 大的分治做法. 首先,我们暴力做法就是对 ...
随机推荐
- Linux学习总结(十六)系统用户及用户组管理
先来认识两个文件 /etc/passwd/etc/shadow我们打印出首尾三行,来了解下:每行由:分割为7段,每段含义为:第一段:用户名,比如root 用户,普通用户test,lv,test1第二段 ...
- mapper.xml中动态sql抽取重复项
mabatis重点是通过标签对sql灵活的组织,通过配置的方式完成输入 输出映射. 1.对mapper.xml中重复的sql抽取统一维护,以及foreach使用 UserMapperCustom.xm ...
- npm run build 打包后,如何运行在本地查看效果
目前,使用vue-cli脚手架写了一个前端项目,之前一直是使用npm run dev 在8080端口上进行本地调试.项目已经进行一半了,今天有时间突然想使用npm run build进行上线打包,试试 ...
- springboot之静态资源路径配置
静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取. 在Springboot中默认的静态资源路径有:classpath:/META-INF/resources/,classp ...
- TCP-IP and Advanced Topics 课程总结与报告
课程总结 学习了四周十六课的课程,对每一课的知识点进行总结梳理,作出一个树状的知识网络图. 本课程虽然在深度上有所欠缺,但却更有利于结构上的梳理,加深总体上对网络的理解. 本课程从Internet出发 ...
- File常见操作函数
String Name = File.getName(); //获得文件或文件夹的名称: String parentPath = File.getParent(); //获得文件或文件夹的父目录 ...
- Flex 布局教程:语法和实例
语法篇 网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便, ...
- JS中的“==”与强制类型转换
JavaScript中有“==”与“===”,那么他们有何区别呢? 对于基本数据类型, === (!==)只有当两个变量的类型和值都相等时,才返回true:而 == (!=)则会对变量进行强制类型转 ...
- Java之环境变量配置
1.首先安装Java的JDK(Java开发工具包 包含JRE(Java运行环境))下载地址URL:www.oracle.com (64位或32位) 安装:傻瓜式安装(点击下一步即可)中间可更改安装目录 ...
- Spring Boot 微信-验证服务器有效性【转】
转:https://blog.csdn.net/jeikerxiao/article/details/68064145 概述 接入微信公众平台开发,开发者需要按照如下步骤完成: 在自己服务器上,开发验 ...