[SDOI2010] 粟粟的书架
题目描述:
给出 N * M 的 表格 每个位置有一个权值 K
给出 Q 个查询
每次查询限定一个矩形区域 问至少在本矩形区域内取出多少个元素才可以>=Qi
题目分析:
YY了半天没想出来
看了下数据范围就懂了!
对于50%的数据,满足R, C≤200,M≤200,000;
另有50%的数据,满足R=1,C≤500,000,M≤20,000;
很明显是要我们分情况写算法
前50%数据 由于范围较小 我们可以直接 开数组维护矩形前缀和
num[i][j][k]表示以i,j,为右上角的且元素>=k矩形前缀和
f[i][j][k]表示以i,j为右上角的且元素>=k的矩形元素个数
对于每个查询 我们二分一个 高度
那么答案即为 元素个数-(高度和-查询)/答案高度
预处理 O(M*N*1000) 查询 O(Q*LogH)
对于后50%数据
从矩形变成了线段,那么我们考虑也像上面一样维护一样的东西,只是变成了主席树维护
查询答案也为二分查询
BZOJ卡一下内存
题目链接:
;uogu 2468
BZOJ 1926
Ac 代码:
#include <cstdio>
#include <iostream>
#define il inline
const int maxm1=5000010;
const int N=1000;
int sum[maxm1*2],v[maxm1*2],ls[maxm1*2],rs[maxm1*2],root[maxm1],sz;
int n,m,q;
int f[202][210][N+10],num[202][202][N+10],mx[210][210];
void insert(int &now,int pre,int l,int r,int k)
{now=++sz;ls[now]=ls[pre],rs[now]=rs[pre],sum[now]=sum[pre]+k,v[now]=v[pre]+1;if(l==r) return;int mid=(l+r)>>1;if(k<=mid) insert(ls[now],ls[pre],l,mid,k);else insert(rs[now],rs[pre],mid+1,r,k);
}
il int getans1(int x,int y,int k)
{int l=1,r=1000,ans=0;x=root[x-1],y=root[y];if(sum[y]-sum[x]<k) return -1;while(l<r){int mid=(l+r)>>1;
int sumx=sum[rs[y]]-sum[rs[x]];
if(sumx<k)
{ ans+=(v[rs[y]]-v[rs[x]]);
k-=sumx,r=mid;
x=ls[x],y=ls[y];
}
else
{ l=mid+1;
x=rs[x],y=rs[y];
}}return ans+(k+l-1)/l;
}
il void work1()
{for(int i=1,x;i<=m;i++)
scanf("%d",&x),insert(root[i],root[i-1],1,N,x);for(int i=1;i<=q;i++){int x1,x2,y1,y2,k,d;scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&k);if(~(d=getans1(y1,y2,k))) printf("%d\n",d);else printf("Poor QLW\n");}
}
il int getans2(int x1,int y1,int x2,int y2,int k)
{x1--,y1--;int l=0,r=N+10;while(l+1<r){int mid=(l+r)>>1;
if(num[x2][y2][mid]-num[x2][y1][mid]-num[x1][y2][mid]+num[x1][y1][mid]>=k) l=mid;
else r=mid;}if(!l) return -1;int ans1=num[x2][y2][l]-num[x2][y1][l]-num[x1][y2][l]+num[x1][y1][l]-k;int ans2=f[x2][y2][l]-f[x2][y1][l]-f[x1][y2][l]+f[x1][y1][l];return ans2-ans1/l;
}
il void work2()
{for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)scanf("%d",&mx[i][j]);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)for(int k=1;k<=N;k++){f[i][j][k]=f[i][j-1][k]+f[i-1][j][k]-f[i-1][j-1][k];num[i][j][k]=num[i][j-1][k]+num[i-1][j][k]-num[i-1][j-1][k];if (mx[i][j]>=k) f[i][j][k]++,num[i][j][k]+=mx[i][j];
}
for(int i=1;i<=q;i++)
{ int x1,x2,y1,y2,k,d;
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&k);
if(~(d=getans2(x1,y1,x2,y2,k))) printf("%d\n",d);
else printf("Poor QLW\n");
}
}
int main()
{scanf("%d%d%d",&n,&m,&q);if(n==1) work1();else work2();return 0;
}
[SDOI2010] 粟粟的书架相关推荐
- P2468 [SDOI2010]粟粟的书架 主席树 + 二分 + 二维前缀和
传送门 文章目录 题意: 题意: 题意: 给你一个n∗mn*mn∗m的矩阵,每次询问一个矩形,左上角是(x1,y1)(x_1,y_1)(x1,y1),右上角是(x2,y2)(x_2,y_2)(x2 ...
- Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...
- 【BZOJ1926】【SDOI2010】粟粟的书架(DP,主席树,二分)
Description 幸福幼儿园B29班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢Thomas H. Cormen的文章.粟粟家中有一个R行C列的巨型书架,书架的每一个位 ...
- [SDOI2010]粟粟的书架
Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R行C 列的巨型书架,书 ...
- 粟粟的书架(主席树+前缀和)
题目链接粟粟的书架 题目大意: 给你一个 n × m n \times m n×m的矩阵, q q q个询问, 每次给你一个左上角在 ( x 1 , y 1 ) (x1,y1) (x1,y1),右下角 ...
- 粟粟的书架(主席树+二维前缀和)
粟粟的书架 一下子做了两个题? 题意:一个问题求区间前K大的和,另一个问题求矩形内前K大的和. 思路: 前一个问题直接上主席树+二分搞定 后一个问题由于数据范围比较小,用 c n t [ i ] [ ...
- P2468 [SDOI2010]粟粟的书架 动态规划,主席树,二分答案
题目 洛谷题目链接 题解 题目的数据范围非常奇怪,一半是200∗200200∗200200*200的矩阵,另一半是1∗500001∗500001*50000的矩阵,显然是一道二合一的题目,但是不一样的 ...
- 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)
传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...
- P2468-[SDOI2010]粟粟的书架【主席树,二维前缀和】
正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P2468 题目大意 对于每一个询问,求一个区域内最少取多少个数使它们的 ...
最新文章
- J0ker的CISSP之路:复习-Information Security Management(4)
- .net core webapi 通过swagger生成说明文档
- 必须要调整心态,积极起来,不能再偷懒
- SAP 请求号单个传输方法
- Win10系统的SurfacePro4如何重装系统-3 重装完成之后的系统优化
- [Linux]结合awk删除hdfs指定日期前的数据
- VUE如何操作DOM
- java对象内存占用情况分析
- 21、java中的反射机制
- html中高与行高的区别,深入了解css的行高Line Height属性
- Github+jsDelivr为脚本/图片等静态文件加速的全球CDN
- 上位机通过串口获取单片机数据
- no segments* file found in org.apache.lucene.store.SimpleFSDirectory
- 奇怪,有的Python函数或方法调用需要两对括号?
- (转载)C,C++,C#三者区别
- 如何用DOM4J编程使用xml schema
- Rust 程序语言资料
- Android 车载应用开发与分析(12) - SystemUI (一)
- python输入某年某月某日是一年的第几天_Python小例子——输入某年某月某日,判断这一天是这一年的第几天...
- MT4单均线变色代码实例
热门文章
- 谷歌earth下载_如何:使用Google Earth和SketchItUp可视化新房-第2部分
- BitTorrent的协议及.torrent文件格式
- 下载youtube 在线工具_9个无需下载的免费在线工具,都是你工作中经常用得到的!...
- 浅析关于建筑行业 内部管理系统
- 网红是完全从草根中产 的一群明星
- 关于presentation 中连接词的 使用
- Cocos Creator 从下载图片到手机本地相册
- emwin 部分汉字编译时错误解决办法。
- 浙江大学计算机学院搞能源,CPUFPGA混合架构上的硬件线程加速方法-浙江大学计算机学院.PDF...
- java automapper 使用_AutoMapper实际项目运用