题目描述:

给出 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] 粟粟的书架相关推荐

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

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

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

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

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

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

  4. [SDOI2010]粟粟的书架

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

  5. 粟粟的书架(主席树+前缀和)

    题目链接粟粟的书架 题目大意: 给你一个 n × m n \times m n×m的矩阵, q q q个询问, 每次给你一个左上角在 ( x 1 , y 1 ) (x1,y1) (x1,y1),右下角 ...

  6. 粟粟的书架(主席树+二维前缀和)

    粟粟的书架 一下子做了两个题? 题意:一个问题求区间前K大的和,另一个问题求矩形内前K大的和. 思路: 前一个问题直接上主席树+二分搞定 后一个问题由于数据范围比较小,用 c n t [ i ] [ ...

  7. P2468 [SDOI2010]粟粟的书架 动态规划,主席树,二分答案

    题目 洛谷题目链接 题解 题目的数据范围非常奇怪,一半是200∗200200∗200200*200的矩阵,另一半是1∗500001∗500001*50000的矩阵,显然是一道二合一的题目,但是不一样的 ...

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

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

  9. P2468-[SDOI2010]粟粟的书架【主席树,二维前缀和】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P2468 题目大意 对于每一个询问,求一个区域内最少取多少个数使它们的 ...

最新文章

  1. J0ker的CISSP之路:复习-Information Security Management(4)
  2. .net core webapi 通过swagger生成说明文档
  3. 必须要调整心态,积极起来,不能再偷懒
  4. SAP 请求号单个传输方法
  5. Win10系统的SurfacePro4如何重装系统-3 重装完成之后的系统优化
  6. [Linux]结合awk删除hdfs指定日期前的数据
  7. VUE如何操作DOM
  8. java对象内存占用情况分析
  9. 21、java中的反射机制
  10. html中高与行高的区别,深入了解css的行高Line Height属性
  11. Github+jsDelivr为脚本/图片等静态文件加速的全球CDN
  12. 上位机通过串口获取单片机数据
  13. no segments* file found in org.apache.lucene.store.SimpleFSDirectory
  14. 奇怪,有的Python函数或方法调用需要两对括号?
  15. (转载)C,C++,C#三者区别
  16. 如何用DOM4J编程使用xml schema
  17. Rust 程序语言资料
  18. Android 车载应用开发与分析(12) - SystemUI (一)
  19. python输入某年某月某日是一年的第几天_Python小例子——输入某年某月某日,判断这一天是这一年的第几天...
  20. MT4单均线变色代码实例

热门文章

  1. 谷歌earth下载_如何:使用Google Earth和SketchItUp可视化新房-第2部分
  2. BitTorrent的协议及.torrent文件格式
  3. 下载youtube 在线工具_9个无需下载的免费在线工具,都是你工作中经常用得到的!...
  4. 浅析关于建筑行业 内部管理系统
  5. 网红是完全从草根中产 的一群明星
  6. 关于presentation 中连接词的 使用
  7. Cocos Creator 从下载图片到手机本地相册
  8. emwin 部分汉字编译时错误解决办法。
  9. 浙江大学计算机学院搞能源,CPUFPGA混合架构上的硬件线程加速方法-浙江大学计算机学院.PDF...
  10. java automapper 使用_AutoMapper实际项目运用