The UVALIVE 7716 二维区间第k小
The UVALIVE 7716 二维区间第k小
/**
题意:给一个n * n的矩阵,有q个查询
每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素
n <= 250 ,q <= 250000 , a[i][j]<=10000
思路:用到了主席树求区间第k小,
主席树本质是可持久化权值线段树,用区间[l,r]表示值在[l,r]间的数字有多少个
每插入一个数字,实际上只修改了log个区间,其他的部分不发生变化,所以只需要对修改的区间新开结点即可
求区间第k小,其实就是二分区间[l,r],m = l + r>>1
如果权值[l,m]的数字个数少于k,那么答案就在[m+1,r]这个区间内
否则就在[l,m]内,然后递归处理即可
开始的做法是用以root[i][j]为根的树表示[1,1]到[i,j]的矩阵的信息,这样查询的复杂度为log(maxn)
由于合并的复杂度不太科学,爆内存了
然后改成以root[i][j]为根的树表示[i,1]到[i,j]区间的信息,空间复杂度为O(N * N * logN)
然后我查询r,c,s,k的时候
就把r行,r+1行,...r+s-1行的这些[c,c+s-1]区间一起操作,这样查询一次的复杂度为s * log(maxn)
*/
#include<bits/stdc++.h>
#define ls(i) seg[i].lc
#define rs(i) seg[i].rc
using namespace std;
typedef long long LL;
const int maxn = 1e4;
const int N = 280;
int n,q,rr,cc,ss,k;
int b[N][2];
struct node{
int lc,rc,cnt;
}seg[N * N * 100];
int tot;
int root[N][N];
void update(int &rt,int l,int r,int pos,int val){
seg[++tot] = seg[rt];
rt = tot;
seg[rt].cnt += val;
if(l >= r) return ;
int m = (l + r)>>1;
if(pos <= m) update(ls(rt),l,m,pos,val);
else update(rs(rt),m+1,r,pos,val);
}
int query(int l,int r,int k){
if(l == r) return l;
int m = (l + r)>>1;
int cnt = 0;
for(int i = 0;i < ss;i++) cnt += seg[ls(b[i][0])].cnt - seg[ls(b[i][1])].cnt;
if(cnt < k) {
for(int i = 0;i < ss;i++){
b[i][0] = rs(b[i][0]);
b[i][1] = rs(b[i][1]);
}
return query(m+1,r,k - cnt);
}
for(int i = 0;i < ss;i++){
b[i][0] = ls(b[i][0]);
b[i][1] = ls(b[i][1]);
}
return query(l,m,k);
}
int solve(){
for(int i = 0;i < ss;i++){
b[i][0] = root[rr + i][cc + ss - 1];
b[i][1] = root[rr + i][cc - 1];
}
return query(1,maxn,k);
}
int main()
{
while(scanf("%d",&n)==1){
tot = 0;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
int x;
scanf("%d",&x);
root[i][j] = root[i][j-1];
update(root[i][j],1,maxn,x,1);
}
}
scanf("%d",&q);
while(q--){
scanf("%d%d%d%d",&rr,&cc,&ss,&k);
ss = min(ss,min(n - rr + 1,n - cc + 1));
k = min(k , ss * ss);
printf("%d\n",solve());
}
}
return 0;
}
The UVALIVE 7716 二维区间第k小的更多相关文章
- 【模板】区间第k小
[模板]区间第k小 我实在是太弱了现在才会这个东西QAQ. 主席树做法. 一张关于主席树的无字说明 线段树\(2\)是只单点修改了实心酒红色点的线段树\(2\),线段树\(2\)中的蓝色节点实际上就是 ...
- 【XSY2720】区间第k小 整体二分 可持久化线段树
题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...
- Dynamic Rankings || 动态/静态区间第k小(主席树)
JYF大佬说,一星期要写很多篇博客才会有人看 但是我做题没有那么快啊QwQ Part1 写在前面 区间第K小问题一直是主席树经典题=w=今天的重点是动态区间第K小问题.静态问题要求查询一个区间内的第k ...
- POJ2104 区间第k小
题意就是区间第k大…… 题解: 前段时间用主席树搞掉了…… 如今看到划分树,是在想来写一遍,结果18号对着学长的代码调了一上午连样例都没过,好桑心…… 今天在做NOI2010超级钢琴,忽然发现用划分树 ...
- 主席树总结(经典区间第k小问题)(主席树,线段树)
接着上一篇总结--可持久化线段树来整理吧.点击进入 这两种数据结构确实有异曲同工之妙.结构是很相似的,但维护的主要内容并不相同,主席树的离散化.前缀和等思想也要更难理解一些. 闲话 话说刚学习主席树的 ...
- ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...
- A - 低阶入门膜法 - K-th Number (主席树查询区间第k小)
题目链接:https://cn.vjudge.net/contest/284294#problem/A 题目大意:主席树查询区间第k小. 具体思路:主席树入门. AC代码: #include<i ...
- HDU 2665.Kth number 区间第K小
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- POJ 2014.K-th Number 区间第k小 (归并树)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 57543 Accepted: 19893 Ca ...
随机推荐
- REST Adapter实现SAP PI中的增强XML/JSON格式转换(转载)
SAP标准的REST adapter有着XML/JSON转换的功能,它很有用,因为一方面SAP PI/PO内部以XML格式处理数据,而另一方面,在处理REST架构风格的时候,JSON才是事实上的格式. ...
- JAVAOOP多态
概念:不同对象对于同一个操作做出的相应不同 实现方法:父类:抽象类 抽象方法 子类:普通类 重写抽象方法 同名 父类:普通类 普通方法 子类:普通类 普通方法 同名 父类:接口 抽象方法 实现类:普通 ...
- 第一次认识lambda匿名函数
lambda 为了解决一些简单的需求而设计的"一句话"函数 语法 lambda 参数:返回值 1.可以多个参数,参数间用逗号隔开 2.匿名函数不管多复杂,只能写一行 3.返回值和正 ...
- 1016-06-首页20-封装工具条-有控件在viewDidLoad的时候距离顶部是0--到了viewWillAppear或viewDidAppear系统就加了64
- opencv中对图像的像素操作
1.对灰度图像的像素操作: #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using ...
- Spark 源码阅读——任务提交过程
当我们在使用spark编写mr作业是,最后都要涉及到调用reduce,foreach或者是count这类action来触发作业的提交,所以,当我们查看这些方法的源码时,发现底层都调用了SparkCon ...
- 11.2,nginx负载均衡实验
Nginx负载均衡概述 Web服务器,直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台WEB服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中,实现 ...
- Android Studio自定义模板代码
http://blog.csdn.net/h183288132/article/details/51916399 生成模板看上面这个博客就可以了,不再重复制造轮子. 不过需要补充的是: 还应该有下面的 ...
- Div处理滚动条问题
1,用div做容器现在已经十分普遍,下面是最基本的代码 <div style="width:50px;height:50px;background-color:blue"&g ...
- spring boot 入门1-----如何使用@Value注解读取配置文件以及使用@ConfigrationProperties注解
读取.yml文件属性值的方式 1)如何将配置文件中的属性值与字段匹配起来 @Value("${配置文件中属性的名}") 在application.yml文件中 server: po ...