Luogu1527 [国家集训队]矩阵乘法 (整体二分)(Unfinished)
全线RE的代码。。。 先搁这吧,下次再说.flag
//#include <iostream>
#include <cstdio>
//#include <cstring>
#include <algorithm>
//#include <cmath>
#define R(a,b,c) for(register int a = (b); a <= (c); ++ a)
#define nR(a,b,c) for(register int a = (b); a >= (c); -- a)
#define Max(a,b) ((a) > (b) ? (a) : (b))
#define Min(a,b) ((a) < (b) ? (a) : (b))
#define Fill(a,b) memset(a, b, sizeof(a))
#define Swap(a,b) a^=b^=a^=b
#define ll long long
//#define ON_DEBUG
#ifdef ON_DEBUG
#define D_e_Line printf("\n\n----------\n\n")
#define D_e(x) cout << #x << " = " << x << endl
#define Pause() system("pause")
#else
#define D_e_Line ;
#endif
struct ios{
template<typename ATP>ios& operator >> (ATP &x){
x = 0; int f = 1; char c;
for(c = getchar(); c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
while(c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c = getchar();
x*= f;
return *this;
}
}io;
using namespace std;
const int N = 507;
const int M = 60007;
int n;
struct Matrix{
int x, y, val;
bool operator < (const Matrix &com) const{
return val < com.val;
}
}mp[N*N];
int cnt;
struct Questions{
int xx1, yy1, xx2, yy2, K;
}q[M];
int t[N][N];
inline void Updata(int x, int y, int val){
for(register int i = x; i <= n; i += i&-i)
for(register int j = y; j <= n; j += j&-j)
t[i][j] += val;
}
inline int Query(int x, int y){
int s = 0;
for(register int i = x; i; i -= i&-i)
for(register int j = y; j; j -= j&-j)
s += t[i][j];
return s;
}
// I don't know what happend below
//inline void Updata(int x, int y, int val){
// for(; x <= n; x += x&-x)
// for(; y <= n; y += y&-y)
// t[x][y] += val;
//}
//inline int Query(int x, int y){
// int s = 0;
// for(; x; x -= x&-x)
// for(; y; y -= y&-y)
// s += t[x][y];
// return s;
//}
inline int Calc(int xx1, int yy1, int xx2, int yy2){
return Query(xx2, yy2)-Query(xx2, yy1-1)-Query(xx1-1, yy2)+Query(xx1-1, yy1-1);
}
int id[N],siz[N],ans[N];
int tmp[N], tmp1[N], tmp2[N];
inline void Dictomy(int l, int r, int L, int R){
if(L > R) return;
if(l == r){
R(i,L,R)
ans[id[i]] = mp[l].val;
return;
}
int mid = (l + r) >> 1, cnt1 = 0, cnt2 = 0;
R(i,l,mid) Updata(mp[i].x, mp[i].y, 1);
R(i,L,R){
int sum = Calc(q[id[i]].xx1, q[id[i]].yy1, q[id[i]].xx2, q[id[i]].yy2);
if(siz[id[i]]+sum >= q[id[i]].K){
tmp1[++cnt1] = id[i];
}
else{
siz[id[i]] += sum;
tmp2[++cnt2] = id[i];
}
}
R(i,l,mid) Updata(mp[i].x, mp[i].y, -1);
int qCnt = L-1;
R(i,1,cnt1){
tmp[++qCnt] = tmp1[i];
id[qCnt] = tmp[qCnt];
}
R(i,1,cnt2){
tmp[++qCnt] = tmp2[i];
id[qCnt] = tmp[qCnt];
}
Dictomy(l, mid, L, L + cnt1 - 1);
Dictomy(mid + 1, r, L + cnt1, R);
}
//#define FileInTheHole
int main(){
//#ifdef FileInTheHole
// D_e_Line;
// freopen("in.txt", "r", stdin);
//#endif
int Que;
io >> n >> Que;
R(i,1,n){
R(j,1,n){
int x;
io >> x;
mp[++cnt] = (Matrix){i, j, x};
}
}
sort(mp + 1, mp + cnt + 1);
R(i,1,Que){
io >> q[i].xx1 >> q[i].yy1 >> q[i].xx2 >> q[i].yy2 >> q[i].K;
id[i] = i;
}
Dictomy(1, cnt, 1, Que);
R(i,1,Que)
printf("%d\n", ans[i]);
return 0;
}
Luogu1527 [国家集训队]矩阵乘法 (整体二分)(Unfinished)的更多相关文章
- 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]
题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...
- 洛谷$P1527$ [国家集训队]矩阵乘法 整体二分
正解:整体二分 解题报告: 传送门$QwQ$ 阿看到这种查询若干次第$k$小显然就想到整体二分$QwQ$? 然后现在就只要考虑怎么快速求出一个矩形内所有小于某个数的数的个数? 开始我的想法是离散化然后 ...
- P1527 [国家集训队]矩阵乘法 [整体二分]
权值排序,整体二分,没了. // by Isaunoya #include <bits/stdc++.h> using namespace std; #define rep(i, x, y ...
- Luogu-1527 [国家集训队]矩阵乘法
Luogu-1527 [国家集训队]矩阵乘法 题面 Luogu-1527 题解 昨天学CDQ分治时做了一些题,但是因为题(wo)太(tai)水(lan)了(le)并没有整理 学了一晚上的整体二分,拿这 ...
- [Luogu1527][国家集训队]矩阵乘法
luogu 题意 给你一个\(N*N\)的矩阵,每次询问一个子矩形的第K小数.(居然连修改都不带的) \(N\le500,Q\le60000\) sol 整体二分+二维树状数组裸题. 复杂度是\(O( ...
- 【LG1527】[国家集训队]矩阵乘法
[LG1527][国家集训队]矩阵乘法 题面 洛谷 题解 我也不知道为什么取个这样的名字... 其实就是区间\(kth\)扩展到二维 还是用整体二分搞啦,把树状数组换成二维的 其他的基本没有什么差别 ...
- 洛谷 P1527 [国家集训队]矩阵乘法 解题报告
P1527 [国家集训队]矩阵乘法 题目描述 给你一个\(N*N\)的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第\(K\)小数. 输入输出格式 输入格式: 第一行两个数\(N,Q\),表示矩阵大 ...
- [洛谷P1527] [国家集训队]矩阵乘法
洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...
- P1527 [国家集训队]矩阵乘法(整体二分)
Link 整体二分的经典例题. 对于整体二分,我个人的理解是二分答案套分治. 具体来说就是对答案进行二分,然后对于询问进行类似于权值线段树求区间第 \(k\) 大的分治做法. 首先,我们暴力做法就是对 ...
随机推荐
- Redis快速度特性及为什么支持多线程及应用场景
转载请注明出处: 目录 1.Redis 访问速度快特性 2.Redis 6.0 为什么支持多线程? 3.Redis可以做什么 3.1.缓存 3.2.排行榜系统 3.3.计数器应用 3.4.社交网络 3 ...
- git bisect:让你闭眼都能定位疑难 bug的利器
摘要:git bisect命令使用二分搜索算法来查找提交历史中的哪一次提交引入了错误.它几乎能让你闭着眼睛快速定位任何源码导致的问题,非常实用. 本文分享自华为云社区<利用好 git bisec ...
- python+selenium 自动化测试——显式等待详解
1.前言 之前有提到过等待函数,等待函数分为:强制等待(sleep).隐式等待(implicitly_wait),显示等待(WebDriverWait),这次以显示等待方式专门做一次总结,因为我个人是 ...
- 解决python 导入selenium 库后自动化运行成功但是报错问题
本章节开始进入自动化的基础教学了,首先我们要对我们的工具有一定的熟练使用程度,做自动化常用的工具一个是搭建 RobotFramework自动化框架,另外一个便是我们最常用的python 工作原理是比较 ...
- 聊聊 C++ 和 C# 中的 lambda 玩法
这几天在看 C++ 的 lambda 表达式,挺有意思,这个标准是在 C11标准 加进去的,也就是 2011 年,相比 C# 2007 还晚了个 4 年, Lambda 这东西非常好用,会上瘾,今天我 ...
- 有关安装pycocotools的办法
1,首先需要安装Visual C++ 2015构建工具,地址https://download.microsoft.com/download/5/f/7/5f7acaeb-8363-451f-9425- ...
- 【Redis】Redis Cluster-集群故障转移
集群故障转移 节点下线 在集群定时任务clusterCron中,会遍历集群中的节点,对每个节点进行检查,判断节点是否下线.与节点下线相关的状态有两个,分别为CLUSTER_NODE_PFAIL和CLU ...
- MVVM,MVC,MVP的区别
MVC.MVP 和 MVVM 是三种常见的软件架构设计模式,主要通过分离关注点的方式来组织代码结构,优化开发效率. 在开发单页面应用时,往往一个路由页面对应了一个脚本文件,所有的页面逻辑都在一个脚本文 ...
- 关于 k 进制线性基
本质还是高斯消元,使其成为上三角矩阵.但是 \(k\) 不一定是质数. 但我们不需要保证已有数字不改变,只要维护的是一个上三角矩阵就行.所以我们可以利用更相减损让其中一个向量的最高位 \(= 0\) ...
- WPF双滑块控件以及强制捕获鼠标事件焦点
效果 概述 最近有个小需求要用双滑块表示一个取值范围,于是就简单做了个用户控件,在此记录下. 使用矩形Rectangle表示范围,椭圆Ellipse表示滑块,使用Canvas控制滑块的左右移动. 椭圆 ...
