题目大意:

http://www.lydsy.com/JudgeOnline/problem.php?id=1926

题解:

我们发现这道题其实是两问
第一问是对于 \(R, C\leq 200,M\leq 200,000\)
是在矩形上的询问
第二问是对于 \(R=1,C\leq 500,000,M\leq 20,000\)
是在序列上的询问
所以我们写两个程序即可
首先我们来解决序列上的问题:
很明显我们在主席树上二分查找即可.\(O(mlogn)\)可做
然后我们来解决在矩形上的问题:
很明显我们写个二维差分主席树就好了啦
我们发现这个子任务的特点是R,C的范围很小所以我们考虑预处理
我们可以预处理出\(f[i][j][k]\)表示在二维前缀和\((i,j)\)中
大于等于\(k\)的数的和,这样我们就可以二分啦!
同时为了统计答案我们还要处理出\(g[i][j][k]\)表示>=k的数的个数
然后这道题就华丽丽地解决啦
我们还有一个问题!
对于序列:2 2 2 2我们取多少才能达到高度\(2\),很明显取1个
但是程序会输出4
这个东西再二分一下还应该删除多少个不久好了吗。。。
竟然1A了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){x=0;char ch;bool flag = false;while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
int n,m,q;
namespace work1{const int maxn = 201;int a[maxn][maxn];int f[201][201][1001];int g[201][201][1001];int lim = 0,x1,y1,x2,y2;inline int calc_f(int k){return f[x2][y2][k] - f[x1-1][y2][k] - f[x2][y1-1][k] + f[x1-1][y1-1][k];}inline int calc_g(int k){return g[x2][y2][k] - g[x1-1][y2][k] - g[x2][y1-1][k] + g[x1-1][y1-1][k];}int main(){for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){read(a[i][j]);lim = max(lim,a[i][j]);}}for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){for(int k=1;k<=lim;++k){f[i][j][k] = f[i-1][j][k] + f[i][j-1][k] - f[i-1][j-1][k];g[i][j][k] = g[i-1][j][k] + g[i][j-1][k] - g[i-1][j-1][k];}for(int k=1;k<=a[i][j];++k){f[i][j][k] += a[i][j];g[i][j][k]++;}}}while(q--){read(x1);read(y1);read(x2);read(y2);int h;read(h);int l = 1,r = lim,ans = -1;while(l <= r){int mid = (l+r) >> 1;if(calc_f(mid) >= h) ans = mid,l = mid+1;else r = mid-1;}if(ans == -1) puts("Poor QLW");else{int x = calc_f(ans) - calc_f(ans+1);x /= ans;int y = calc_g(ans);int z = calc_f(ans);l = 0,r = x;x = 0;while(l <= r){int mid = (l+r) >> 1;if(z - mid*ans >= h) x = mid,l = mid+1;else r = mid-1;}y -= x;printf("%d\n",y);}}return 0;}
}
namespace work2{const int maxn = 500010;typedef pair<int,int> pa;struct Node{Node *ch[2];int sum,num;}*null;inline void init(){null = new Node;null->ch[0] = null->ch[1] = null;null->sum = null->num = 0;}Node *rt[maxn];inline Node* insert(Node *rt,int l,int r,int val){Node *p = new Node();(*p) = (*rt);if(l == r){p->sum += val;p->num ++ ;return p;}int mid = (l+r) >> 1;if(val <= mid) p->ch[0] = insert(rt->ch[0],l,mid,val);else p->ch[1] = insert(rt->ch[1],mid+1,r,val);p->sum = p->ch[0]->sum + p->ch[1]->sum;p->num = p->ch[0]->num + p->ch[1]->num;return p;}int pos = -1,cnt = -1;inline pa query(Node *x,Node *y,int l,int r,int h){if(l == r){pos = l;cnt = y->num - x->num;return make_pair(y->sum - x->sum,y->num - x->num);}int mid = (l+r) >> 1,sum = y->ch[1]->sum - x->ch[1]->sum;if(sum < h){pa tmp = query(x->ch[0],y->ch[0],l,mid,h-sum);tmp.first += y->ch[1]->sum - x->ch[1]->sum;tmp.second += (y->ch[1]->num - x->ch[1]->num);return tmp;}else return query(x->ch[1],y->ch[1],mid+1,r,h);}int main(){init();n = m;rt[0] = null;for(int i=1,x;i<=n;++i){read(x);rt[i] = insert(rt[i-1],1,1000,x);}while(q--){int s,t;read(s);read(s);read(t);read(t);int h;read(h);pa x = query(rt[s-1],rt[t],1,1000,h);if(x.first < h){puts("Poor QLW");continue;}int l = 0,r = cnt,y = 0;while(l <= r){int mid = (l+r) >> 1;if(x.first - mid*pos >= h) y = mid,l = mid+1;else r = mid-1;}printf("%d\n",x.second - y);}return 0;}
}
int main(){read(n);read(m);read(q);if(n != 1) work1::main();else work2::main();getchar();getchar();return 0;
}

不得不说当时我开数组的时候浑身难受
一两个数组就100多MB下去了...

转载于:https://www.cnblogs.com/Skyminer/p/6421039.html

1926: 粟粟的书架 前缀和+二分+主席树相关推荐

  1. 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】

    题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...

  2. 【BZOJ1926】【SDOI2010】粟粟的书架(DP,主席树,二分)

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

  3. P2839 [国家集训队]middle 二分 + 主席树 在值域上建区间

    传送门 文章目录 题意: 思路: 题意: 思路: 我们先解决怎么判断中位数的问题,我们可以二分一个midmidmid,将<mid<mid<mid的值都变成−1-1−1,其他的数都变成 ...

  4. [国家集训队]middle(二分+主席树[中位数思维题])

    文章目录 点击查看 solution code 点击查看 solution 简单口胡一下就跑 考虑二分答案ansansans 区间[x1,x2],x1∈[a,b],x2∈[c,d][x1,x2],x1 ...

  5. 洛谷 P4094 [HEOI2016/TJOI2016]字符串 后缀数组+二分+主席树

    题目链接 后缀数组 题目分析: sa[i] – 第i小的后缀的编号 rank[i] --编号为i的后缀排第几: height[i] – 第i和第i-1的最长lcp最长公共前缀: 1.二分答案,答案肯定 ...

  6. BZOJ5343 [Ctsc2018]混合果汁 【二分 + 主席树】

    题目链接 BZOJ5343 题解 明显要二分一下美味度,然后用尽量少的价格去购买饮料,看看能否买到\(L\)升,然后看看能否控制价格在\(g\)内 尽量少的价格,就优先先选完便宜的饮料,由于询问的是一 ...

  7. 2019牛客多校第九场 H Cutting Bamboos (二分主席树)

    看到题解说二分 心里也有数了..... H Cutting Bamboos 给了一些高度得柱子 每区间你可以坎y次 y次之后 必须砍没有了 没有砍 总长度得一样 问第x次砍得高度在哪里 因为砍得次数 ...

  8. Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...

  9. P2468 [SDOI2010]粟粟的书架 主席树 + 二分 + 二维前缀和

    传送门 文章目录 题意: 题意: 题意: 给你一个n∗mn*mn∗m的矩阵,每次询问一个矩形,左上角是(x1,y1)(x_1,y_1)(x1​,y1​),右上角是(x2,y2)(x_2,y_2)(x2 ...

  10. 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)

    传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...

最新文章

  1. Redis的应用场景及优缺点
  2. SAP Fiori Elements 应用的 manifest.json 文件运行时如何被解析的
  3. php 配置远程调试,PHP Linux 环境下搭建 XDEBUG并配置远程调试
  4. Java中的Enum的使用与分析
  5. 1.1 BeautifulSoup使用方法
  6. 简历python技能怎么写_简历怎么写?列出这10项重要的工作技能
  7. Python3网络爬虫快速入门实战解析——对大佬部分代码失效的修改
  8. 罗永浩出任“鲨纹科技”首席忽悠官;华为生产不含美国芯片的手机;PyCharm 2019.3 发布 | 极客头条...
  9. 类名作为形式参数传递
  10. 微信小程序添加icon图标教程
  11. Javascript 特效大全
  12. 快解析v6.5.3版本,添加端口映射教程
  13. e路航LH900N导航仪凯立德最新版本地图更新方法
  14. LoadLibrary无法加载DLL解决思路
  15. 32位计算机多少位寻址,32位的cpu的寻址能力到底是多少?
  16. uniapp对接腾讯即时通讯TIM 发图片消息问题
  17. Android实现垂直型的SeekBar
  18. mysql 把换行符全部删掉_mysql怎么去除字段中换行符与回车符
  19. 为什么快捷指令无法将媒体转换为文本_CAD一些操作技巧(快捷键)
  20. 在 JavaScript 中对数组进行 for-each

热门文章

  1. *-mapper.xml配置文件
  2. python中包引入遇到的问题
  3. 客户机无法上网,ping 127.0.0.1提示unable to contact IP driver ,error code2
  4. SQL结构化数据查询语言培训讲义
  5. 认识Node.js篇
  6. zookeeper相关知识与集群搭建
  7. 浅谈代码审计入门实战:某博客系统最新版审计之旅
  8. pytest学习(2)
  9. 大龄屌丝自学笔记--Java零基础到菜鸟--006
  10. 虚拟机备份克隆导致SQL SERVER 出现IO错误案例