Luogu P2468 SDOI2010 粟粟的书架 题解 [ 紫 ] [ 可持久化线段树 ] [ 二分 ] [ 前缀和 ]
粟粟的书架:二合一的缝合题。
前一半测试点
此时是 \(200\times 200\) 的二维问题,首先考虑暴力怎么写,显然是每次询问把查的全扔进大根堆里,然后一直取堆顶直到满足要求或者取空。
那么这个暴力的一个显著特征就是我们选了前 \(k\) 大的值进去,换句话说,我们就要把大于等于某个值的元素全选进去。于是我们二分这个值,把大于等于这个值的全选上,最后一个满足总和 \(\ge h\) 的值就是最后选的元素的值。然后把多出的不需要的元素减掉即可。
具体实现上,我们用二维前缀和记录 \((i,j)\) 处大于等于 \(k\) 的元素个数和元素之和,二分 check 一下即可。
时间复杂度 \(O(nmV+q\log V)\)。
其实这个 trick 是个挺常见的二分 trick 的,在 ABC 里也出过一次。
后一半测试点
此时是 \(n \le 5\times 10^5\) 的一维问题,我们需要查询一个区间内 \(\ge h\) 需要选的最少元素个数。
那么我们根据上文的贪心,显然也是要先选大的,所以我们对每个 \(1\sim i\) 建立一个权值线段树,组合起来就成了可持久化线段树,然后向下递归的时候就先选更大的右儿子,右儿子选了不够再选左儿子。注意到叶子结点时需要选的个数为 $\left \lceil \frac{h_{cur}}{x} \right \rceil $,并且修改时是在原基础上增加。
时间复杂度 \(O(n\log n)\)。
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
int read()
{
int x=0;char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
return x;
}
int n,m,q,mx=-0x3f3f3f3f;
int ax[205][205],f[205][205][1005],g[205][205][1005];
int getf(int x,int y,int xx,int yy,int k)
{
return (f[xx][yy][k]-f[xx][y-1][k]-f[x-1][yy][k]+f[x-1][y-1][k]);
}
int getg(int x,int y,int xx,int yy,int k)
{
return (g[xx][yy][k]-g[xx][y-1][k]-g[x-1][yy][k]+g[x-1][y-1][k]);
}
void solve1()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
ax[i][j]=read();
mx=max(mx,ax[i][j]);
}
}
for(int k=1;k<=mx;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j][k]=(f[i-1][j][k]+f[i][j-1][k]-f[i-1][j-1][k]+(ax[i][j]>=k?ax[i][j]:0));
g[i][j][k]=(g[i-1][j][k]+g[i][j-1][k]-g[i-1][j-1][k]+(ax[i][j]>=k?1:0));
}
}
}
while(q--)
{
int x,y,xx,yy,h;
x=read();y=read();xx=read();yy=read();h=read();
if(getf(x,y,xx,yy,1)<h){printf("Poor QLW\n");continue;}
int l=1,r=mx,mid;
while(l<r)
{
mid=(l+r+1)>>1;
if(getf(x,y,xx,yy,mid)>=h)l=mid;
else r=mid-1;
}
printf("%d\n",getg(x,y,xx,yy,l)-(getf(x,y,xx,yy,l)-h)/l);
}
}
const int N=500005;
int a[N];
struct Node{
int ls,rs,sm,sz;
};
struct Persegtree{
Node tr[25*N];
int root[N],tot=0;
void pushup(int p)
{
tr[p].sm=tr[lc(p)].sm+tr[rc(p)].sm;
tr[p].sz=tr[lc(p)].sz+tr[rc(p)].sz;
}
void update(int &u,int v,int ln,int rn,int x)
{
u=++tot;
tr[u]=tr[v];
if(ln==rn){tr[u].sm+=x;tr[u].sz+=1;return;}
int mid=(ln+rn)>>1;
if(x<=mid)update(lc(u),lc(v),ln,mid,x);
else update(rc(u),rc(v),mid+1,rn,x);
pushup(u);
}
int query(int u,int v,int ln,int rn,int h)
{
if(ln==rn)return int(ceil(1.0*h/ln));
int mid=(ln+rn)>>1;
int rsm=tr[rc(u)].sm-tr[rc(v)].sm;
int rsz=tr[rc(u)].sz-tr[rc(v)].sz;
if(rsm<h)return (query(lc(u),lc(v),ln,mid,h-rsm)+rsz);
else return query(rc(u),rc(v),mid+1,rn,h);
}
}tr1;
void solve2()
{
for(int i=1;i<=m;i++)
{
a[i]=read();
mx=max(mx,a[i]);
}
for(int i=1;i<=m;i++)tr1.update(tr1.root[i],tr1.root[i-1],1,mx,a[i]);
while(q--)
{
int tmp,l,r,h;
tmp=read();l=read()-1;tmp=read();r=read();h=read();
if(tr1.tr[tr1.root[r]].sm-tr1.tr[tr1.root[l]].sm<h){printf("Poor QLW\n");continue;}
printf("%d\n",tr1.query(tr1.root[r],tr1.root[l],1,mx,h));
}
}
int main()
{
//freopen("sample.in","r",stdin);
//freopen("sample.out","w",stdout);
n=read();m=read();q=read();
if(n==1)solve2();
else solve1();
return 0;
}
Luogu P2468 SDOI2010 粟粟的书架 题解 [ 紫 ] [ 可持久化线段树 ] [ 二分 ] [ 前缀和 ]的更多相关文章
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)
luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...
- BZOJ1926 [Sdoi2010]粟粟的书架 【主席树 + 二分 + 前缀和】
题目 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位置都 ...
- 【Luogu P3834】可持久化线段树(主席树)
Luogu P3834 可持久化数据结构就是支持在历史版本上进行查询和修改操作的数据结构. 主席树就是对线段树的改进,使之可持久化. 前置知识:动态开点线段树 我们利用权值(值域)线段树统计区间内的数 ...
- [Luogu] 可持久化线段树 1(主席树)
https://www.luogu.org/problemnew/show/P3834 #include<cstdio> #include<iostream> #include ...
- [NOIP10.5模拟赛]1.a题解--离散化+异或线段树
题目链接: 咕咕咕 https://www.luogu.org/problemnew/show/CF817F 闲扯 在Yali经历几天折磨后信心摧残,T1数据结构裸题考场上连暴力都TM没打满 分析 观 ...
- [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)
题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...
- 「洛谷 P3834」「模板」可持久化线段树 题解报告
题目描述 给定n个整数构成的序列,将对于指定的闭区间查询其区间内的第k小值. 输入输出格式 输入格式 第一行包含两个正整数n,m,分别表示序列的长度和查询的个数. 第二行包含n个整数,表示这个序列各项 ...
- Luogu P2468 [SDOI2010]粟粟的书架
一道二合一的题目.两部分思维难度都不太高,但是也都很巧妙.尤其是主席树的\(50\)分,由于本人初学主席树,所以没有见过主席树上二分的套路,就被小小的卡了一下.. \(n <= 200\) \( ...
- 「Luogu P2468 [SDOI2010]粟粟的书架」
这道题分为两个部分 Part1 前置芝士 前缀和(后缀和,二维前缀和):可以预处理一下数据. 二分查找:可以在较短的时间内找出答案. 具体做法 可以发现\(R,C\)不大,只有\(200\),于是可以 ...
随机推荐
- 使用 wireshark 捕获 请求包
1.出错场景 今天遇到一个问题,在用户登录时,发现用户在登录的时候,一个用户登录正常,一个用户登录报错,报错的原因时400错误,分析对比发现一个用户的分配用户组多,一个分配的少,其中多的那个出错了. ...
- m4 mac mini本地部署ComfyUI,测试Flux-dev-GGUF的workflow模型10步出图,测试AI绘图性能,基于MPS(fp16),优点是能耗小和静音
m4 mac mini已经发布了一段时间,针对这个产品,更多的是关于性价比的讨论,如果抛开各种补贴不论,价位上和以前发布的mini其实差别不大,真要论性价比,各种windows系统的mini主机的价格 ...
- 将.nuget文件夹从C盘移到其它盘,再也不用担心的C盘爆红了
将.nuget文件夹从C盘移到其它盘,再也不用担心的C盘爆红了 命令 查看缓存文件夹的具体路径 dotnet nuget locals all --list 第一步 在文件资源管理器输入%AppDat ...
- 一图一知-强大的js数组
平时在开发中,数组基本是每天都会用到的数据结构,通过ES6的更新,数组更是越发强大,特此记录数组那些有用而强大的api.
- Java模拟Oracle函数MONTHS_BETWEEN注意事项
Java模拟Oracle函数MONTHS_BETWEEN注意事项 MONTHS_BETWEEN(DATE1, DATE2) 用来计算两个日期的月份差. 最近接到一个迁移需求,把Oracle SQL接口 ...
- #oscp#渗透测试 kioptix level 3靶机getshell及提权教程
声明! 文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!! 一.靶机搭建 点击扫描虚拟机 选择靶机使在文件夹即可 二.信息收集 前言 信 ...
- ruoyi若依前端验证码不显示的终极解决方法-20230721
搞了3天啊,查了各种资料啊. 然后使劲的看log啊,总算搞定了啊. 一般情况,本地开发环境测试没问题,部署到服务器就各种不适应,就是服务器配置的问题了. 本次这种验证码不显示,典型的nginx的配置 ...
- COSBrowser 文件对比——更实用的文件管理功能
我们在使用 COSBrowser 来管理腾讯云存储的文件时,目前我们大家所熟知的上传/下载方式,主要有以下三种: 通过点击按钮上传/下载 通过拖拽的形式进行上传/下载 通过 URL 链接进行上传/下载 ...
- 2.猿人学爬虫攻防第二题 JS 混淆 动态cookie
题目链接:请点击 抓取到发布日热度的值,计算所有值的加和 1.分析网页 由于是动态Cookie,为了避免其他Cookie的影响,所以使用浏览器的无痕模式进行调试,按f12并选中[Preserve lo ...
- Powershell 源码批判
代码里充斥着过程式编程的搞法:比如这里 Utils.PathIsUnc,分散的到处都是 internal static IEnumerable<string> GetDefaultAvai ...