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

正题

评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P2468


题目大意

对于每一个询问,求一个区域内最少取多少个数使它们的和不小于a。


解题思路

我们肯定取最大的
对于前50%的数据,用
sumi,j,ksum_{i,j,k}sumi,j,k表示(1,1)(1,1)(1,1)(i,j)(i,j)(i,j)超过kkk的数字和
numi,j,knum_{i,j,k}numi,j,k表示(1,1)(1,1)(1,1)(i,j)(i,j)(i,j)超过kkk的数字个数
然后二分一下。

对于后50%的数据,其实就是询问lrl~rl r这个区间最少多少个数使它们的和不小于a。
我们可以用一个主席树,对于每个节点我们维护两个值sum,w。w是这个节点代表区域的数字个数,sum是这些数的和。然后用第rrr棵减去第l−1l-1l1棵就是一个区域内的值。之后更具sum跑,统计w就好了。


code

#include<cstdio>
#include<algorithm>
#define N50 210
#define N 500010
using namespace std;
int r,c,m;
int sum[N50][N50][1100],num[N50][N50][1100],a[N50][N50];
int get_sum(int x1,int y1,int x2,int y2,int k)
{return sum[x2][y2][k]-sum[x1-1][y2][k]-sum[x2][y1-1][k]+sum[x1-1][y1-1][k];
}
int get_num(int x1,int y1,int x2,int y2,int k)
{return num[x2][y2][k]-num[x1-1][y2][k]-num[x2][y1-1][k]+num[x1-1][y1-1][k];
}
void work1()//前50%
{int maxs=-1e9-7;for(int i=1;i<=r;i++)for(int j=1;j<=c;j++){scanf("%d",&a[i][j]);maxs=max(maxs,a[i][j]);}for(int k=1;k<=maxs;k++)for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)if(a[i][j]>=k){sum[i][j][k]=sum[i-1][j][k]+sum[i][j-1][k]-sum[i-1][j-1][k]+a[i][j];num[i][j][k]=num[i-1][j][k]+num[i][j-1][k]-num[i-1][j-1][k]+1;}else{sum[i][j][k]=sum[i-1][j][k]+sum[i][j-1][k]-sum[i-1][j-1][k];num[i][j][k]=num[i-1][j][k]+num[i][j-1][k]-num[i-1][j-1][k];}int x1,x2,y1,y2,h;for(int i=1;i<=m;i++){scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&h);if(get_sum(x1,y1,x2,y2,1)<h){printf("Poor QLW\n");continue;}int l=1,r=maxs,mid;while(l<r){mid=(l+r+1)>>1;if(get_sum(x1,y1,x2,y2,mid)>=h)l=mid;else r=mid-1;}printf("%d\n",get_num(x1,y1,x2,y2,l)-(get_sum(x1,y1,x2,y2,l)-h)/l);}
}
struct tree_node{int l,r,ls,rs,w,sum;
}t[10000010];
int cnt,root[N];
int build(int l,int r)//建空树
{int k=++cnt;t[k].l=l,t[k].r=r;if (l==r) return k;int mid=(l+r)>>1;t[k].ls=build(l,mid);t[k].rs=build(mid+1,r);return k;
}
int addt(int k,int z)//加新树
{int nb=++cnt;t[nb]=t[k];t[nb].w++;t[nb].sum+=z;if (t[k].l==z&&t[k].r==z) return nb;int mid=(t[k].l+t[k].r)>>1;if (z<=mid) t[nb].ls=addt(t[k].ls,z);else t[nb].rs=addt(t[k].rs,z);return nb;
}
int query(int k1,int k2,int k)//询问
{if (t[k1].l==t[k1].r) return (k+t[k1].l-1)/t[k1].l;int w=t[t[k2].rs].sum-t[t[k1].rs].sum;if (k<=w) return query(t[k1].rs,t[k2].rs,k);else return query(t[k1].ls,t[k2].ls,k-w)+t[t[k2].rs].w-t[t[k1].rs].w; 
}
void work2()//后50%的数据
{int x;root[0]=1;build(1,1000);for(int i=1;i<=c;i++){scanf("%d",&x);root[i]=cnt+1;addt(root[i-1],x);}int x1,x2,y1,y2,h;for(int i=1;i<=m;i++){scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&h);y1--;if(t[root[y2]].sum-t[root[y1]].sum<h) printf("Poor QLW\n");else printf("%d\n",query(root[y1],root[y2],h));}
}
int main()
{scanf("%d%d%d",&r,&c,&m);if(r==1) work2();else work1();
}

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

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

相关文章

【分享】通过手游赚¥

这本来是个回答&#xff0c;但是在知乎被删了&#xff0c;于是我决定还是在自己网站再发一份&#xff0c;特么知乎店大欺人&#xff0c;我一这么水回答&#xff0c;还被认为是广告营销 首先说明一点&#xff0c;这个完全是自我经历&#xff0c;一种分享吧。觉得假的自然假。 我…

C++描述杭电OJ 2008.数值统计 ||

C描述杭电OJ 2008.数值统计 || Problem Description 统计给定的n个数中&#xff0c;负数、零和正数的个数。 Input 输入数据有多组&#xff0c;每组占一行&#xff0c;每行的第一个数是整数n&#xff08;n<100&#xff09;&#xff0c;表示需要统计的数值的个数&#xff…

Azure Cosmos DB技术性解读

Azure Cosmos DB是微软公司打造的一项全球分布式、横向分区、多模型数据库服务。该服务允许客户弹性&#xff08;及独立形式&#xff09;跨越任意数量地理服务区对吞吐量与存储进行扩展。Azure Cosmos DB可立足第99百分位比例提升99.99%高可用性水平&#xff0c;提供可预测吞吐…

NOIP2018-普及总结

前言 原本说要去提高的&#xff0c;然后市里瞎搞&#xff0c;就去不了了QVQQVQQVQ。 总结 这次一看感觉题目比较难&#xff0c;所以基本凉凉… 首先这次有很多失误&#xff0c;特别是T2T2T2&#xff0c;其实很容易就分析出要用longlonglong\ \ longlong long的&#xff0c;但…

语音服务——阿里云

一、语音通知 语音通知是指通过调用语音呼叫的API&#xff0c;从运营商网络向指定号码发起一通呼叫&#xff0c;呼叫被应答后&#xff0c;播放一段指定的音频。 根据音频形式的不同&#xff0c;语音通知的API分为两个&#xff1a; 若播放的音频为固定内容的音频文件&#xf…

【博客】csdn搬家到wordpress

在wordpress的插件中搜索cnblogs2wp&#xff0c;安装后&#xff0c;在工具->导入->选博客搬家&#xff0c; 遇到了些问题 总是遇到博客地址不对 https://blog.csdn.net/weixin_43560272 首先修改了后缀 这是我的博客首页地址绝对没错的啊 后缀绝对改了的 总是说地址…

C++描述杭电OJ 2009.求数列的和 ||

C描述杭电OJ 2009.求数列的和 || Problem Description 数列的定义如下&#xff1a; 数列的第一项为n&#xff0c;以后各项为前一项的平方根&#xff0c;求数列的前m项的和。 Input 输入数据有多组&#xff0c;每组占一行&#xff0c;由两个整数n&#xff08;n<10000&…

P2323-[HNOI2006]公路修建问题【并查集】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP2323 题目大意 有n个点&#xff0c;m条边&#xff0c;对于每条边修二级公路和一级公路修建价格不同(一级比二级贵)。要求留下n-1条边使其成为一棵树且至少有k条一级公路&#xff0c;要求最贵的公路价…

Microsoft加入量子计算的竞争

Microsoft在Ignite大会上宣布了自己的量子计算新平台的预览版&#xff0c;并公开了借助近期粒子物理学方面的进展推出拓扑量子计算机的计划。 Microsoft的量子计算平台预览版将包括一个量子计算模拟器&#xff0c;以及一种集成在Visual Studio中的量子计算编程新语言。据Micros…

Window系统多硬盘设置新引导盘

一、系统启动过程 电脑通电后&#xff0c;首先是启动BIOS程序&#xff0c;BIOS自检完毕后&#xff0c;找到硬盘上的主引导记录MBR&#xff0c;MBR读取DPT&#xff08;分区表&#xff09;&#xff0c;从中找出活动的主分区&#xff0c;然后读取活动主分区的PBR&#xff08;分区引…

【Java】jdk和eclipse下载安装

&#xff08;以前忘了写这方面的安装&#xff09; 附一段测试java环境的代码 public class hello {public static void main(String[] args) {System.out.println("Hello World dsadasdaSasdasd");} }jdk安装&#xff1a; 这里我采用不同方式 直接360软件管家搜索jd…

C++描述杭电OJ 2010.水仙花数 ||

C描述杭电OJ 2010.水仙花数 || Problem Description 春天是鲜花的季节&#xff0c;水仙花就是其中最迷人的代表&#xff0c;数学上有个水仙花数&#xff0c;他是这样定义的&#xff1a; “水仙花数”是指一个三位数&#xff0c;它的各位数字的立方和等于其本身&#xff0c;比如…

使用BigQuery分析GitHub上的C#代码

一年多以前&#xff0c;Google 在GitHub中提供了BigQuery用于查询的GitHub上的开源代码&#xff08;open source code on GitHub available for querying&#xff09;&#xff0c;如果这还不够&#xff0c;您可以免费每月运行1TB的查询&#xff01; 所以在这篇文章中&#xff0…

NOIP2018普及组复赛解析

T1:标题统计 题目大意 输入一个字符串&#xff0c;求字符串除了空格的字符个数 解题思路 这种考你会不会编程的题不会&#xff1f; code #include<cstdio> #include<string> #include<iostream> using namespace std; int ans; string c; int main() {get…

Shell变量的初始值赋值

转载自 Shell变量的初始值赋值 通常在shell中&#xff0c;在变量值为空的时候我们要为变量设置一个默认值&#xff0c;避免在脚本运行的过程中报错&#xff0c;这就是变量的初始值赋值。 通常比较简洁的有以下两种&#xff0c;都能对一个变量赋予一个初始值&#xff0c; ${va…

【博客】博客转移

最近一直在搞博客&#xff0c;随着博客基本转移到wordpress&#xff0c;总算是告一段落。 我通过各种博客搬家的方式都没能把博客转移到wordpress上&#xff0c;后来实在没办法&#xff0c;强行Gutenberg编辑器&#xff0c;一个一个复制粘贴到自己博客上面&#xff0c;总算是实…

AspectCore中的IoC容器和依赖注入

IOC模式和依赖注入是近年来非常流行的一种模式&#xff0c;相信大家都不陌生了&#xff0c;在Asp.Net Core中提供了依赖注入作为内置的基础设施&#xff0c;如果仍不熟悉依赖注入的读者&#xff0c;可以看看由我们翻译的Asp.Net Core中文文档中依赖注入的相关章节: ASP.NET Cor…

[编程入门]阶乘求和:求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。

【题目描述】求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一个数字(n不超过20)。#include<iostream> using namespace std;void fun(int n) {long long sn0,s1;for(int i1;i<n;i){for(int j1;j<i;j){s*j;}sns;s1;}cout<<sn<<endl; }int main() {int n;c…

bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP4381 题目大意 有n个岛&#xff0c;n条无向边(保证每个岛都有边连到)。走过的路和岛不可以重走&#xff0c;可以坐船。 坐船要求之前没有任何使用过的船加上道路可以到达那个点才可以坐船。 求最长可…

【总结】找到自适合的学习方法

通过高中与大学的比较 我发现自己大学学的东西要比高中多很多&#xff0c;也要更加的充实。 说白了&#xff0c;其实我认为就是自己擅长与不擅长的学习方式罢了。 1、我更喜欢那种自由轻松一点的学习环境&#xff0c;高中把我压得太紧了&#xff08;老师喜欢提问&#xff09…