题目

幸福幼儿园 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. 获取SD卡下Android/data/下文件

    通常情况下多数应用程序都会将缓存的位置选择为 /sdcard/Android/data/<application package>/cache 这个路径.选择在这个位置有两点好处:第一,这 ...

  2. 【Web应用-Kudu】Kudu 管理和诊断 azure web 应用

    Azure  Kudu是 GitHub 上的一个开源项目,Kudu 站点 (也称为网站控制管理 SCM) 提供了一系列的在线工具,可以帮助用户查看 web 应用的设置,诊断 web 应用,以及安装 w ...

  3. MySQL索引使用等

  4. hihoCoder #1070 : RMQ问题再临

    G++ 77ms 0MB 思路:这题用暴力是最快的,甚至比线段树还佳. 按全部都是查询的来算,是O(n*q). #include <bits/stdc++.h> using namespa ...

  5. PHP框架深度解析

    PHP成为世界上最流行的脚本语言有许多原因:灵活性,易用性等等.但通常只用PHP或者其他语言编码就会显得单调.重复,这时候就需要一个PHP框架来代替程序员完成那些重复不变的部分.本文通过回答What, ...

  6. VC-基础:MFC单文档程序架构解析

    MFC单文档程序架构解析 这里我以科院杨老师的单文档程序来分析一下MFC单文档的程序架构,纯属个人见解,不当之处烦请指教! 首先我们了解到的是 图(一) theApp 是唯一一个在程序形成的时候就存在 ...

  7. CPP-基础:windows api 多线程---互斥量、信号量、临界值、事件区别

    http://blog.csdn.net/wangsifu2009/article/details/6728155 四种进程或线程同步互斥的控制方法:1.临界区:通过对多线程的串行化来访问公共资源或一 ...

  8. 第1节 flume:15、flume案例二,通过自定义拦截器实现数据的脱敏

    1.7.flume案例二 案例需求: 在数据采集之后,通过flume的拦截器,实现不需要的数据过滤掉,并将指定的第一个字段进行加密,加密之后再往hdfs上面保存 原始数据与处理之后的数据对比 图一  ...

  9. 将 PROTOCOL 的方法声明为 MUTATING

    将 PROTOCOL 的方法声明为 MUTATING 由 王巍 (@ONEVCAT) 发布于 2014/08/17 Swift 的 protocol 不仅可以被 class 类型实现,也适用于 str ...

  10. EditorConfig文件

    EditorConfig .editorconfig文件 在很多开源项目中,会出现这个文件,这个文件有何作用? editorconfig 帮助开发者的(编辑器和IDEs)定义和维护编程风格. 有些编辑 ...