bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1926
题面;
1926: [Sdoi2010]粟粟的书架
Time Limit: 30 Sec Memory Limit: 512 MB
Submit: 1669 Solved: 618
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
14 15 9 26 53
58 9 7 9 32
38 46 26 43 38
32 7 9 50 28
8 41 9 7 17
1 2 5 3 139
3 1 5 5 399
3 3 4 5 91
4 1 4 1 33
1 3 5 4 185
3 3 4 3 23
3 1 3 3 108
Sample Output
15
2
Poor QLW
9
1
3
HINT
#include<bits/stdc++.h>
using namespace std;
const int M = 5e5+;
int ls[M*],rs[M*],sum[M*],idx,rt[M],num[M*],n,m;
int mp[][],s[][][],t[][][],v[];
void update(int old,int &k,int p,int c,int l,int r){
k = ++idx;
ls[k] = ls[old]; rs[k] = rs[old];
sum[k] = sum[old] + c;
num[k] = num[old] + ;
if(l == r) return ;
int mid = (l + r) >> ;
if(p <= mid) update(ls[old],ls[k],p,c,l,mid);
else update(rs[old],rs[k],p,c,mid+,r);
} int query(int old,int k,int L,int R,int l,int r){
if(L <= l&&R >= r){
return sum[k] - sum[old];
}
int mid = (l + r) >> ;
int ret = ;
if(L <= mid) ret += query(ls[old],ls[k],L,R,l,mid);
if(R > mid) ret += query(rs[old],rs[k],L,R,mid+,r);
return ret;
} int ask(int old,int k,int L,int R,int l,int r){
if(L <= l&&R >= r){
return num[k] - num[old];
}
int mid = (l + r) >> ;
int ret = ;
if(L <= mid) ret += ask(ls[old],ls[k],L,R,l,mid);
if(R > mid) ret += ask(rs[old],rs[k],L,R,mid+,r);
return ret;
} void init(){
for(int i = ;i <= n;i ++){
for(int j = ;j <= m;j ++){
for(int k = ;k <= ;k ++){
t[i][j][k] = t[i-][j][k]+t[i][j-][k]-t[i-][j-][k];
}
t[i][j][mp[i][j]] += ;
}
}
for(int i = ;i <= n;i ++){
for(int j = ;j <= m;j ++){
for(int k = ;k >= ;k --){
s[i][j][k] = s[i][j][k+]+t[i][j][k]*k;
t[i][j][k] += t[i][j][k+];
}
}
}
} int getsum(int k,int x1,int y1,int x2,int y2){
//cout<<s[x2][y2][k]<<" "<<s[x1-1][y1-1][k]<<" "<<s[x1-1][y2][k]<<endl;
int num = s[x2][y2][k] + s[x1-][y1-][k] - s[x1-][y2][k] - s[x2][y1-][k];
return num;
} int getnum(int k,int x1,int y1,int x2,int y2){
int num = t[x2][y2][k] + t[x1-][y1-][k] - t[x1-][y2][k] - t[x2][y1-][k];
return num;
} int main()
{
int p,x1,x2,y1,y2,h;
scanf("%d%d%d",&n,&m,&p);
for(int i = ;i <= n;i ++){
for(int j = ;j <= m;j ++){
cin>>mp[i][j],v[mp[i][j]]++;
}
}
if(n <= &&m <= ){
init();
for(int i = ;i <= p;i ++){
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&h);
int l = ,r = ,ans = ,id=-;
while(l <= r){
int mid = (l + r) >> ;
int num = getsum(mid,x1,y1,x2,y2);
if(num >= h){
id = mid,ans = num,l = mid+;
}
else r = mid-;
}
if(id == -){
printf("Poor QLW\n"); continue;
}
int cur = getnum(id,x1,y1,x2,y2);
while(ans-id>=h){
ans-=id; cur--;
}
printf("%d\n",cur);
}
}
else{
for(int i = ;i <= m;i ++)
update(rt[i-],rt[i],mp[][i],mp[][i],,M);
for(int i = ;i <= p;i ++){
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&h);
int l = ,r = ,ans = ,id = -;
while(l <= r){
int mid = (l + r) >> ;
int num = query(rt[y1-],rt[y2],mid,M,,M);
if(num >= h){
id = mid,ans = num,l = mid+;
}
else r = mid-;
}
if(id == -){
printf("Poor QLW\n"); continue;
}
int cur = ask(rt[y1-],rt[y2],id,M,,M);
while(ans-id>=h){
ans-=id; cur--;
}
printf("%d\n",cur);
}
}
return ;
}
bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)的更多相关文章
- BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)
BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...
- BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)
题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...
- 2018湘潭邀请赛C题(主席树+二分)
题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...
- 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...
- HDU - 4866 主席树 二分
题意:在x轴\([1,X]\)内的上空分布有n个占据空间\([L_i,R_i]\),高度\(D_i\)的线段,射中线段的得分为其高度,每次询问从x轴的\(x\)往上空射的最近k个线段的总得分,具体得分 ...
- POJ 6621: K-th Closest Distance(主席树 + 二分)
K-th Closest Distance Time Limit: 20000/15000 MS (Java/Others) Memory Limit: 524288/524288 K (Jav ...
- HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)
HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分) 传送门:http://acm.hdu.edu.cn/showproblem.php? ...
- Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...
- 【刷题】BZOJ 1926 [Sdoi2010]粟粟的书架
Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R行C 列的巨型书架,书 ...
随机推荐
- EasyUI 使用tabs切换后datagrid显示不了内容
今天刚遇到这个问题,找了下各群的深度合作伙伴,没有好的答案,那就自己研究吧. 问题点在于打开tab1时,快速切到tab2,这时tab1的datagrid渲染未完成,再次回到tab1,因为是在不可见区域 ...
- 菜鸟先飞C#学习总结(一)
一.第一个程序Hellow Word using System; //using 关键字用于在程序中包含 System 命名空间. 一个程序一般有多个 using 语句. using System.C ...
- Redis入门简述
Redis 是一个开源的,使用 ANSI C (C语言)编写,高性能的 Key-Value(键值对) 的 NoSQL 数据库 NoSQL = Not Only SQL,意即“不仅仅是SQL”,是一项全 ...
- JavaScript是如何工作的:引擎,运行时和调用堆栈的概述!
摘要: 理解JS执行原理. 原文:JavaScript是如何工作的:引擎,运行时和调用堆栈的概述! 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 本文是旨在深入研究JavaScrip ...
- http协议、模块、express框架以及路由器、中间件和mysql模块
一.http协议 是浏览器和web服务器之间的通信协议 1.通用头信息 request url:请求的url,向服务器请求的数据 request method:请求的方式 get.post sta ...
- php封装生成随机数函数
随机数函数Random(num,min,max): num:生成的个数 min:最小的数 max:最大的数. <?php //生成随机20个1-80内不重复的随机数 //思路:也没什么思路,就是 ...
- C#中++i与i++的区别
日常编程中经常用到++i与i++,知识点虽然很小,但有时候会犯迷糊,在这里小小的记录一下. ++i 即前递增,顾名思义也就是先自增后传值: 举个栗子 int i=5; int j=++i; 此时i的值 ...
- iBatis第二章:搭建一个简单的iBatis开发环境
使用 iBatis 框架开发的基本步骤如下:1.新建项目(iBatis是持久层框架,可以运用到java工程或者web工程都可以) 这里我们建立一个 web 工程测试. 2.导入相应的框架 jar 包 ...
- memcached架构及缓存策略
----------------------------------------概述---------------------------------------- Memcached是一套高性能分布 ...
- Docker: Jenkins里的pipeline编写基本技巧
Jenkins里,先新建一个pipeline项目 Pipeline Syntax 在Sample Step里选择需要的插件,如果不存在,就去系统管理,插件管理里,进行安装. 如果源码管理工具用的是gi ...