洛谷$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%是一 ...
随机推荐
- python 自动登录网页
语言:python 浏览器:chrome 工具:chrome控制台 #!/usr/bin/python # coding: GBK import urllib,urllib2,httplib,cook ...
- DTCC 2019 | 深度解码阿里数据库实现 数据库内核——基于HLC的分布式事务实现深度剖析
摘要:分布式事务是分布式数据库最难攻克的技术之一,分布式事务为分布式数据库提供一致性数据访问的支持,保证全局读写原子性和隔离性,提供一体化分布式数据库的用户体验.本文主要分享分布式数据库中的时钟解决方 ...
- js毫秒数转天时分秒
formatDuring: function(mss) { var days = parseInt(mss / (1000 * 60 * 60 * 24)); var hours = pars ...
- a span做成按钮时,文字不被选中样式
HTML: <a class="button"></a> <span class="button"></span> ...
- 【b801】笨小猴
Time Limit: 1 second Memory Limit: 50 MB [问题描述] 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选 ...
- [转]1.2 java web的发展历史
前言 了解java web的发展历史和相关技术的演进历程,非常有助于加深对java web技术的理解和认识. 阅读目录 1.Servlet的出现 2.Jsp的出现 3.倡导了MVC思想的Servlet ...
- ubuntu snmp 安装与配置
0.说明 关于一个完整的教程,还是那句话,国内的要么不完整,要么就太旧了,而且思路也不清晰,所以这里写一篇完整的给大家分享一下. 虽然对于Linux主机的监控可以通过执行特定的命令来完成,但是相比之后 ...
- linux初始化和关停
如已提到的, 模块初始化函数注册模块提供的任何功能. 这些功能, 我们指的是新功能, 可以由应用程序存取的或者一整个驱动或者一个新软件抽象. 实际的初始化函数定义常常 如: static int ...
- linux 使用 gdb
gdb 对于看系统内部是非常有用. 在这个级别精通调试器的使用要求对 gdb 命令有信心, 需要理解目标平台的汇编代码, 以及对应源码和优化的汇编码的能力. 调试器必须把内核作为一个应用程序来调用. ...
- 51nod 天气晴朗的魔法 - (Kruskall最小生成树)
题目: 基准时间限制:1 秒 空间限制:131072 KB 51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动. N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接 ...