题意

题目链接

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

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下ssh key秘钥登陆远程服务器设置

    本地的用户名需要和ssh服务器的用户名一致 1.在Server服务器上加载私钥文件ssh-add wang_rsa 2.如果系统提示:could not open a connection to yo ...

  2. springMvc json 参数

    以前,一直以为在SpringMVC环境中,@RequestBody接收的是一个Json对象,一直在调试代码都没有成功,后来发现,其实 @RequestBody接收的是一个Json对象的字符串,而不是一 ...

  3. 【ACM】一种排序

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...

  4. 【ACM】括号配对问题 - 栈

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0<N<=1 ...

  5. dotnet core 命令行使用web deploy 部署项目到远程IIS

    众所周知dotnet cli可以用来编译和生成发布.net core,其实dotnet publish 还能进行WebDeploy.先解释一下使用场景一般是用于持续部署 dotnet publish进 ...

  6. HDU 4622 Reincarnation Hash解法详解

    今天想学字符串hash是怎么弄的.就看到了这题模板题 http://acm.hdu.edu.cn/showproblem.php?pid=4622 刚开始当然不懂啦,然后就上网搜解法.很多都是什么后缀 ...

  7. Java面向对象_抽象类、接口

    一.抽象类 概   念:很多具有相同特征和行为的对象可以抽象为一个类:很多具有相同特征和行为的类可以抽象为一个抽象类 关键字:abstract 规   则:1.抽象类可以没有抽象方法,有抽象方法的类必 ...

  8. Java面向对象_适配器模式

    概念:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 public class Practice14 { public static v ...

  9. 原型设计工具 Axure RP 7.0下载地址及安装说明

    Axure RP是产品经理必备的原型制作工具,因为很多同学是新手,在这里整理一下axure7.0的下载.安装和汉化流程,希望能够帮到大家. Axure RP是美国Axure Software Solu ...

  10. 用mvc模式,整理前两次的代码并增加登陆注册

    简单的servlet连接mysql数据库 使用mvc的登录注册 commons-dbutils-1.6 mysql-connector-java-5.1.40-bin c3p0-0.9.5.2 mch ...