浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1926

这题应该算是两题……首先贪心的想,我们肯定是尽量选厚的书。对于前\(50\)%的数据,我们可以统计大于等于\(k\)的数字的二维前缀和与书的本数,然后二分\(k\),直接\(O(1)\)计算厚度总和可不可以大于\(h\),记得,如果对于某个\(k\),如果这一个子矩阵里的高度总和大于\(h\),我们还要试着去掉厚度为\(k\)的书,让厚度总和尽可能逼近\(h\)才行。因为二分具有单调性,\(k\)满足而\(k+1\)不满足,那么你能去掉的厚度为\(k\)的本数肯定不会大于真实的\(k\)的本数。

对于后\(50\)%的数据,因为书架从矩阵退化成了数列,我们可以用主席树维护。我们在值域上建主席树,\(rt[i]\)表示第\(i\)个版本的主席树,也就是\(1\)~\(i\)号书全部插入主席树之后的主席树。对于一个询问[\(l,r\)],我们先看右儿子的总厚度是否大于\(h\),是的话就往右儿子走,否则使\(h\)减去右儿子的总厚度,到左儿子里去找剩下的\(h\)。当你确定到某一本厚度的时候,像二分那样,只返回要用的最少的本数而不是全部都返回。

时间复杂度:\(O(n^2p+mlogp)\)---前\(50\)%,\(O((n+m)logn)\)---后\(50\)%

空间复杂度:\(O(n^2p)\)---前\(50\)%,\(O(nlogn)\)---后\(50\)%

代码如下:

#include <cstdio>
using namespace std; const int maxn=5e5+5; int n,m,q,x1,x2;
int p1[205][205];
int p2[maxn],rt[maxn];
int sum[205][205][1005],cnt[205][205][1005]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} void init() {
n=read(),m=read(),q=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(n!=1)p1[i][j]=read();
else p2[j]=read();
} int calc(int (*a)[205][1005],int x1,int y1,int x2,int y2,int k) {
return a[x2][y2][k]-a[x1-1][y2][k]-a[x2][y1-1][k]+a[x1-1][y1-1][k];
} void solve1() {
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<=1000;k++) {
sum[i][j][k]=sum[i][j-1][k]+sum[i-1][j][k]-sum[i-1][j-1][k];
cnt[i][j][k]=cnt[i][j-1][k]+cnt[i-1][j][k]-cnt[i-1][j-1][k];
if(p1[i][j]>=k) sum[i][j][k]+=p1[i][j],cnt[i][j][k]++;
}
for(int i=1;i<=q;i++) {
int x1=read(),y1=read(),x2=read(),y2=read(),h=read();
int l=0,r=1000,ans=-1;
while(l<r) {
int mid=(l+r+1)>>1;
int tmp=calc(sum,x1,y1,x2,y2,mid);
if(tmp<h)r=mid-1;
else {
l=mid,ans=calc(cnt,x1,y1,x2,y2,mid);
ans-=(tmp-h)/mid;//直接减,不要虚
}
}
if(ans==-1)puts("Poor QLW");
else printf("%d\n",ans);
}
} struct tree_node {
int cnt,sum,ls,rs;
}; struct chairman_tree {
int tot;
tree_node tree[maxn*20]; void ins(int lst,int &now,int l,int r,int pos) {
now=++tot;tree[now]=tree[lst];
tree[now].cnt++,tree[now].sum+=pos;
if(l==r)return;
int mid=(l+r)>>1;
if(pos<=mid)ins(tree[lst].ls,tree[now].ls,l,mid,pos);
else ins(tree[lst].rs,tree[now].rs,mid+1,r,pos);
} int query(int L,int R,int l,int r,int limit) {
if(tree[R].sum-tree[L].sum<limit)return -1;
if(l==r) {
int tmp=tree[R].cnt-tree[L].cnt;
int fake=tree[R].sum-tree[L].sum;
return tmp-(fake-limit)/l;//本数减去可以去掉的数量
}
int mid=(l+r)>>1,tmp=tree[tree[R].rs].sum-tree[tree[L].rs].sum;
int fake=tree[tree[R].rs].cnt-tree[tree[L].rs].cnt;
if(tmp>=limit)return query(tree[L].rs,tree[R].rs,mid+1,r,limit);
else return query(tree[L].ls,tree[R].ls,l,mid,limit-tmp)+fake;
return 0;
}
}T; void solve2() {
for(int i=1;i<=m;i++)
T.ins(rt[i-1],rt[i],1,1000,p2[i]);
for(int i=1;i<=q;i++) {
x1=read();int l=read();x2=read();int r=read(),h=read();
int ans=T.query(rt[l-1],rt[r],1,1000,h);
if(ans==-1)puts("Poor QLW");
else printf("%d\n",ans);
}
} int main() {
init();
if(n!=1)solve1();
else solve2();
return 0;
}

BZOJ1926:[SDOI2010]粟粟的书架的更多相关文章

  1. [bzoj1926][Sdoi2010]粟粟的书架_二分_主席树

    粟粟的书架 bzoj-1926 Sdoi-2010 题目大意:题目链接 注释:略 想法:分成两个题 前面的我们可以二分,直接二分出来检验即可. 对于R=1的,相当一个数列,我们在上面建立主席树. 然后 ...

  2. bzoj1926[Sdoi2010]粟粟的书架 二分 主席树

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec  Memory Limit: 552 MBSubmit: 1064  Solved: 421[Submit][Stat ...

  3. [BZOJ1926][SDOI2010]粟粟的书架

    BZOJ Luogu Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R ...

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

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

  5. BZOJ1926:[SDOI2010]粟粟的书架——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1926 https://www.luogu.org/problemnew/show/P2468 幸福幼 ...

  6. 【BZOJ1926】【SDOI2010】粟粟的书架 [主席树]

    粟粟的书架 Time Limit: 30 Sec  Memory Limit: 552 MB[Submit][Status][Discuss] Description 幸福幼儿园 B29 班的粟粟是一 ...

  7. BZOJ1926 [Sdoi2010]粟粟的书架 【主席树 + 二分 + 前缀和】

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

  8. 【BZOJ-1926】粟粟的书架 二分 + 前缀和 + 主席树

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec  Memory Limit: 552 MBSubmit: 616  Solved: 238[Submit][Statu ...

  9. 【BZOJ1926】粟粟的书架(主席树,前缀和)

    [BZOJ1926]粟粟的书架(主席树,前缀和) 题面 Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co ...

  10. bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1926 题面; 1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Se ...

随机推荐

  1. VESA-ADV7123-SOCKIT-DE2115

    /*--VGA Timing--Horizontal :-- ______________ _____________-- | | |--_______________| VIDEO |_______ ...

  2. python学习(四)字符串学习

    #!/usr/bin/python # 这一节学习的是python中的字符串操作 # 字符串是在Python中作为序列存在的, 其他的序列有列表和元组 # 1. 序列的操作 S = 'Spam' # ...

  3. java中BigDecimal的学习

    干着java的活,但是看的都是一些偏底层的东西(或者我根本就没有看),有点荒废了java的学习. 最近一直在用到一个类是BigDecimal,但都是模棱两可地在那儿用,并没有深入研究这个类的细节,感觉 ...

  4. 4.锁--并行编程之条件变量(posix condition variables)

    在整理Java LockSupport.park()的东东.看到了个"Spurious wakeup".又一次梳理下. 首先来个<UNIX环境高级编程>里的样例: [c ...

  5. 转载 -- 基于原生JS与OC方法互相调用并传值(附HTML代码)

    最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点就是方法的互相调用而已. 本文叙述下如何进行原生的JavaScript交互 本 ...

  6. Hadoop常见异常及其解决方式

    1.Shell$ExitCodeException 现象:执行hadoop job时出现例如以下异常: 14/07/09 14:42:50 INFO mapreduce.Job: Task Id : ...

  7. excel十几万行数据快速导入数据库研究(转,下面那个方法看看还是可以的)

    先贴原来的导入数据代码: 8 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "www.setting ...

  8. python 基础 2.6 break用法

    python中最基本的语法格式大概就是缩进了.python中常用的循环:for循环,if循环.一个小游戏说明for,if ,break的用法. 猜数字游戏: 1.系统生成一个20以内的随机数 2.玩家 ...

  9. .Net反射机制

    现在谈.Net反射机制本不在计划中,因为本打算研究完设计模式后再去学习别的技术:但迫于设计模式系列一创建型之(抽象工厂模式)一章中遗留问题,才不得已在设计模式之游中插入本篇文章!签于本人对反射理解也不 ...

  10. java中Random(long seed)方法与rRandom()方法的使用产生随机数

    Random 类作为JAVA中用于产生的随机数 ,new  Random(10)  :10是种子数. 注意:Random 的一个特点是:相同种子数的Random对象,对应相同次数生成的随机数字是完全相 ...