[SDOI2010]粟粟的书架

[SDOI2010]粟粟的书架

题意:

一个R * C的矩阵,每个位置都有个数page[ij],现在选定一个小矩阵范围(给左上角坐标,和右下角坐标),问这个范围内的数总和是否大于h,如果大于h的话最少选几个数aij
对于50%的数据,满足R, C≤200,M≤200,000;
另有50%的数据,满足R=1,C≤500,000,M≤20,000;
对于100%的数据,满足1≤Pi,j≤1,000,1≤Hi≤2,000,000,000。

题解:

题目数据给的很奇特,一半是R,C均小于200,另一半R=1(R=1也就是只有一行)
对于前一半数据,我们可以搞一个二位前缀和,二分最小值
value[i][j][k]表示从(1,1)到(i,j)的矩阵中数值>=k的数的总和
num[i][j][k]表示从(1,1)到(i,j)的矩阵中数值>=k的个数
value是为了计算区间总和是否大于h,num用于二分选择数的最小值
num和val的维护就是前缀和经典的容斥原理

if(page[i][j]>=k)value[i][j][k]=value[i-1][j][k]+value[i][j-1][k]-value[i-1][j-1][k]+page[i][j];
else value[i][j][k]=value[i-1][j][k]+value[i][j-1][k]-value[i-1][j-1][k]+0;if(page[i][j]>=k)num[i][j][k]=num[i-1][j][k]+num[i][j-1][k]-num[i-1][j-1][k]+1;
else num[i][j][k]=num[i-1][j][k]+num[i][j-1][k]-num[i-1][j-1][k]+0;

在这里插入图片描述
对于后一半数据R=1,C<=5∗1055*10^55105,就不能用二位前缀和了,依旧是二分最小值,直接主席树就可以

代码:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll=1e18;
const int INF_int=0x3f3f3f3f;
inline ll read(){ll s=0,w=1ll;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
void rd_test(){#ifdef ONLINE_JUDGE#elsestartTime = clock(); //计时开始freopen("in.txt","r",stdin);#endif
}
void Time_test(){#ifdef ONLINE_JUDGE#elseendTime = clock(); //计时结束printf("\n运行时间为:%lfs\n",(double)(endTime - startTime) / CLOCKS_PER_SEC);#endif
}
int r,c,m;
const int maxn=204;
ll val[maxn][maxn][1003];
int page[maxn][maxn];
int num[maxn][maxn][1004];
inline ll getval(int a,int b,int x,int y,int k){return val[x][y][k]-val[x][b-1][k]-val[a-1][y][k]+val[a-1][b-1][k];
}
inline ll getnum(int a,int b,int x,int y,int k){return num[x][y][k]-num[x][b-1][k]-num[a-1][y][k]+num[a-1][b-1][k]; 
}
void work2(){int maxx=0;for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){scanf("%d",&page[i][j]);maxx=max(maxx,page[i][j]);}}for(int k=0;k<=maxx;k++){for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){if(page[i][j]>=k)val[i][j][k]=val[i-1][j][k]+val[i][j-1][k]-val[i-1][j-1][k]+page[i][j];else val[i][j][k]=val[i-1][j][k]+val[i][j-1][k]-val[i-1][j-1][k]+0;if(page[i][j]>=k)num[i][j][k]=num[i-1][j][k]+num[i][j-1][k]-num[i-1][j-1][k]+1;else num[i][j][k]=num[i-1][j][k]+num[i][j-1][k]-num[i-1][j-1][k]+0;}}}while(m--){int x1,y1,x2,y2;ll h;scanf("%d%d%d%d%lld",&x1,&y1,&x2,&y2,&h);ll ans=getval(x1,y1,x2,y2,0);if(ans<h)printf("Poor QLW\n");else {int l=0,r=maxx+1;while(l+1<r){int mid=(l+r)>>1;if(getval(x1,y1,x2,y2,mid)>=h)l=mid;else r=mid;}int maxnum=getnum(x1,y1,x2,y2,l);printf("%d\n",maxnum-((getval(x1,y1,x2,y2,l)-h)/l));}}
}
const int N=5500002;
int L[N],R[N],size[N],sum[N],rt[N],cnt;
inline void update(int &now,int pre,int l,int r,int x){now=++cnt;size[now]=size[pre]+1;sum[now]=sum[pre]+x;L[now]=L[pre];R[now]=R[pre];if(l==r)return ;int mid=l+r>>1;if(x<=mid)update(L[now],L[pre],l,mid,x);else update(R[now],R[pre],mid+1,r,x);
}
inline ll query(int Lrt,int Rrt,int l,int r,ll k){ll ans=0;while(l<r){int mid=(l+r)>>1;int Sum=sum[R[Rrt]]-sum[R[Lrt]];//优先取较大值,右侧 的数更大 if(Sum<k){ans+=size[R[Rrt]]-size[R[Lrt]];k-=Sum;r=mid;Rrt=L[Rrt];Lrt=L[Lrt]; }else if(Sum>=k){l=mid+1;Rrt=R[Rrt];Lrt=R[Lrt]; }}//debug("(k+l-1)/l",(k+l-1)/l);ans+=(k+l-1)/l;return ans; 
}
void work1(){int x;rt[0]=0;for(int i=1;i<=c;i++){scanf("%d",&x);update(rt[i],rt[i-1],1,1000,x);}while(m--){int x1,y1,x2,y2;ll h;scanf("%d%d%d%d%lld",&x1,&y1,&x2,&y2,&h);if(sum[rt[y2]]-sum[rt[y1-1]]<h){printf("Poor QLW\n");continue;}printf("%d\n",query(rt[y1-1],rt[y2],1,1000,h));} 
}
int main()
{rd_test();cin>>r>>c>>m;if(r==1)work1();else work2();//Time_test();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Asp.Net Core的简单社区项目源代码开源

2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0EF CORE 3.0开发使用vs2019 sqlserver 2017(数据库脚本最低支持sql server 2012/)使用步骤:1.下载相关开发工具2.运行数据库脚本目录下的相关脚本3.默认前端账号密码: 18812345678 1234564.默认后台账号密码: admin 123456开…

[学习笔记] 如果你愿意学那么你是可以看的懂的 —— 群论与 burnside 引理和 polya 定理

群与子群 <G,op><G,op><G,op> 是一个群需要满足以下条件&#xff1a; opopop 是一个满足结合律的二元运算&#xff0c;如 *&#xff0c;。GGG 是一个集合&#xff0c;存在单位元 eee。GGG 中所有元素都有逆元。即 GGG 对 opopop 运算封闭&#xff0c;封闭简单…

为什么从前那些.NET开发者都不写单元测试呢?

楔子四年前我虽然也写了很多年代码&#xff0c;由于公司虽然规模不小&#xff0c;却并非一家规范化的软件公司&#xff0c;因此在项目中严格意义上来说并没有架构设计、也不写单元测试&#xff0c;后来有幸加入了一家公司&#xff0c;这家公司虽然也是一家小公司&#xff0c;但…

使用 xUnit 编写 ASP.NET Core 单元测试

还记得 .NET Framework 的 ASP.NET WebForm 吗&#xff1f;那个年代如果要在 Web 层做单元测试简直就是灾难啊。.NET Core 吸取教训&#xff0c;在设计上考虑到了可测试性&#xff0c;就连 ASP.NET Core 这种 Web 或 API 应用要做单元测试也是很方便的。其中面向接口和依赖注入…

记录使用 Cake 进行构建并制作 nuget 包

前段时间折腾了一下&#xff0c;总算是把我自己的图片缓存控件&#xff08;https://github.com/h82258652/HN.Controls.ImageEx&#xff09;发布到了 nuget 上&#xff0c;目前已经进入一个比较稳定的版本了&#xff0c;基本没有很严重的 bug 了。其实核心代码早就写完了&#…

DDD领域驱动设计理论篇 - 学习笔记

一、Why DDD?在加入X公司后&#xff0c;开始了ASP.NET CoreDockerLinux的技术实践&#xff0c;也开始了微服务架构的实践。在微服务的学习中&#xff0c;有一本微软官方出品的《.NET微服务&#xff1a;容器化.NET应用架构指南》是我们学习的葵花宝典&#xff0c;纵观微软官方放…

.NetCore使用skywalking实现实时性能监控

一、简介很久之前写了一篇 《.Net Core 2.0 InfluxDBGrafanaApp Metrics 实现跨平台的实时性能监控》关于NetCore性能监控的文章&#xff0c;使用InfluxdbAppMetrics进行项目性能监控&#xff0c;由于技术有限&#xff0c;在正式环境使用一段时间后&#xff0c;莫名的AppMetric…

netcore开发windows普通服务(非Web)并一键发布到服务器

netcore下开发windows服务如果是web项目的话&#xff0c;由于aspnetcore本身是支持的&#xff0c;把默认的host.Run改为host.RunAsService就可以了。但是普通的netcore的控制台项目我终于找到了如下方式来实现&#xff1a;Microsoft.Extensions.HostingSystem.ServiceProcess.S…

Hopping Rabbit

Hopping Rabbit 题意&#xff1a; 给你n个矩阵&#xff0c;每个矩阵(给出左上标和右下标)&#xff0c;现在让你给出一个点的位置&#xff0c;这个点每次只能上下左右四个方向移动&#xff0c;且移动距离为d&#xff0c;是否存在一个这样的点&#xff0c;其所有落点都不在矩阵…

直播预告 - 微软MVP为你揭秘Visual Studio 2019新特性

作为"宇宙第一IDE“的Visual Studio集成开发环境&#xff0c;已经经历了超过十几年的迭代成为一款功能丰富且高效的开发工具&#xff0c;微软自己给Visual Studio 的定位是 “更快、更可靠&#xff0c;对个人和团队更具生产力&#xff0c;更易于使用&#xff0c;并且更容易…

.NET 机器学习生态调查

机器学习是一种允许计算机使用现有数据预测未来行为、结果和趋势的数据科学方法。 使用机器学习&#xff0c;计算机可以在未显式编程的情况下进行学习。机器学习的预测可以使得应用和设备更智能。 在线购物时&#xff0c;机器学习基于历史购买推荐你可能喜欢的其他产品。 刷信用…

图中异色点对最短距离(最小生成树+线段树)

problem 给定一个 nnn 个点&#xff0c;mmm 条边的无向连通图&#xff0c;图有边权&#xff0c;每个点有一个颜色。 有 qqq 次操作&#xff0c;每次操作可更改某一个点颜色。 求每次操作后图中不同颜色点之间的最短距离。 若图中点颜色全相同&#xff0c;输出 000。 一行给…

Defend Your Country

Defend Your Country 题意&#xff1a; n个点&#xff0c;m条边的简单无向连通图&#xff0c;每个点一个权值ai,一个连通块的贡献&#xff1a;(−1)块内点数∗∑ai[点i在该连通块内](-1)^{块内点数}*\sum a_{i}[点i在该连通块内](−1)块内点数∗∑ai​[点i在该连通块内] 可以…

SkyWalking Liunx 环境搭建NetCore接入

背景前两天看见有小哥介绍windows下安装skywalking的介绍地址。正好最近也在搭建linux环境的SkyWalking&#xff0c;顺便把linux环境搭建的经验分享下&#xff0c;帮助下使用linux部署DotNetCore项目的同学。介绍SkyWalking是开源的apm工具&#xff0c;服务器端使用java编写&am…

.NET 基金会完成第一次全面改选

.NET基金会是一个独立的组织&#xff0c;支持.NET社区和开源&#xff0c;旨在拓宽和加强.NET生态系统和社区。这可以通过多种方式完成&#xff0c;包括项目指导&#xff0c;指导&#xff0c;法律和营销帮助&#xff0c;技术和财务支持设置等&#xff0c;2014年微软组织成立.NET…

xay loves trees

xay loves trees 题意&#xff1a; 有两棵树&#xff0c;现在让你找到一个最大的点集合S&#xff0c;要求S中的点在第一棵树中任意两点存在祖先儿子关系且所有点是连接的&#xff0c;在第二棵树中任意两点都不存在祖先儿子关系&#xff0c;问S集合的最大是多少&#xff1f; …

特来电混沌工程实践

一、导语随着大型分布式系统架构的演进和广泛应用&#xff0c;软件工程的最佳实践也随之改变。我们通过分布式、服务化、DevOps、敏捷开发&#xff0c;快速响应业务的需求变化&#xff0c;支持大规模分布式应用。但这些做法带来效益的同时&#xff0c;也带来了另一个紧迫问题&a…

[ZJOI2007] 棋盘制作(单调栈 / DP悬线法)

problem 洛谷链接 solution1-单调栈 很容易想到&#xff0c;预处理出每个点向上最大能延伸的长度&#xff0c;然后对每个点求一个矩阵面积。 然后思考优化&#xff0c;不难想到每次对一行进行求解。 每一行的所有列一起构成了一个直方图。 直方图直接经典笛卡尔树。笛卡尔…

构建现代Web应用时究竟是选择传统web应用还是SPA

在大前端盛行的今天&#xff0c;似乎前后端分离的开发模式才是大势所趋&#xff0c;而SPA的概念更是应运而生。现在随便构建一个web应用程序如果你不是使用SPA的话&#xff0c;就会感觉有点low&#xff0c;但是真的是这样吗&#xff1f;今天这篇文章我们就来一起探讨下&#xf…

你所不知道的ASP.NET Core MVC/WebApi基础系列(二)

冒个泡&#xff0c;算起来估计有很长时间没更新公众号了&#xff0c;估计是我第一次停更如此之久&#xff0c;人总有懒惰的时候&#xff0c;时间越长越懒惰&#xff0c;但是呢&#xff0c;不学又不行&#xff0c;持续的惰性是不行dei&#xff0c;要不然会被时光所抛弃&#xff…