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小的更多相关文章

  1. 【模板】区间第k小

    [模板]区间第k小 我实在是太弱了现在才会这个东西QAQ. 主席树做法. 一张关于主席树的无字说明 线段树\(2\)是只单点修改了实心酒红色点的线段树\(2\),线段树\(2\)中的蓝色节点实际上就是 ...

  2. 【XSY2720】区间第k小 整体二分 可持久化线段树

    题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...

  3. Dynamic Rankings || 动态/静态区间第k小(主席树)

    JYF大佬说,一星期要写很多篇博客才会有人看 但是我做题没有那么快啊QwQ Part1 写在前面 区间第K小问题一直是主席树经典题=w=今天的重点是动态区间第K小问题.静态问题要求查询一个区间内的第k ...

  4. POJ2104 区间第k小

    题意就是区间第k大…… 题解: 前段时间用主席树搞掉了…… 如今看到划分树,是在想来写一遍,结果18号对着学长的代码调了一上午连样例都没过,好桑心…… 今天在做NOI2010超级钢琴,忽然发现用划分树 ...

  5. 主席树总结(经典区间第k小问题)(主席树,线段树)

    接着上一篇总结--可持久化线段树来整理吧.点击进入 这两种数据结构确实有异曲同工之妙.结构是很相似的,但维护的主要内容并不相同,主席树的离散化.前缀和等思想也要更难理解一些. 闲话 话说刚学习主席树的 ...

  6. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

  7. A - 低阶入门膜法 - K-th Number (主席树查询区间第k小)

    题目链接:https://cn.vjudge.net/contest/284294#problem/A 题目大意:主席树查询区间第k小. 具体思路:主席树入门. AC代码: #include<i ...

  8. HDU 2665.Kth number 区间第K小

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. POJ 2014.K-th Number 区间第k小 (归并树)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 57543   Accepted: 19893 Ca ...

随机推荐

  1. WebSeal单点登陆

    WebSeal单点登陆 作为学习整理,部分内容来自网络和官方文档. LDAP LDAP可以看作一种数据库,分为客户端和服务端.服务端是用来存放资源,客户端用来操作资源.它是一种树形存储结构,遍历起来会 ...

  2. MySQL工作经验

    以下是根据工作中遇到各种场景用到的一些Mysql用法,比较实用,基本是语法之外的一些东西. 修改账户密码 1.打开Mysql控制台,输入原密码: 2.输入以下语法:mysql> set pass ...

  3. MySQL - Mac下安装MySQL

    1. 去官网下载dmg的安装文件. 2. 下载完成后,运行安装文件,按步骤进行安装,安装完成后会弹出一个框显示临时密码! 3. 编辑~/.bashrc文件,配置快速启动/停止/重启/cdhome/别名 ...

  4. 并排打印多个图案(C++实现)

    在练习循环控制语句时,经常会遇到一类问题:使用循环控制打印星号(*)来形成各种各样的图案,并强调所有的星号(*)都要用单条的输出语句cout<<"*";来打印. 例如打 ...

  5. hive连接MySQL报错

    错误如下: [root@awen01 /usr/local/apache-hive-1.2.1-bin]#./bin/hive Logging initialized using configurat ...

  6. 如何删除hive表格的分区

    今天的一个业务场景就是要把三年的数据从第一天不停的融合起来,每一天作为表格一个新的分区.由于空间有限,数据量很大,可能每天数据都是几十个G的大小.所以我需要做的一点就是在融合这一天之后,删除一天的分区 ...

  7. 笔记-python-元类metaclass

    笔记-python-元类metaclass 1.      元类 1.1.    类也是对象 class Person(object): pass 上面的代码会在内存中创建一个类,它也是对象, 可以将 ...

  8. leetcode 【 Remove Nth Node From End of List 】 python 实现

    题目: Given a linked list, remove the nth node from the end of list and return its head. For example, ...

  9. Java EE - JSP 小结

    Table of Contents 前言 JSP 与 Servlet JSP 初始化参数 脚本元素 page 指令 禁用脚本元素 EL 表达式 EL 函数 taglib 指令 标记 TLD 文件的位置 ...

  10. WPF调用摄像头

    添加程序集:WPFMediaKit.dll 更关键代码如下: 界面设计代码如下: <Window x:Class="摄像头调用.MainWindow" xmlns=" ...