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. Java分享笔记:FileOutputStream流的write方法

    /*------------------------ FileOutputStream: ....//输出流,字节流 ....//write(byte[] b)方法: 将b.length个字节从指定字 ...

  2. Mybatis基础进阶学习2

    Mybatis基础进阶学习2 1.测试基本结构 2.三个POJO package com.pojo; import java.io.Serializable; import java.util.Dat ...

  3. Xtrabackup实现MySQL备份

    一.xtrabackup介绍 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写)它由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上 ...

  4. LNMP+HAProxy+Keepalived负载均衡 - LNMP基础环境准备

    环境版本说明: 服务器系统:CentOS 7.5: ``` cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) # 输出结果 `` ...

  5. (转)想从事游戏开发,1 年内能精通 C++ 吗,还需要学习什么?

    本人大约从20多年前开始学习及使用C++,但仍未达到我认为「精通」的阶段,甚至对于C++11的各种新特性也未掌握.然而因为我是在读书时自学C++的,也是游戏程序员(原问题中提到题主想从事游戏开发),觉 ...

  6. Nginx 配置继承模型

    要了解nginx的继承模型,首先需要知道nginx使用多个配置块进行操作.在nginx中,这样的块被称为上下文,例如,放置在服务器上下文中的配置指令驻留在server { }块中,就像放置在http上 ...

  7. python中函数的不定长参数

    例1: #定义一个含有不定长参数的函数,本例第三个参数*args def sum_nums(a,b,*args): print('_'*30) print(a) print(b) print(args ...

  8. keil5的安装及问题

    win8+keil 注意,在进行破解的时候首先要打开一个工程,而且keil要用管理员的身份进行运行, 才可以破解完成 发现打开之后,出现这样的错误. 原因是因为在创建工程的时候在下图中点了是,要点否才 ...

  9. 裸机——DDR

    1.DDR介绍 DDR,是SDRAM的改进,是双通道的SDRAM, SDRAM是同步动态随机访问存储器. SDRAM与SRAM相对于,二者的特点是: SDRAM 需要初始化,使用时许访问,价格便宜. ...

  10. POJ:1064-Cable master

    Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 58613 Accepted: 12231 Descri ...