洛谷$P$2468 粟粟的书架 $[SDOI2010]$ 主席树
正解:主席树
解题报告:
题目大意是说,给定一个矩形,然后每次会给一个,这个大矩形中的一个小矩形,询问从小矩形中最少选多少个数字能满足它们之和大于等于给定数字$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]$ 主席树的更多相关文章
- BZOJ1926[Sdoi2010]粟粟的书架——二分答案+主席树
题目描述 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位 ...
- 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】
题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...
- BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)
题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...
- 【BZOJ】1926: [Sdoi2010]粟粟的书架(暴力+主席树)
题目 传送门:QWQ 分析 两道题目 第一问暴力预处理 用$ a[i][j][k] $和$ s[i][j][k] $ 表示从$ (1,1) $ 到 $ (i,j) $ 这个矩形中比k大的数的个数和这些 ...
- ☆ [洛谷P2633] Count on a tree 「树上主席树」
题目类型:主席树+\(LCA\) 传送门:>Here< 题意:给出一棵树.每个节点有点权.问某一条路径上排名第\(K\)小的点权是多少 解题思路 类似区间第\(K\)小,但放在了树上. 考 ...
- 洛谷P3919 【模板】可持久化数组 [主席树]
题目传送门 可持久化数组 题目描述 如题,你需要维护这样的一个长度为 $N$ 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对 ...
- 【洛谷 P2633】 Count on a tree(主席树,树上差分)
题目链接 思维难度0 实现难度7 建出主席树后用两点的状态减去lca和lca父亲的状态,然后在新树上跑第\(k\)小 #include <cstdio> #include <cstr ...
- 洛谷P2468 SDOI 2010 粟粟的书架
题意:给你一个矩形书架,每个点是这本书的页数,每次询问(x1,y1)(x2,y2)这个小矩形里最少需要取几本书使得页数和等于Hi. 题解:小数据二位前缀和预处理+二分答案,大数据一行所以用主席树做,感 ...
- 洛咕 P2468 [SDOI2010]粟粟的书架
强行二合一啊... 前面直接二分最小值,二维前缀和.后面用主席树查最小值.注意要写\(nlogn\). // luogu-judger-enable-o2 #include<bits/stdc+ ...
- 洛谷P2468 [SDOI2010]粟粟的书架
来了来了,随便拽一道题写题解[大雾] 最近发现自己基础奇差于是开始复习之前学过的东西,正好主席树我几乎完全没学会,然后打开洛谷试炼场… 发现了这么一道二合一的题. 这道题其实分成两个部分,前50%是一 ...
随机推荐
- @loj - 2480@ 「CEOI2017」One-Way Streets
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一张 n 个点 m 条边的无向图,现在想要把这张图定向. 有 ...
- 如何用Chrome浏览器下载网页音乐视频
打开网页,先让要下载的视频播放,右键单击选择审查元素(F12),选择上方的Network选项,按F5刷新,这个时候我们可以看到框架中Size下的不少文件数据数字正在变大,按size降序排列.点击表格的 ...
- 8-2udp和tcp网络编程以及粘包和解决粘包的方法
一 tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...
- JPA进行insert操作时会首先select吗
在某个项目中,使用JPA的saveAll方法去批量写入数据时,通过打印sql,发现每次insert前都会先select一次,极大的浪费了写入性能. 分析一下代码,saveAll() @Transact ...
- Python--day60--web框架分类和wsgiref模块使用介绍
- python模块之包
包:将解决一类问题的模块放在同一目录下就形成了一个包 为了更好的了解包,我们就模拟创建一个包 import os os.makedirs('glance/api') os.makedirs('glan ...
- 2019年第二阶段我要变强个人训练赛第八场 B.序列(seq)
传送门 B.序列(seq) •题目描述 给出一个长度为n的序列a,每次对序列进行一下的某一个操作. •输入 第一行两个整数n,q表示序列长度和操作个数. 接下来一行n个数,表示序列a. 接下来q行表示 ...
- 2018-2-13-win10-uwp-隐藏实时可视化
title author date CreateTime categories win10 uwp 隐藏实时可视化 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 ...
- H3C DHCP服务器基本配置
- Eclipse文档注释导出doc
选择要导出的项目,右键选择Export 直接next,在最后finish之前加上编码格式.要不然会出现乱码