题意

题目链接

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

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. Codeforces Round #467(Div2)题解

    凌晨起来打CF,0:05,也是我第一次codeforces 第一题: 我刚开始怀疑自己读错题了,怎么会辣么水. 判除了0的数字种类 #include <cstdio> ; ]; int m ...

  2. deep copy and shallow copy

    链接A:浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值.但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件..当值拷贝的时候,两个对象就有用共同的资源,同时对资 ...

  3. Oracle 取上周一到周末的sql

    -- 这样取的是 在一周内第几天,是以周日为开始的 select to_char(to_date('20131005','yyyymmdd'),'d') from dual; --结果:7 注释:20 ...

  4. MyEclipse8.5配置struts等框架

    开发环境:MyEclipse8.5+Tomcat6.5+MySql5.5配置环境:Struts2+Spring2+Hibernate3.1 1.首先创建Java-Web Project工程,选择J2E ...

  5. <Linux系统isosize指令用法>

    isosize命令:iso9660文件系统大小显示 isosize命令用于显示iso9660文件系统的大小,还文件可以使普通文件,也可以是块设备,如/dev/sr0或者/dev/sda.如果没有相关选 ...

  6. C 碎片十一 扫雷源码

    // C语言版本扫雷 #include <stdio.h> #include <stdlib.h> /* 1(0,0) 1(0,1) 0(0,2) 1(0,3) 1(0,4) ...

  7. A light-weight client-side OAuth library for Java

    这个是一个Github上的开源项目-Signpost,主要封装了一些OAuth认证类的方法,项目地址:电极打开 Signpost 什么是Signpost Signpost是一种非常容易.直观的HTTP ...

  8. Java项目—嗖嗖移动业务大厅

    嗖嗖移动业务大厅包类(如下图): SosoMgr: package cn.biz; import java.util.Scanner; import cn.common.Common; import ...

  9. OpenStack Ocata Telemetry 数据收集服务

    1 安装配置计算服务 在所有计算节点上: 1.1 安装配置组件 安装包: # yum install -y openstack-ceilometer-compute 编辑配置文件/etc/ceilom ...

  10. 如何进行大规模在线数据迁移(来自Stripe公司的经验)

    首发于笔者的微信公众号:技术心流FollowFlows 原文地址:Stripe Engineering Blog   各工程团队常面临一项共同挑战:重新设计数据模型以支持清晰准确的抽象和更复杂的功能. ...