粟粟的书架(主席树+二维前缀和)
粟粟的书架
一下子做了两个题?
题意:一个问题求区间前K大的和,另一个问题求矩形内前K大的和。
思路:
- 前一个问题直接上主席树+二分搞定
- 后一个问题由于数据范围比较小,用 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的数的和。利用这两个东西套两个二分即可
- 代码清晰易懂,就不讲了
题面描述
#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);}}
}
粟粟的书架(主席树+二维前缀和)相关推荐
- P2468-[SDOI2010]粟粟的书架【主席树,二维前缀和】
正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P2468 题目大意 对于每一个询问,求一个区域内最少取多少个数使它们的 ...
- 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)
题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...
- loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...
$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...
- 海啸(二维前缀和/二维树状数组)
链接:https://ac.nowcoder.com/acm/problem/21862 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- Nowcoder farm ( 树状数组、二维前缀和、二维偏序 )
题目链接 分析 : 最简单的想法当然就是去模拟 直接对每个施肥料的操作进行模拟.然后计算贡献 但是这显然会超时.这题需要换一个思维 对于一个土地(也就是二维平面上的一个点)的种类是 T' 如果它被操作 ...
- Monitor CodeForces - 846D ——二维前缀和
Recently Luba bought a monitor. Mon itor is a rectangular matrix of size n × m. But then she started ...
- 二维前缀和+差分 HDU6514 Monitor
Monitor [ HDU - 6514 ] 题目大意:给你个n×m的区域,每个区域被选中标记为1,没被选中标记为0,然后给一些标记的区域,查询若干个区域问是否有0的 一道二维前缀和的题目,想通没什么 ...
- 牛妹吃豆子(二维前缀和模板,修改+求和)
调了半天忘了要求两次前缀和了. 先对前缀和数组进行修改, 第一次求前缀和得到的是修改后的原矩阵,再求一次前缀和得到二维前缀和,然后根据容斥定理求区间的二维前缀和即可 #include<iostr ...
- 【每日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] ...
最新文章
- pyqt5讲解5:窗口绘图类控件QPainter,QPen,QBrush,QPixmap
- 前端开发流程与组件化
- linux文件 内存映射 锁,linux – mmap:将映射文件立即加载到内存中吗?
- 番茄花园win11 32位官方纯净版镜像v2021.07
- 微信授权,重定向两次
- 在线考试系统源码 在线教育源码
- matlab2014b下载 32位,matlab 2014b 32位
- 126套Unity3D视频教程全集(包含入门、编程、特效、UI、动画、实战等等)
- python自动翻译视频字幕_python自动翻译实现方法
- PLC和工控机有什么关系?
- 安利一款倒计时插件---雨滴桌面
- 分析微信聊天记录(2)——分析单人的微信聊天记录
- MongoDB分片机制
- 美颜相机android版,美颜相机手机版
- 我们应如何度过自己的大学生活?
- 安装应用提示安装失败或不能安装,报INSTALL_FAILED_DUPLICATE_PERMISSION错误
- 求和(单例模式,初始化列表,容器,迭代器)
- 网络安全兼职注意事项
- HDU 1083 Coures(二分图匹配)
- 网页设计~登陆页面源代码