题目链接

BZOJ2738

题解

将矩阵中的位置取出来按权值排序

直接整体二分 + 二维BIT即可

#include<algorithm>
#include<iostream>
#include<cstdio>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define lbt(x) (x & -x)
using namespace std;
const int maxn = 300005,maxm = 100005,INF = 0x3f3f3f3f;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
return flag ? out : -out;
}
struct node{int x,y,v;}e[maxn];
struct Que{int x1,y1,x2,y2,k,id;}q[maxn],t[maxn];
int b[maxn],bi,N,Q,n,tot,ans[maxn],s[505][505];
void add(int x,int y,int v){
for (int i = x; i <= n; i += lbt(i))
for (int j = y; j <= n; j += lbt(j))
s[i][j] += v;
}
int query(int x,int y){
int re = 0;
for (int i = x; i; i -= lbt(i))
for (int j = y; j; j -= lbt(j))
re += s[i][j];
return re;
}
int sum(int x1,int y1,int x2,int y2){
return query(x2,y2) - query(x2,y1 - 1) - query(x1 - 1,y2) + query(x1 - 1,y1 - 1);
}
inline bool operator <(const node& a,const node& b){
return a.v < b.v;
}
void solve(int l,int r,int L,int R){
if (L > R) return;
if (l == r){
for (int i = L; i <= R; i++) ans[q[i].id] = e[l].v;
return;
}
int mid = l + r >> 1,li = L,ri = R,v;
for (int i = l; i <= mid; i++) add(e[i].x,e[i].y,1);
for (int i = L; i <= R; i++){
v = sum(q[i].x1,q[i].y1,q[i].x2,q[i].y2);
if (v >= q[i].k) t[li++] = q[i];
else q[i].k -= v,t[ri--] = q[i];
}
for (int i = L; i <= R; i++) q[i] = t[i];
for (int i = l; i <= mid; i++) add(e[i].x,e[i].y,-1);
solve(l,mid,L,li - 1); solve(mid + 1,r,ri + 1,R);
}
int main(){
n = read(); Q = read();
REP(i,n) REP(j,n) e[++N] = (node){i,j,b[++bi] = read()};
REP(i,Q) q[i].x1 = read(),q[i].y1 = read(),q[i].x2 = read(),q[i].y2 = read(),q[i].k = read(),q[i].id = i;
sort(b + 1,b + 1 + bi); tot = 1;
for (int i = 2; i <= bi; i++) if (b[i] != b[tot]) b[++tot] = b[i];
REP(i,N) e[i].v = lower_bound(b + 1,b + 1 + tot,e[i].v) - b;
sort(e + 1,e + 1 + N);
solve(1,N,1,Q);
REP(i,Q) printf("%d\n",b[ans[i]]);
return 0;
}

最新文章

  1. EF for Oracle,dotConnect for Oracle,ODP.NET
  2. Bete冲刺第五阶段
  3. PLSQL_闪回操作3_Fashback Transaction Query
  4. js-计算器
  5. CImageList类Create函数参数解析
  6. DOM操作-克隆元素
  7. Struts2第十三篇【防止表单重复提交】
  8. 安卓Eclipse如何快速修改工程名及包名
  9. 记录MYSQL中SQL语句的一个坑.
  10. 解决ajax请求默认不支持重定向问题
  11. 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
  12. Android学习之基础知识五—RecyclerView(滚动控件)
  13. 了解下webpack的几个命令
  14. 「ZJOI2015」地震后的幻想乡
  15. 虚拟环境Scrapy安装
  16. Android应用程序如何调用shell脚本(一)
  17. onmouseenter和onmouseleave的兼容性问题
  18. webpack-易混淆部分的解释
  19. Web开发者的福利 30段超实用CSS代码
  20. JDK(二)JDK1.8源码分析【排序】timsort

热门文章

  1. 【vue】MongoDB+Nodejs+express+Vue后台管理项目Demo
  2. HUE配置HBase
  3. 20155317王新玮《网络对抗技术》实验8 WEB基础实践
  4. 开源软件License汇总
  5. WEB返回顶部效果
  6. 20135202闫佳歆--week1 计算机是如何工作的
  7. 用IDEA开发简单的Servlet
  8. 集美大学1414班软件工程个人作业2——个人作业2:APP案例分析
  9. 利用mask-image蒙层编写异形头像
  10. java 封装,继承,多态基础