BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)
题意: 在给定矩形区域内找出最少的数,满足和>=k。输出数的个数。两种数据范围。
0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理.
num[i][j][v]表示(1,1)(i,j)中值>=v的个数,val[i][j][v]表示(1,1)(i,j)值>=v的所有数的和。(不要被什么>=v坑,和二维前缀和一样,只是一个点的初始值为A[i,j]>=k)
依旧二分。(好像可以离线之类的优化空间?不管了)
60~100 在一个数列的区间中找 满足和>=k。用主席树+二分做。注意去重对sz[]有影响!P[i,j]<=1000,不用离散化。
//480556kb 16480ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define Failed puts("Poor QLW")
int r,c,Q;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
namespace Problem1
{
const int N=202;
int A[N][N],num[N][N][1002],val[N][N][1002];
inline int Get_num(int x1,int y1,int x2,int y2,int v){
return num[x2][y2][v]-num[x1][y2][v]-num[x2][y1][v]+num[x1][y1][v];
}
inline int Get_val(int x1,int y1,int x2,int y2,int v){
return val[x2][y2][v]-val[x1][y2][v]-val[x2][y1][v]+val[x1][y1][v];
}
void Solve()
{
int Max=0;
for(int i=1; i<=r; ++i)
for(int j=1; j<=c; ++j) Max=std::max(Max,A[i][j]=read());
for(int k=1; k<=Max; ++k)
for(int i=1; i<=r; ++i)
for(int j=1; j<=c; ++j)//每个k直接递推就行啊,sb了。
num[i][j][k]=num[i-1][j][k]+num[i][j-1][k]-num[i-1][j-1][k]+(A[i][j]>=k),
val[i][j][k]=val[i-1][j][k]+val[i][j-1][k]-val[i-1][j-1][k]+(A[i][j]>=k?A[i][j]:0);//括号!要不成了val=(..+..+..)>=k?A:0;
int x1,y1,x2,y2,h;
while(Q--)
{
x1=read()-1,y1=read()-1,x2=read(),y2=read(),h=read();
int l=1,r=Max,mid,res=0;
while(l<=r)
{
if(Get_val(x1,y1,x2,y2,mid=l+r>>1)>=h) l=mid+1,res=mid;
else r=mid-1;
}
if(res) printf("%d\n",Get_num(x1,y1,x2,y2,res)-(Get_val(x1,y1,x2,y2,res)-h)/res/*重复多算*/);
else Failed;
}
}
}
namespace Problem2
{
#define lson son[rt][0]
#define rson son[rt][1]
const int N=5e5+5,S=500005*20,Max=1e3;
int A[N],root[N],tot,son[S][2],sz[S],sum[S];
inline void Update(int rt){
sum[rt]=sum[lson]+sum[rson];
}
void Insert(int rt,int &y,int l,int r,int p)
{
sz[y=++tot]=sz[rt]+1, sum[y]=sum[rt]/*no need?*/;
if(l==r) sum[y]+=p;//s_y=s_x+ref[p]
else{
int m=l+r>>1;
if(p<=m) son[y][1]=rson, Insert(lson,son[y][0],l,m,p);
else son[y][0]=lson, Insert(rson,son[y][1],m+1,r,p);
Update(y);
}
}
int Query(int rt,int y,int l,int r,int k)
{
if(sz[y]<=sz[rt]+k) return sum[y]-sum[rt];
if(l==r) return (sum[y]-sum[rt])/(sz[y]-sz[rt])*k;
if(sz[son[y][1]]>=sz[rson]+k) return Query(rson,son[y][1],(l+r>>1)+1,r,k);
return Query(lson,son[y][0],l,l+r>>1,k-sz[son[y][1]]+sz[rson])+sum[son[y][1]]-sum[rson];
}
void Solve()
{
for(int i=1; i<=c; ++i) A[i]=read();
int x,s,t,h;
for(int i=1; i<=c; ++i) Insert(root[i-1],root[i],1,Max,A[i]);
while(Q--)
{
x=read(),s=read()-1,x=read(),t=read(),h=read();
int l=1,r=t-s+1,mid;
int tst;
while(l<r)
{
if((tst=Query(root[s],root[t],1,Max,mid=l+r>>1))>=h) r=mid;
else l=mid+1;
}
if(r==t-s+1) Failed;
else printf("%d\n",l);
}
}
}
int main()
{
r=read(),c=read(),Q=read();
r==1?Problem2::Solve():Problem1::Solve();
return 0;
}
BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)的更多相关文章
- BZOJ 4556 [Tjoi2016&Heoi2016]字符串 ——后缀数组 ST表 主席树 二分答案
Solution 1: 后缀数组暴力大法好 #include <map> #include <cmath> #include <queue> #include &l ...
- BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)
题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...
- bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1926 题面; 1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Se ...
- Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...
- 【刷题】BZOJ 1926 [Sdoi2010]粟粟的书架
Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R行C 列的巨型书架,书 ...
- BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)
BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...
- bzoj 1926: [Sdoi2010]粟粟的书架
#include<cstdio> #include<iostream> #define N 201 #define M 500008 using namespace std; ...
- BZOJ1926 [Sdoi2010]粟粟的书架 【主席树 + 二分 + 前缀和】
题目 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位置都 ...
- 【BZOJ-1926】粟粟的书架 二分 + 前缀和 + 主席树
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MBSubmit: 616 Solved: 238[Submit][Statu ...
随机推荐
- python---基础知识回顾(二)(闭包函数和装饰器)
一.闭包函数: 闭包函数: 1.在一个外函数中定义了一个内函数 2.内函数里运用了外函数的临时变量,而不是全局变量 3.并且外函数的返回值是内函数的引用.(函数名,内存块地址,函数名指针..) 正确形 ...
- bzoj千题计划212:bzoj1864: [Zjoi2006]三色二叉树
http://www.lydsy.com/JudgeOnline/problem.php?id=1864 #include<cstdio> #include<cstring> ...
- 小议 html 实体解析
今天分享个小技巧,是群里一个朋友问的,"请问 + 这种类型的字符串怎么转换成我们想要的字符 + ,有什么简便的js方法吗"其实问题说简单也简单,说难也难.我们要分情况来描述问题解决 ...
- javascript柯里化
function curry(fn){ var slice = Array.prototype.slice; var arr = slice.call(arguments,1); return fun ...
- VMware Linux 下 Nginx 安装配置 - nginx.conf 配置 [负载两个 Tomcat] (三)
首先启动Nginx 1. 相关浏览 两个 Tomcat 配置: VMware Linux 下 Nginx 安装配置 - Tomcat 配置 (二) Nginx 安装配置启动: VMware Linu ...
- 20155233 2016-2017-2 《Java程序设计》第5周学习总结
20155233 2016-2017-2 <Java程序设计>第5周学习总结 学习目标 理解异常架构 牚握try...catch...finally处理异常的方法 会用throw,thro ...
- HDU 4608 I-number 2013 Multi-University Training Contest 1 1009题
题目大意:输入一个数x,求一个对应的y,这个y满足以下条件,第一,y>x,第二,y 的各位数之和能被10整除,第三,求满足前两个条件的最小的y. 解题报告:一个模拟题,比赛的时候确没过,感觉这题 ...
- 游程编码(Run Length Code)
一.什么是游程编码 游程编码是一种比较简单的压缩算法,其基本思想是将重复且连续出现多次的字符使用(连续出现次数,某个字符)来描述. 比如一个字符串: AAAAABBBBCCC 使用游程编码可以将其描述 ...
- OpenWRT开发之——对C++的支持(解决库依赖问题)【转】
转自:https://my.oschina.net/hevakelcj/blog/411944 摘要: 本文尝试用C++来开发一个cpp-demo包 遇到打包库依赖的问题,分析打包过程并解决了这个问题 ...
- Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】
原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://bl ...