洛谷P2468 [SDOI2010]粟粟的书架(二分答案 前缀和 主席树)
题意
给出一个矩形,每个点都有一些值,每次询问一个子矩阵最少需要拿几个数才能构成给出的值
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]粟粟的书架(二分答案 前缀和 主席树)的更多相关文章
- Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...
- 洛谷P2468 [SDOI2010]粟粟的书架
来了来了,随便拽一道题写题解[大雾] 最近发现自己基础奇差于是开始复习之前学过的东西,正好主席树我几乎完全没学会,然后打开洛谷试炼场… 发现了这么一道二合一的题. 这道题其实分成两个部分,前50%是一 ...
- 洛谷P2468 SDOI 2010 粟粟的书架
题意:给你一个矩形书架,每个点是这本书的页数,每次询问(x1,y1)(x2,y2)这个小矩形里最少需要取几本书使得页数和等于Hi. 题解:小数据二位前缀和预处理+二分答案,大数据一行所以用主席树做,感 ...
- 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)
洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...
- [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)
[NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...
- 【洛谷 P3191】 [HNOI2007]紧急疏散EVACUATE(二分答案,最大流)
题目链接 sb错误调了3hour+.. bfs预处理出每个\(.\)到每个\(D\)的最短距离. 二分时间\(t\),把每个\(D\)拆成\(t\)个点,这\(t\)个点两两连边,流量\(INF\)表 ...
- 洛谷P2801 教主的魔法 [分块,二分答案]
题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...
- 洛谷P1404 平均数 [01分数规划,二分答案]
题目传送门 平均数 题目描述 给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m. 输入输出格式 输入格式: N+1行, 第一行两个整数n和m 接下来n ...
随机推荐
- iptables端口转发规则(内网端口转外网端口)
需求:外网124.202.173.118需要访问 10.45.225.70的内网54032端口,10.45.225.70服务器有公网地址139.129.109.81将内网地址端口转发到外网地址端口,并 ...
- java基础---GC
一.Java基础: GC即:garbage collection垃圾回收机制.Java是自动回收垃圾的,像c c++等语言没有自动垃圾回收机制,长时间开启服务器就会导致 内存泄漏,占用内存 Java的 ...
- SerializeUtil
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInpu ...
- ASP.NET Core集成微信登录
工具: Visual Studio 2015 update 3 Asp.Net Core 1.0 1 准备工作 申请微信公众平台接口测试帐号,申请网址:(http://mp.weixin.qq.com ...
- js中===、==、!=、!===的区别
结论 ===:先比较两个变量的类型,然后再比较值 !==:上面的值取非 ==:如果变量类型相同,比较值是否相同:类型不同,先转成相同类型,再比较值 !=:上面的值取非 代码 var num = 1; ...
- mockJs语法糖用例
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Google常用拓展插件
1.web前端助手(FEhelper)提供一些实用的前端小工具,功能十分贴心 2.bookMarks Manager 一个书签管理工具 3.Clear Cache 清除浏览器的缓存,有很多供选择的条目 ...
- 使用kvm制作Eucalyptus镜像(Windows Server 2008r2为例)
1.前言 Elastic Utility Computing Architecture for Linking Your Programs To Useful Systems (Eucalyptus) ...
- Error: unknown argument: '-websockets'
参考原文:http://www.cocoachina.com/bbs/read.php?tid=194014 解决方法:点击项目右边编辑区域上面有一个building setting找到other l ...
- 详细讲解:tp3.2.3生成验证码并进行验证(ajax校验返回及自定义返回)
TP3.2.3的验证码也是比较经典的小功能,框架对这个小功能的封装还是比较完美的,废话不多说,开始记录 1.总体效果: (1)初始界面 (2)自定义的返回校验效果: (3)ajax的校验返回: 2.代 ...