Luogu P2468 [SDOI2010]粟粟的书架
一道二合一的题目。两部分思维难度都不太高,但是也都很巧妙。尤其是主席树的\(50\)分,由于本人初学主席树,所以没有见过主席树上二分的套路,就被小小的卡了一下。。
\(n <= 200\) \(and\) \(m <= 200\):前缀和+二分
\(n <= 1\) \(and\) \(m <= 500000\):主席树+二分,即对主席树每个节点维护一个权值和和本数和。关于最后的一个小细节,下面图片有讲解:

#include <bits/stdc++.h>
using namespace std;
int n, m, t;
void subtask_2 () {
const int N = 210, M = 1010;
static int rec[N][N], sum[N][N][M], num[N][N][M];
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> rec[i][j];
for (int k = rec[i][j]; k >= 1; --k) {
sum[i][j][k] = rec[i][j]; //[1, 1] -> [i, j] 间页数 >= k 的书页数和
num[i][j][k] = 1; //[1, 1] -> [i, j] 间页数 >= k 的书本数和
}
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
for (int k = 1; k <= 1000; ++k) {
sum[i][j][k] += sum[i - 1][j][k] + sum[i][j - 1][k] - sum[i - 1][j - 1][k];
num[i][j][k] += num[i - 1][j][k] + num[i][j - 1][k] - num[i - 1][j - 1][k];
}
}
}
for (int i = 1; i <= t; ++i) {
static int a1, b1, a2, b2, h;
cin >> a1 >> b1 >> a2 >> b2 >> h;
int l = 1, r = 1000;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (sum[a2][b2][mid] - sum[a2][b1 - 1][mid] - sum[a1 - 1][b2][mid] + sum[a1 - 1][b1 - 1][mid] >= h) {
l = mid;
} else {
r = mid - 1;
}
}
int _num = num[a2][b2][l] - num[a2][b1 - 1][l] - num[a1 - 1][b2][l] + num[a1 - 1][b1 - 1][l];
int _sum = sum[a2][b2][l] - sum[a2][b1 - 1][l] - sum[a1 - 1][b2][l] + sum[a1 - 1][b1 - 1][l];
while (_sum - l >= h) _sum -= l, _num -= 1;
if (_sum < h) {
puts ("Poor QLW");
} else {
cout << _num << endl;
}
}
}
const int N = 500010;
static int tot = 0, rt[N], arr[N];
struct Segment_Tree {
struct Segment_Node {
int ls, rs, sz, sum;
}t[N << 5];
int modify (int root, int l, int r, int _val) {
int p = ++tot, mid = (l + r) >> 1;
t[p].ls = t[root].ls;
t[p].rs = t[root].rs;
t[p].sz = t[root].sz + 1;
t[p].sum = t[root].sum + _val;
if (l != r) {
if (_val <= mid) {
t[p].ls = modify (t[root].ls, l, mid, _val);
} else {
t[p].rs = modify (t[root].rs, mid + 1, r, _val);
}
}
return p;
}
int build (int l, int r) {
int p = ++tot, mid = (l + r) >> 1;
t[p].sz = t[p].sum = 0;
if (l != r) {
t[p].ls = build (l, mid);
t[p].rs = build (mid + 1, r);
} else {
t[p].ls = t[p].rs = 0;
}
return p;
}
int query (int u, int v, int l, int r, int k) {
int ans = 0;
while (l < r) {
int mid = (l + r) >> 1;
int lch = t[t[v].rs].sum - t[t[u].rs].sum;
if (lch < k) {
ans += t[t[v].rs].sz - t[t[u].rs].sz, k -= lch;
r = mid;
v = t[v].ls, u = t[u].ls;
} else {
l = mid + 1;
v = t[v].rs, u = t[u].rs;
}
}
ans += ceil ((1.0 * k) / (1.0 * l));
return ans;
}
// int query (int u, int v, int l, int r, int sumw) {
// int mid = (l + r) >> 1;
// int del = t[t[v].ls].sum - t[t[u].ls].sum, ans = 0;
// if (l != r) {
// if (sumw <= del) {
// ans += query (t[u].ls, t[v].ls, l, mid, sumw);
// } else {
// ans += del;
// ans += query (t[u].rs, t[v].rs, mid + 1, r, sumw - del);
// }
// }
// return ans;
// }
}tree;
void subtask_1 () {
rt[0] = tree.build (1, 1000);
for (int i = 1; i <= m; ++i) {
cin >> arr[i];
rt[i] = tree.modify (rt[i - 1], 1, 1000, arr[i]);
}
for (int i = 1; i <= t; ++i) {
static int a1, b1, a2, b2, h;
cin >> a1 >> b1 >> a2 >> b2 >> h;
if (tree.t[rt[b2]].sum - tree.t[rt[b1 - 1]].sum < h) {
puts ("Poor QLW");
} else {
cout << tree.query (rt[b1 - 1], rt[b2], 1, 1000, h) << endl;
}
}
}
int main () {
freopen ("2468.in", "r", stdin);
cin >> n >> m >> t;
if (n == 1) subtask_1 ();
if (n != 1) subtask_2 ();
}
Luogu P2468 [SDOI2010]粟粟的书架的更多相关文章
- 「Luogu P2468 [SDOI2010]粟粟的书架」
这道题分为两个部分 Part1 前置芝士 前缀和(后缀和,二维前缀和):可以预处理一下数据. 二分查找:可以在较短的时间内找出答案. 具体做法 可以发现\(R,C\)不大,只有\(200\),于是可以 ...
- BZOJ1926:[SDOI2010]粟粟的书架——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1926 https://www.luogu.org/problemnew/show/P2468 幸福幼 ...
- [BZOJ1926][SDOI2010]粟粟的书架
BZOJ Luogu Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R ...
- bzoj1926[Sdoi2010]粟粟的书架 二分 主席树
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MBSubmit: 1064 Solved: 421[Submit][Stat ...
- bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1926 题面; 1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Se ...
- [bzoj1926][Sdoi2010]粟粟的书架_二分_主席树
粟粟的书架 bzoj-1926 Sdoi-2010 题目大意:题目链接 注释:略 想法:分成两个题 前面的我们可以二分,直接二分出来检验即可. 对于R=1的,相当一个数列,我们在上面建立主席树. 然后 ...
- Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...
- [SDOI2010]粟粟的书架 [主席树]
[SDOI2010]粟粟的书架 考虑暴力怎么做 显然是提取出来 (x2-x1+1)*(y2-y1+1) 个数字拿出来 然后从大到小排序 然后就可以按次取数了- 然而接下来看数据范围 \(50\%\ r ...
- BZOJ1926[Sdoi2010]粟粟的书架——二分答案+主席树
题目描述 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位 ...
随机推荐
- 今天开始学习模式识别与机器学习Pattern Recognition and Machine Learning (PRML),章节5.1,Neural Networks神经网络-前向网络。
话说上一次写这个笔记是13年的事情了···那时候忙着实习,找工作,毕业什么的就没写下去了,现在工作了有半年时间也算稳定了,我会继续把这个笔记写完.其实很多章节都看了,不过还没写出来,先从第5章开始吧, ...
- 集成Javascript Logging on MVC or Core
ASP.NET Core provides us a rich Logging APIs which have a set of logger providers including: Console ...
- 5G到来,数据中心如何变革?
导读 5G将要到来,除改变人们的工作生活外,其带宽.延时.连接特性也逼迫着数据中心变革,以满足5G时代需求.具体而言,5G将从形状规模.硬件组成及软件规模三面变革数据中心. 5G带来什么 高带宽.低延 ...
- mysql GTID主从配置
主数据库配置 [mysqld] server_id=1 gtid_mode=on enforce_gtid_consistency=on skip_slave_start=1log_bin=maste ...
- Docker最全教程
摘自雪雁大佬的博客,地址:https://www.cnblogs.com/codelove/default.html 目录: Docker最全教程——从理论到实战(一) Docker最全教程——从理论 ...
- bzoj 3626 : [LNOI2014]LCA (树链剖分+线段树)
Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q ...
- 解决Eclipse每次修改完代码后需要先Clean,不然修改的代码无效
工具栏 Project-->Build Automatically 勾选上即可
- expect交互式安装软件
公司一些宿主机需要安装软件,吴老师要求写一个安装脚本: 脚本思路:首先要把安装的包拷贝到每台机器上,然后要让每台机器都运行一次安装命令:就想到了应用scp.ssh命令,但这两个命令需要输入对端密码,需 ...
- 【BZOJ5417】[NOI2018]你的名字(线段树,后缀自动机)
[BZOJ5417][NOI2018]你的名字(线段树,后缀自动机) 题面 BZOJ 洛谷 题解 首先考虑\(l=1,r=|S|\)的做法,对于每次询问的\(T\)串,暴力在\(S\)串的\(SAM\ ...
- 【BZOJ5332】[SDOI2018]旧试题(数论,三元环计数)
[BZOJ5332][SDOI2018]旧试题(数论,三元环计数) 题面 BZOJ 洛谷 题解 如果只有一个\(\sum\),那么我们可以枚举每个答案的出现次数. 首先约数个数这个东西很不爽,就搞一搞 ...