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 ...
随机推荐
- 懒下载软件,一行代码连接wifi^_^
按键盘的windows+R,输入cmd,回车键 设置语句netsh wlan set hostednetwork mode=allow ssid=user key=possword 按回车键 启动语句 ...
- JS - 给数组的原型添加去掉重复元素的distinct方法
/* 调用完该方法,原数组只留下非重复的数据 返回一个数组,里面是依次出现的重复元素 */Array.prototype.distinct = function () { var removeA ...
- JavaScript---ECMA对象
1.对象的概念及分类 1.1 ECMAScript中没有类,但定义了“对象”,逻辑上等价于其他程序设计语言中的类. var o = new Object(); 1.2 本地对象(native obje ...
- 微信小程序CheckBox选中事件
1.微信小程CheckBox选中问题 <checkbox-group bindchange="checkboxChange" data-index="{{index ...
- GCJ:2008 Round1AA-Minimum Scalar Product(有序数组倒序乘积和最小)
题目链接:https://code.google.com/codejam/contest/32016/dashboard#s=p0 Minimum Scalar Product This contes ...
- WRITE命令 書式設定オプション
書式設定オプション WRITE 命令では.さまざまな書式設定オプションが使用することができます. 構文 WRITE ....f option. 全データ型の書式設定オプション オプション 機能 LEF ...
- ASP.NET 使用 MySQL
基本是通用的 C#与MySQL的交互, 先添加MySQL.Data.dll(位于MySQL安装目录下的Connector NET 8.0\Assemblies${version}目录下)引用, 之后代 ...
- WPF系列教程——(一)仿TIM QQ界面 - 简书
原文:WPF系列教程--(一)仿TIM QQ界面 - 简书 TIM QQ 我们先来看一下TIM QQ长什么样,整体可以将界面分为三个部分 TIM QQ 1. 准备 阅读本文假设你已经有XAML布局的基 ...
- P1336 最佳课题选择
P1336 最佳课题选择 题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课题数有限,Matrix67不得不重复选择一些课题.完成不同课题的论文所花的时间不同 ...
- Android Stadio 相关
这几天,电脑坏了.重装系统,慢慢的学到了很多Android stadio 的相关知识.总结一下吧: 1.gradle 编译工具:在工程的gradle/wrapper/gradle–wrapper.pr ...