粟粟的书架

一下子做了两个题?
题意:一个问题求区间前K大的和,另一个问题求矩形内前K大的和。

思路:

  1. 前一个问题直接上主席树+二分搞定
  2. 后一个问题由于数据范围比较小,用 c n t [ i ] [ j ] [ k ] cnt[i][j][k] cnt[i][j][k]记录前缀矩形中大于等于 k k k的数有多少个,用 p r e [ i ] [ j ] [ k ] pre[i][j][k] pre[i][j][k]记录前缀矩形中大于等于 k k k的数的和。利用这两个东西套两个二分即可
  3. 代码清晰易懂,就不讲了

题面描述

#include "bits/stdc++.h"
#define hhh printf("hhh\n")
#define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
using namespace std;
typedef long long ll;
typedef pair<int,int> pr;
inline int read() {int x=0;char c=getchar();while(c<'0'||c>'9')c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x;}const int maxn = 5e5+10;
const int mod = 1e9+7;
const double eps = 1e-9;int n, m, t, tot;
int h[maxn], T[maxn<<5];
int sz[maxn<<5], L[maxn<<5], R[maxn<<5];
ll sum[maxn<<5];void update(int x, int l, int r, int pre, int &now) {now=++tot;L[now]=L[pre], R[now]=R[pre], sz[now]=sz[pre]+1, sum[now]=sum[pre]+x;if(l==r) return;int m=(l+r)/2;if(x<=m) update(x,l,m,L[pre],L[now]);else update(x,m+1,r,R[pre],R[now]);
}ll qksum(int k, int x, int y, int l, int r) {if(l==r) return k*l;int s=sz[R[y]]-sz[R[x]];int m=(l+r)/2;if(s>=k) return qksum(k,R[x],R[y],m+1,r);else return sum[R[y]]-sum[R[x]]+qksum(k-s,L[x],L[y],l,m);
}ll pre[205][205][1005];
int cnt[205][205][1005];inline int QAQ(int k, int x1, int y1, int x2, int y2) {return cnt[x2][y2][k]-cnt[x2][y1-1][k]-cnt[x1-1][y2][k]+cnt[x1-1][y1-1][k];
}inline ll qsum(int k, int x1, int y1, int x2, int y2) {int l=1, r=1001, mid=(l+r)/2;while(l<r) {if(QAQ(mid,x1,y1,x2,y2)<k) r=mid;else l=mid+1;mid=(l+r)/2;}int cnt=QAQ(mid,x1,y1,x2,y2);ll sum=pre[x2][y2][mid]-pre[x2][y1-1][mid]-pre[x1-1][y2][mid]+pre[x1-1][y1-1][mid];return sum+=1ll*(k-cnt)*(mid-1);
}int main() {//ios::sync_with_stdio(false); cin.tie(0);n=read(), m=read(), t=read();if(n==1) { //前一个问题,主席树for(int i=1; i<=m; ++i) update(read(),1,1000,T[i-1],T[i]);for(int i=0; i<t; ++i) {int x1=read(), y1=read()-1, x2=read(), y2=read(), H=read();int l=1, r=y2-y1+1, mid=(l+r)/2;while(l<r) {if(qksum(mid,T[y1],T[y2],1,1000)<H) l=mid+1;else r=mid;mid=(l+r)/2;}if(mid==y2-y1+1) printf("Poor QLW\n");else printf("%d\n", mid);}}else { //后一个问题,后一个问题二维前缀和for(int i=1; i<=n; ++i) {for(int j=1; j<=m; ++j) {int k=read();pre[i][j][k]=k, cnt[i][j][k]=1;}}for(int i=1; i<=n; ++i) {for(int j=1; j<=m; ++j) {for(int k=1000; k; --k)pre[i][j][k]+=pre[i][j][k+1], cnt[i][j][k]+=cnt[i][j][k+1];for(int k=1000; k; --k) {pre[i][j][k]+=pre[i-1][j][k]+pre[i][j-1][k]-pre[i-1][j-1][k];cnt[i][j][k]+=cnt[i-1][j][k]+cnt[i][j-1][k]-cnt[i-1][j-1][k];}}}for(int i=0; i<t; ++i) {int x1=read(), y1=read(), x2=read(), y2=read(), H=read();int tot=(x2-x1+1)*(y2-y1+1);int l=1, r=tot+1, mid=(l+r)/2;while(l<r) {if(qsum(mid,x1,y1,x2,y2)<H) l=mid+1;else r=mid;mid=(l+r)/2;}if(mid==tot+1) printf("Poor QLW\n");else printf("%d\n", mid);}}
}

粟粟的书架(主席树+二维前缀和)相关推荐

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

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

  2. 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)

    题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...

  3. loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...

    $ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...

  4. 海啸(二维前缀和/二维树状数组)

    链接:https://ac.nowcoder.com/acm/problem/21862 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  5. Nowcoder farm ( 树状数组、二维前缀和、二维偏序 )

    题目链接 分析 : 最简单的想法当然就是去模拟 直接对每个施肥料的操作进行模拟.然后计算贡献 但是这显然会超时.这题需要换一个思维 对于一个土地(也就是二维平面上的一个点)的种类是 T' 如果它被操作 ...

  6. Monitor CodeForces - 846D ——二维前缀和

    Recently Luba bought a monitor. Mon itor is a rectangular matrix of size n × m. But then she started ...

  7. 二维前缀和+差分 HDU6514 Monitor

    Monitor [ HDU - 6514 ] 题目大意:给你个n×m的区域,每个区域被选中标记为1,没被选中标记为0,然后给一些标记的区域,查询若干个区域问是否有0的 一道二维前缀和的题目,想通没什么 ...

  8. 牛妹吃豆子(二维前缀和模板,修改+求和)

    调了半天忘了要求两次前缀和了. 先对前缀和数组进行修改, 第一次求前缀和得到的是修改后的原矩阵,再求一次前缀和得到二维前缀和,然后根据容斥定理求区间的二维前缀和即可 #include<iostr ...

  9. 【每日DP】day3 P1387 最大正方形(奇怪的DP增加了 / 二维前缀和)难度⭐⭐★

    奇怪的DP增加了 这道题,刚看见真是一脸懵逼,看了题解才明白. 本题中神奇的转移方程是: f[i][j]=min(min(f[i][j−1],f[i−1][j]),f[i−1][j−1])+1f[i] ...

最新文章

  1. pyqt5讲解5:窗口绘图类控件QPainter,QPen,QBrush,QPixmap
  2. 前端开发流程与组件化
  3. linux文件 内存映射 锁,linux – mmap:将映射文件立即加载到内存中吗?
  4. 番茄花园win11 32位官方纯净版镜像v2021.07
  5. 微信授权,重定向两次
  6. 在线考试系统源码 在线教育源码
  7. matlab2014b下载 32位,matlab 2014b 32位
  8. 126套Unity3D视频教程全集(包含入门、编程、特效、UI、动画、实战等等)
  9. python自动翻译视频字幕_python自动翻译实现方法
  10. PLC和工控机有什么关系?
  11. 安利一款倒计时插件---雨滴桌面
  12. 分析微信聊天记录(2)——分析单人的微信聊天记录
  13. MongoDB分片机制
  14. 美颜相机android版,美颜相机手机版
  15. 我们应如何度过自己的大学生活?
  16. 安装应用提示安装失败或不能安装,报INSTALL_FAILED_DUPLICATE_PERMISSION错误
  17. 求和(单例模式,初始化列表,容器,迭代器)
  18. 网络安全兼职注意事项
  19. HDU 1083 Coures(二分图匹配)
  20. 网页设计~登陆页面源代码

热门文章

  1. 安卓手机如何防盗_安卓手机如何使用GooglePlay和APP应用
  2. 每日干货分享:扫描文字识别软件哪个好?
  3. 计算机硬片,PVC 硬片拉伸强度试验机
  4. 【C#】机房重构——七层登录
  5. 高德地图获取行政区域以及中心点
  6. Java-蓝桥算法圆的面积,序列求和
  7. 本题要求实现函数输出n行字符金字塔。
  8. GitHub狗屁不通文章生成器
  9. 通过链接自动生成二维码
  10. 一个简单的双骰子游戏