洛谷$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%是一 ...
随机推荐
- Header和Cookie相关内容
相信很多同学都对HTTP的header和cookie,和session都有疑问,因为我们开发的时候一般都需要请求网络获取数据,有时候还需要带cookie或者带特殊的字段发起请求. 现在我们就来简单的了 ...
- 洛谷P3366 【模板】最小生成树(kuskal)
#include<bits/stdc++.h> using namespace std; ; ; struct node{ int cnt,fa; }f[maxn]; inline voi ...
- 解决margin塌陷和margin合并
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- 史上最全的MYSQL备份方法
本人曾经 用过的备份方式有:mysqldump.mysqlhotcopy.BACKUP TABLE .SELECT INTOOUTFILE,又或者备份二进制日志(binlog),还可以是直接拷贝数据文 ...
- XTU 1236 Fraction
Fraction Accepted : 168 Submit : 1061 Time Limit : 1000 MS Memory Limit : 65536 KB Fraction Prob ...
- CRF(条件随机场)与Viterbi(维特比)算法原理详解
摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...
- java DOM 操作xml
1 代码如下: package dom.pasing; import java.io.IOException; import java.io.StringWriter; import javax.xm ...
- jmeter登录配置
前言: jmeter, Apache下的测试工具, 常用来进行压测, 项目中, 接口通常都需要进行登录才能被调用, 直接调用将提示"登录失效", 下面介绍如何在jmeter中配置参 ...
- 2018-8-10-用-sim-卡加密保护资金
title author date CreateTime categories 用 sim 卡加密保护资金 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17 ...
- JAVA核心知识点--打包 FatJar 方法小结
目录 什么是 FatJar 三种打包方法 1. 非遮蔽方法(Unshaded) 2. 遮蔽方法(Shaded) 3. 嵌套方法(Jar of Jars) 小结 参考阅读 原文地址:https://yq ...