题目

幸福幼儿园 B29 班的粟粟是一个聪明机灵、乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co

rmen 的文章。粟粟家中有一个 R行C 列的巨型书架,书架的每一个位置都摆有一本书,上数第i 行、左数第j 列

摆放的书有Pi,j页厚。粟粟每天除了读书之外,还有一件必不可少的工作就是摘苹果,她每天必须摘取一个指定的

苹果。粟粟家果树上的苹果有的高、有的低,但无论如何凭粟粟自己的个头都难以摘到。不过她发现, 如果在脚

下放上几本书,就可以够着苹果;她同时注意到,对于第 i 天指定的那个苹果,只要她脚下放置书的总页数之和

不低于Hi,就一定能够摘到。由于书架内的书过多,父母担心粟粟一天内就把所有书看完而耽误了上幼儿园,于是

每天只允许粟粟在一个特定区域内拿书。这个区域是一个矩形,第 i 天给定区域的左上角是上数第 x1i行的左数

第 y1i本书,右下角是上数第 x2i行的左数第y2i本书。换句话说,粟粟在这一天,只能在这﹙x2i-x1i+1﹚×﹙

y2i-y1i+1﹚本书中挑选若干本垫在脚下,摘取苹果。粟粟每次取书时都能及时放回原位,并且她的书架不会再

撤下书目或换上新书,摘苹果的任务会一直持续 M天。给出每本书籍的页数和每天的区域限制及采摘要求,请你告

诉粟粟,她每天至少拿取多少本书,就可以摘到当天指定的苹果。

输入格式

第一行是三个正整数R,C,M。

接下来是一个R行C列的矩阵,从上到下、从左向右依次给出了每本书的页数Pi,j。

接下来M行,第i行给出正整数x1i,y1i,x2i,y2i,Hi,表示第i天的指定区域是﹙x1i,y1i﹚与﹙x2i,y2i﹚间

的矩形,总页数之和要求不低于Hi。

保证1≤x1i≤x2i≤R,1≤y1i≤y2i≤C。

输出格式

有M行,第i 行回答粟粟在第 i 天时为摘到苹果至少需要 拿取多少本书。如果即使取走所有书都无法摘到苹果,

则在该行输出“Poor QLW” (不含引号)。

输入样例

5 5 7

14 15 9 26 53

58 9 7 9 32

38 46 26 43 38

32 7 9 50 28

8 41 9 7 17

1 2 5 3 139

3 1 5 5 399

3 3 4 5 91

4 1 4 1 33

1 3 5 4 185

3 3 4 3 23

3 1 3 3 108

输出样例

6

15

2

Poor QLW

9

1

3

提示

对于 10%的数据,满足 R, C≤10;

对于 20%的数据,满足 R, C≤40;

对于 50%的数据,满足 R, C≤200,M≤200,000;

另有 50%的数据,满足 R=1,C≤500,000,M≤20,000;

对于 100%的数据,满足 1≤Pi,j≤1,000,1≤Hi≤2,000,000,000

题解

此题二合一

我数据结构学傻了,二维写了一个树状数组套主席树,然后T了。。。

对于一条链,二分答案 + 主席树判定

对于二维,开一个数组num[x][y][k]表示(1,1)到(x,y)中所有>=k的数的总和,tot[x][y][k]表示有多少这样的数

然后也可以二分答案

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
#define lbt(x) (x & -x)
using namespace std;
const int maxn = 500005,maxm = 10000005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int ls[maxm],rs[maxm],sum[maxm],cnt[maxm],rt[maxn],siz;
int n,m,Q,N = 1000;
void modify(int& u,int pre,int l,int r,int pos){
u = ++siz; ls[u] = ls[pre]; rs[u] = rs[pre];
cnt[u] = cnt[pre] + 1; sum[u] = sum[pre] + pos;
if (l == r) return;
int mid = l + r >> 1;
if (mid >= pos) modify(ls[u],ls[pre],l,mid,pos);
else modify(rs[u],rs[pre],mid + 1,r,pos);
}
int query(int u,int v,int l,int r,int k){
if (cnt[u] - cnt[v] == k) return sum[u] - sum[v];
if (l == r) return (sum[u] - sum[v]) / (cnt[u] - cnt[v]) * k;
int mid = l + r >> 1,t = cnt[rs[u]] - cnt[rs[v]];
if (t < k) return query(ls[u],ls[v],l,mid,k - t) + sum[rs[u]] - sum[rs[v]];
else return query(rs[u],rs[v],mid + 1,r,k);
}
void solve1(){
for (int i = 1; i <= m; i++)
modify(rt[i],rt[i - 1],1,N,read());
int L,R,h;
while (Q--){
read(); L = read() - 1; read(); R = read(); h = read();
if (sum[rt[R]] - sum[rt[L]] < h){
puts("Poor QLW"); continue;
}
int l = 1,r = cnt[rt[R]] - cnt[rt[L]],mid;
while (l < r){
mid = l + r >> 1;
if (query(rt[R],rt[L],1,N,mid) >= h) r = mid;
else l = mid + 1;
}
printf("%d\n",l);
}
}
int num[205][205][1005],tot[205][205][1005],x,y,xx,yy,h;
int S(int mid){
return num[xx][yy][mid] - num[x - 1][yy][mid] - num[xx][y - 1][mid] + num[x - 1][y - 1][mid];
}
int C(int mid){
return tot[xx][yy][mid] - tot[x - 1][yy][mid] - tot[xx][y - 1][mid] + tot[x - 1][y - 1][mid];
}
void solve2(){
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++){
int x = read();
for (int k = x; k; k--)
num[i][j][k] = x,tot[i][j][k] = 1;
for (int k = 1; k <= N; k++)
num[i][j][k] += num[i - 1][j][k] + num[i][j - 1][k] - num[i - 1][j - 1][k],
tot[i][j][k] += tot[i - 1][j][k] + tot[i][j - 1][k] - tot[i - 1][j - 1][k];
}
int l,r,mid;
while (Q--){
x = read(); y = read(); xx = read(); yy = read(); h = read();
if (S(1) < h) {puts("Poor QLW"); continue;}
l = 1; r = 1000;
while (l < r){
mid = l + r + 1 >> 1;
if (S(mid) >= h) l = mid;
else r = mid - 1;
}
int t = h - S(l + 1);
printf("%d\n",C(l + 1) + (t % l == 0 ? t / l : t / l + 1));
}
}
int main(){
n = read(); m = read(); Q = read();
if (n == 1) solve1();
else solve2();
return 0;
}

BZOJ1926 [Sdoi2010]粟粟的书架 【主席树 + 二分 + 前缀和】的更多相关文章

  1. bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1926 题面; 1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Se ...

  2. BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)

    BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...

  3. Cutting Bamboos 主席树+二分+前缀和

    二分第x次砍的位置,然后用线段树查询小于这个位置的数的个数和值的和.然后判断即可 注意!!!主席树是通过动态开点实现的,本身已经不用再从1开始了,而本题开的范围也应该是0,100000 而不是1,10 ...

  4. 【BZOJ1926】粟粟的书架(主席树,前缀和)

    [BZOJ1926]粟粟的书架(主席树,前缀和) 题面 Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co ...

  5. BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)

    题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...

  6. 2018湘潭邀请赛C题(主席树+二分)

    题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...

  7. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  8. HDU - 4866 主席树 二分

    题意:在x轴\([1,X]\)内的上空分布有n个占据空间\([L_i,R_i]\),高度\(D_i\)的线段,射中线段的得分为其高度,每次询问从x轴的\(x\)往上空射的最近k个线段的总得分,具体得分 ...

  9. POJ 6621: K-th Closest Distance(主席树 + 二分)

    K-th Closest Distance Time Limit: 20000/15000 MS (Java/Others)    Memory Limit: 524288/524288 K (Jav ...

随机推荐

  1. 爬虫基本原理及requests,response详解

    一.爬虫基本原理 1.爬虫是什么 #1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样. #2.互联网建立的目的? 互联网的核心价值在于数据 ...

  2. Caused by: java.lang.ClassNotFoundException: org.springframework.boot.system.JavaVersion

    Caused by: java.lang.ClassNotFoundException: org.springframework.boot.system.JavaVersion Invalid pro ...

  3. jsc 解码窥探

    先使用 JS_DecodeScript反编译jsc  得到AST树 AST树词法解析 http://esprima.org/ AST还原成源码: npm install escodegen AST树遍 ...

  4. Java poi 的使用

    poi可操作老旧版本的excel 下载jar包,http://archive.apache.org/dist/poi/release/bin/poi-bin-3.17-20170915.tar.gz ...

  5. Struts2 执行流程

    struts2执行原理(执行流程) 一个请求在Struts2框架中的处理大概分为以下几个步骤: 1 客户端发送请求:(HttpServletRequest)2 这个请求经过一系列的过滤器(Filter ...

  6. PHP调用新浪API 生成短链接

    我们经常收到类似于这样的短信(如下图),发现其中的链接并不是常规的网址链接,而是个短小精悍的短链接,产品中经常需要这样的需求,如果在给用户下发的短信中是一个很长的连接,用户体验肯定很差,因此我们需要实 ...

  7. MySQL开启日志跟踪

    在开发过程中有时候会遇到sql相关的问题,但是有时候代码中不会直接看到真实的sql,想要看到mysql中实际执行的是什么sql,可以通过开启日志跟踪方式查看. 1 开启日志跟踪 SET GLOBAL ...

  8. 七:MYSQL之常用操作符

    前言: 运算符连接表达式中各个操作数,其作用是用来指明对操作数所进行的运算. 常见的运算有数学计算.比较运算.位运算及逻辑运算 一:算数运算符 用于各类数值运算.包括加(+).减(-).乘(*).除( ...

  9. PyCharm(一)——PyCharm设置SSH远程调试

    一.环境 系统环境:windows10 64位 软件:PyCharm2017.3 本地Python环境:Python2.7 二.配置 2.1配置远程调试 第一步:运行PyCharm,然后点击设置如下图 ...

  10. JavaScript内建对象-String

    JavaScript中通过双引号或单引号界定一个字符串. String对象只有一个属性:length属性,得到字符串的长度. 处理字符串本身的方法 charAt(index) 返回字符串中index指 ...