正解:主席树

解题报告:

传送门!

题目大意是说,给定一个矩形,然后每次会给一个,这个大矩形中的一个小矩形,询问从小矩形中最少选多少个数字能满足它们之和大于等于给定数字$x$

看起来很神的样子,完全不会鸭嘤嘤嘤

然后看到数据范围,对于百分之五十的数据,$balabala$,对于另外百分之五十的数据,$balabala$,不难意识到,只要分别把这两个数据范围的数据分别做了这题就做完了嘛

所以这题其实是个二合一来着

首先考虑$r=1$,这就相当于是只有一行数,然后每次给定一个区间,问至少要选多少个能有$sum\leq x$,考虑权值主席树呗

仔细港下,手下一个显然的贪心想法是说,能选大的就尽量选大的所以在$query$的时候就有优先右子树,当右子树的$sum$是够的时候直接往右子树走就好,否则就把右子树的贡献算上然后往左子树走

其他都是裸主席树不港$QwQ$

然后对于$r,c\leq 200$,可以考虑一个大胆的想法,用个类似桶排的方法把这个做了$QwQ$.

考虑设$sum_{i,j,k}$表示在$(1,1),(i,j)$这个矩阵内数值大于等于$k$的数之和,$num_{i,j,k}$表示再$(1,1),(i,j)$这个矩阵内数值大于等于$k$的数的数量

二分下就好

噢还有个更大胆的想法,,,

可以考虑把上一个部分分当做这个部分分的弱化版,考虑开200棵主席树,强做,,,

居然也过得去,,,?

好神啊我$jio$得$hhh$

没写那个更大胆的想法的$code$了$hhhhhhhhh$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) int r,c,m; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
namespace sub1
{
const int N=+,M=+;
int nod_cnt=,rt[N];
struct node{int sum,num,l,r;}tr[M];
il int modify(ri d,ri l,ri r,ri dat)
{
ri nw=++nod_cnt;tr[nw]=tr[d];if(l==r)return ++tr[nw].num,tr[nw].sum+=dat,nw;
ri mid=(l+r)>>;mid>=dat?tr[nw].l=modify(tr[nw].l,l,mid,dat):tr[nw].r=modify(tr[nw].r,mid+,r,dat);
tr[nw].num=tr[tr[nw].l].num+tr[tr[nw].r].num;tr[nw].sum=tr[tr[nw].l].sum+tr[tr[nw].r].sum;
return nw;
}
il int query(ri rt_l,ri rt_r,ri l,ri r,ri dat)
{
if(l==r)return (dat+l-)/l;
ri mid=(l+r)>>;
if(tr[tr[rt_r].r].sum-tr[tr[rt_l].r].sum>=dat)return query(tr[rt_l].r,tr[rt_r].r,mid+,r,dat);
dat-=tr[tr[rt_r].r].sum-tr[tr[rt_l].r].sum;
return tr[tr[rt_r].r].num-tr[tr[rt_l].r].num+query(tr[rt_l].l,tr[rt_r].l,l,mid,dat);
}
il void main()
{
rp(i,,c){rt[i]=modify(rt[i-],,N-,read());}
while(m--)
{
read();ri l=read()-;read();ri r=read(),sum=read();
if(tr[rt[r]].sum-tr[rt[l]].sum<sum)printf("Poor QLW\n");
else printf("%d\n",query(rt[l],rt[r],,N-,sum));
}
}
}
namespace sub2
{
const int N=+,M=+;
int sum[N][N][M],num[N][N][M],p[N][M];
int count(int xl,int yl,int xr,int yr,int k)
{
return sum[xr][yr][k]-sum[xl][yr][k]-sum[xr][yl][k]+sum[xl][yl][k];
}
int number(int xl,int yl,int xr,int yr,int k)
{
return num[xr][yr][k]-num[xl][yr][k]-num[xr][yl][k]+num[xl][yl][k];
}
il void main()
{
rp(i,,r)rp(j,,c)p[i][j]=read();
rp(i,,r)
{
rp(j,,c)
{
rp(k,,M-)
{
sum[i][j][k]=sum[i-][j][k]+sum[i][j-][k]-sum[i-][j-][k];
num[i][j][k]=num[i-][j][k]+num[i][j-][k]-num[i-][j-][k];
if(p[i][j]>=k)sum[i][j][k]+=p[i][j],++num[i][j][k];
}
}
}
while(m--)
{
ri xl=read()-,yl=read()-,xr=read(),yr=read(),sum=read();
int l=,r=M-;
while(l<r){ri mid=(l+r)>>;if(count(xl,yl,xr,yr,mid+)>=sum)l=mid+;else r=mid;}
if(!l)printf("Poor QLW\n");else printf("%d\n",number(xl,yl,xr,yr,l)-(count(xl,yl,xr,yr,l)-sum)/l);
}
}
} int main()
{
r=read();c=read();m=read();
if(r==)return sub1::main(),;
return sub2::main(),;
}

两个月之后我居然回来填坑了,真是令人感动/kk

对了,我一定要槽下$bzoj$,,,我不知道我$code$出了什么问题?数组开大了$MLE$我理解,为什么数组开小会$CE$啊啊啊啊啊啊啊啊啊啊

$sad$

洛谷$P$2468 粟粟的书架 $[SDOI2010]$ 主席树的更多相关文章

  1. BZOJ1926[Sdoi2010]粟粟的书架——二分答案+主席树

    题目描述 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位 ...

  2. 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】

    题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...

  3. BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)

    题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...

  4. 【BZOJ】1926: [Sdoi2010]粟粟的书架(暴力+主席树)

    题目 传送门:QWQ 分析 两道题目 第一问暴力预处理 用$ a[i][j][k] $和$ s[i][j][k] $ 表示从$ (1,1) $ 到 $ (i,j) $ 这个矩形中比k大的数的个数和这些 ...

  5. ☆ [洛谷P2633] Count on a tree 「树上主席树」

    题目类型:主席树+\(LCA\) 传送门:>Here< 题意:给出一棵树.每个节点有点权.问某一条路径上排名第\(K\)小的点权是多少 解题思路 类似区间第\(K\)小,但放在了树上. 考 ...

  6. 洛谷P3919 【模板】可持久化数组 [主席树]

    题目传送门 可持久化数组 题目描述 如题,你需要维护这样的一个长度为 $N$ 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对 ...

  7. 【洛谷 P2633】 Count on a tree(主席树,树上差分)

    题目链接 思维难度0 实现难度7 建出主席树后用两点的状态减去lca和lca父亲的状态,然后在新树上跑第\(k\)小 #include <cstdio> #include <cstr ...

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

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

  9. 洛咕 P2468 [SDOI2010]粟粟的书架

    强行二合一啊... 前面直接二分最小值,二维前缀和.后面用主席树查最小值.注意要写\(nlogn\). // luogu-judger-enable-o2 #include<bits/stdc+ ...

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

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

随机推荐

  1. Flask学习之一 hello world

    本人电脑环境: 系统:linux

  2. deepin golang微服务搭建go-micro环境

    1.安装micro 需要使用GO1.11以上版本 #linux 下 export GO111MODULE=on export GOPROXY=https://goproxy.cn # 使用如下指令安装 ...

  3. Bitmap的recycle问题

        虽然Android有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定.如果只是使用少量的几张图片,回收与否关系不大.可是若有大量bitmap需要垃圾回收处理,那必然垃 ...

  4. <%@ include file=""%>与<jsp:include page=""/>两种方式的作用以及传值

      一:使用    1.include指令: 1 <%@include file="文件的绝对路径或者相对路径"%> file属性是必填的(绝对或相对路径),但它不支持 ...

  5. 【Pandas】Pandas求某列字符串的长度,总结经验教训

    测试集大小: test.shape(898, 11) 对某列的字符串做统计长度1.for遍历法:start = time.time()for i in test.index.values: test. ...

  6. hdu 4179 Difficult Routes (SP)

    Problem - 4179 坑了我一个晚上的SP题. 题意是,给出若干空间中的点,给出其中某些点之间是有直线线段路径相连的.要求求出一条从s开始到t结束的路径,它的难度是d.难度的计算是空间线段两点 ...

  7. asp.net MVC 模板定制

    模板存放位置:C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC ...

  8. pip 将 某包指定到某目录 安装

    pip 将 某包指定到某目录  安装: pip install --target=d:\somewhere\other\than\the\default package_name

  9. 2019-9-2-Visual-studio-创建项目失败vstemplate

    title author date CreateTime categories Visual studio 创建项目失败vstemplate lindexi 2019-09-02 12:57:38 + ...

  10. 列出display的值,说明他们的作用。position的值, relative和 absolute定位原点是?

    display的值: block 像块类型元素一样显示. none 像行内元素类型一样显示. inline-block 像行内元素一样显示, 但其内容像块类型元素一样显示. list-item 像块类 ...