题意

题目链接

给出一个矩形,每个点都有一些值,每次询问一个子矩阵最少需要拿几个数才能构成给出的值

Sol

这题是真坑啊。。

首先出题人强行把两个题拼到了一起,

对于前$50 \%$的数据,考虑二分答案。

用$f[i][j][k]$表示从$(1, 1)$到$(i, j) >= k$的个数,$g[i][j][k]$表示从$(1, 1)$到$(i, j) >= k$的和

这两个数组都可以递推出来

对于后$50 \%$,直接用主席树维护。。

mdzz死活有一个点RE。。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define LL long long
// #define int long long
using namespace std;
const int MAXN = , INF = 1e9 + , mod = , MAX = ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, M, Q;
namespace SubTask1 {
int a[][], f[][][], g[][][];
//f[i][j][k] 从(1, 1)到(i, j) >= k的个数
//g[i][j][k] 从(1, 1)到(i, j) >= k的和
int Get(int k, int l1, int r1, int l2, int r2, int H) {
return g[l2][r2][k] - g[l1 - ][r2][k] - g[l2][r1 - ][k] + g[l1 - ][r1 - ][k];
}
int Query(int k, int l1, int r1, int l2, int r2) {
return f[l2][r2][k] - f[l1 - ][r2][k] - f[l2][r1 - ][k] + f[l1 - ][r1 - ][k];
}
void work() {
for(int i = ; i <= N; i++) {
for(int j = ; j <= M; j++) {
a[i][j] = read();
for(int k = ; k <= ; k++) {
f[i][j][k] = f[i - ][j][k] + f[i][j - ][k] - f[i - ][j - ][k] + (a[i][j] >= k);
g[i][j][k] = g[i - ][j][k] + g[i][j - ][k] - g[i - ][j - ][k] + (a[i][j] >= k) * a[i][j];
}
}
}
while(Q--) {
int l1 = read(), r1 = read(), l2 = read(), r2 = read(), H = read();
int l = , r = , ans = -;
while(l <= r) {
int mid = l + r >> ;
int X = Get(mid, l1, r1, l2, r2, H);
if(X >= H) ans = Query(mid, l1, r1, l2, r2) - (X - H) / mid, l = mid + ;
else r = mid - ;
}
if(ans == -) {puts("Poor QLW"); continue;}
printf("%d\n", ans);
}
}
}
namespace SubTask2 {
int a[MAX];
int ls[MAX], rs[MAX], sum[MAX], siz[MAX], rt[MAX], tot = ;
void Insert(int &k, int p, int l, int r, int pos) {
k = ++tot;
rs[k] = rs[p]; ls[k] = ls[p]; siz[k] = siz[p]; sum[k] = sum[p];
siz[k]++; sum[k] += pos;
if(l == r) return ;
int mid = (l + r) >> ;
if(pos <= mid) Insert(ls[k], ls[p], l, mid, pos);
else Insert(rs[k], rs[p], mid + , r, pos);
}
int Query(int x, int y, int l, int r, int val) {
if(l == r) return (val + l - ) / l;
int mid = l + r >> ;
int rsum = sum[rs[y]]- sum[rs[x]];
if(rsum >= val) return Query(rs[x], rs[y], mid + , r, val);
else return Query(ls[x], ls[y], l, mid, val - rsum) + siz[rs[y]] - siz[rs[x]];
}
void work() {
for(int i = ; i <= M; i++) a[i] = read(), Insert(rt[i], rt[i - ], , , a[i]);
while(Q--) {
int l1 = read(), x = read(), l2 = read(), y = read(), H = read();
if(l1 != || l2 != ) {puts("Poor QLW"); continue;}
if(sum[rt[y]] - sum[rt[x - ]] < H) {puts("Poor QLW"); continue;}
int ans = Query(rt[x - ], rt[y], , , H);
printf("%d\n", ans);
}
}
}
main() {
// freopen("a.in", "r", stdin);
// freopen("c.out", "w", stdout);
N = read(); M = read(); Q = read();
if(N != ) SubTask1::work();
else SubTask2::work();
return ;
}
/*
*/

洛谷P2468 [SDOI2010]粟粟的书架(二分答案 前缀和 主席树)的更多相关文章

  1. Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...

  2. 洛谷P2468 [SDOI2010]粟粟的书架

    来了来了,随便拽一道题写题解[大雾] 最近发现自己基础奇差于是开始复习之前学过的东西,正好主席树我几乎完全没学会,然后打开洛谷试炼场… 发现了这么一道二合一的题. 这道题其实分成两个部分,前50%是一 ...

  3. 洛谷P2468 SDOI 2010 粟粟的书架

    题意:给你一个矩形书架,每个点是这本书的页数,每次询问(x1,y1)(x2,y2)这个小矩形里最少需要取几本书使得页数和等于Hi. 题解:小数据二位前缀和预处理+二分答案,大数据一行所以用主席树做,感 ...

  4. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  5. 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)

    洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...

  6. [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)

    [NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...

  7. 【洛谷 P3191】 [HNOI2007]紧急疏散EVACUATE(二分答案,最大流)

    题目链接 sb错误调了3hour+.. bfs预处理出每个\(.\)到每个\(D\)的最短距离. 二分时间\(t\),把每个\(D\)拆成\(t\)个点,这\(t\)个点两两连边,流量\(INF\)表 ...

  8. 洛谷P2801 教主的魔法 [分块,二分答案]

    题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...

  9. 洛谷P1404 平均数 [01分数规划,二分答案]

    题目传送门 平均数 题目描述 给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m. 输入输出格式 输入格式: N+1行, 第一行两个整数n和m 接下来n ...

随机推荐

  1. Linux系统下强制其他用户下线

    强制其他用户下线命令格式:pkill -kill -t tty 解释: pkill -kill -t 强制其他用户下线命令 tty 强制其他用户下线的TTY 如上强制其他用户下线的命令为: pkill ...

  2. Options Menu的android3.0以上和以下版本显示刷新原理,刷新适配

    一 显示区别: 2.3.x及以下版本,需要按菜单键显示菜单,当菜单打开时,第一个可见的部分是图标菜单,最多可容纳6个菜单项.如果你的菜单包括Android的地方超过6项,第六项,其余将被归到”More ...

  3. POJ 3321 Apple Tree DFS序 + 树状数组

    多次修改一棵树节点的值,或者询问当前这个节点的子树所有节点权值总和. 首先预处理出DFS序L[i]和R[i] 把问题转化为区间查询总和问题.单点修改,区间查询,树状数组即可. 注意修改的时候也要按照d ...

  4. Sqoop Export HDFS

    Sqoop Export应用场景——直接导出 直接导出 我们先复制一个表,然后将上一篇博文(Sqoop Import HDFS)导入的数据再导出到我们所复制的表里. sqoop export \ -- ...

  5. Hive 基本语法操练(二):视图和索引操作

    1. 视图操作 ------- 1) 创建一个测试表. ``` hive> create table test(id int,name string); OK Time taken: 0.385 ...

  6. ASP.NET MVC缓存

    根据缓存的位置不同,可以区分为: ①客户端缓存(缓存在用户的客户端,例如浏览器中) ②服务器缓存(缓存在服务器中,可以缓存在内存中,也可以缓存在文件里,并且还可以进一步地区分为本地缓存和分布式缓存两种 ...

  7. 学习笔记:MDN的Web入门

    HTML: 要引用一个父目录的文件,加上两个点. HTML并不是真正的编程语言,它是一种用于定义内容结构的标记语言. 元素(Element):开标签.闭标签与内容相结合,便是一个完整的元素.元素可以用 ...

  8. <Android 应用 之路> 天气预报(四)

    前言 第二次尝试完成天气预报应用,与上次不同的是,个人感觉这次的Ui不那么丑陋,整体的实用性和界面效果,用户体验相较上一次有所提升,但是还是有很多地方需要完善. 这次使用到的内容比较丰富,包括聚合数据 ...

  9. 云为 | 提供海外 IT 人才派遣、猎头、人力资源外包服务

    云为是大连信为软件开发有限公司为人力资源外包服务创建的品牌,是中国专业的人力资源外包领域的服务商,在信息技术行业为海外企业雇主招聘合格.专业且技能熟练的精英人士.我们的客户涵盖了日本上市公司和​​株式 ...

  10. 【Shell脚本学习23】Shell函数参数

    在Shell中,调用函数时可以向其传递参数.在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数... 带参数的函数示例: #!/bin/bash funWit ...