洛谷P2468 [SDOI2010]粟粟的书架
来了来了,随便拽一道题写题解【大雾】
最近发现自己基础奇差于是开始复习之前学过的东西,正好主席树我几乎完全没学会,然后打开洛谷试炼场…
发现了这么一道二合一的题。
这道题其实分成两个部分,前50%是一道题,后50%是另一道。观察数据范围的时候发现两种范围差别很大,似乎具有针对性,于是分开来想。
再仔细一看,书页的范围p小于等于1000,似乎在暗示值域上可以搞什么幺蛾子。
前50%是矩阵上的问题,c和r小于等于200。题目要求在一个矩形内凑出某一高度,正好值域很小,可以想到用二维前缀和记录一下每种高度的书页在(1,1)-(i,j)内出现的数量以及累计的高度,时间复杂度O(crp)。然后对于每个询问,在书页的值域p上从大到小累加高度和数量,时间复杂度O(p)。
后50%r=1,成为了序列上的问题。要求在一段区间内凑出要求的高度,如果依然从大到小枚举书页高度,预处理的复杂度是不能接受的。然而区间整体加减某一段值域的数据,这就是主席树的板子…时间复杂度O(nlogn),空间复杂度O(nlogn)。
于是因为我主席树写得不熟练,之后的查询出了锅。查询一直递归到某个叶节点的时候,应该像上面前缀和那样讨论一下这一种书页要凑多少个,对答案产生多少贡献。然而我直接打了个return 1上去,导致第二个样例都卡了我很久…
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int r,c,m,x1,x2,y1,y2;
int cnt[][][],ans;
long long sum[][][],h,num; const int log=;
int T[],L[*log],R[*log],SUM[*log],CNT[*log];
int tot;
void build(int &p,int l,int r){
p=++tot;
if(l==r)return;
int mid=(l+r)/;
build(L[p],l,mid);
build(R[p],mid+,r);
}
void update(int &p,int pre,int l,int r,int x){
p=++tot;
L[p]=L[pre],R[p]=R[pre],CNT[p]=CNT[pre]+,SUM[p]=SUM[pre]+x;
if(l==r)return;
int mid=(l+r)/;
if(x<=mid)update(L[p],L[pre],l,mid,x);
else update(R[p],R[pre],mid+,r,x);
}
int query(int x,int y,int l,int r,long long h){
int mid=(l+r)/;
if(l==r){
if(h%l==)return h/l;
else return h/l+;
}
int val=;
if(SUM[R[y]]-SUM[R[x]]>=h)return query(R[x],R[y],mid+,r,h);
else if(SUM[R[y]]-SUM[R[x]]==h)return CNT[R[y]]-CNT[R[x]];
else{
val+=CNT[R[y]]-CNT[R[x]];
return val+query(L[x],L[y],l,mid,h-SUM[R[y]]+SUM[R[x]]);
}
}
int main()
{
scanf("%d%d%d",&r,&c,&m);
if(r==){
build(T[],,);
for(int i=,x;i<=c;i++){
scanf("%d",&x);
update(T[i],T[i-],,,x);
}
for(int i=;i<=m;i++){
scanf("%d%d%d%d%lld",&x1,&y1,&x2,&y2,&h);
num=,ans=;
if(SUM[T[y2]]-SUM[T[y1-]]<h)printf("Poor QLW\n");
else{
ans=query(T[y1-],T[y2],,,h);
printf("%d\n",ans);
}
}
}
else{
for(int i=;i<=r;i++){
for(int j=,x;j<=c;j++){
scanf("%d",&x);
for(int p=;p<=;p++){
cnt[i][j][p]=cnt[i][j-][p]+cnt[i-][j][p]-cnt[i-][j-][p];
sum[i][j][p]=sum[i][j-][p]+sum[i-][j][p]-sum[i-][j-][p];
}
cnt[i][j][x]++;
sum[i][j][x]+=x;
}
}
for(int i=;i<=m;i++){
scanf("%d%d%d%d%lld",&x1,&y1,&x2,&y2,&h);
num=,ans=;
for(int p=;p>=;p--){
if(num+sum[x2][y2][p]+sum[x1-][y1-][p]-sum[x2][y1-][p]-sum[x1-][y2][p]>=h){
long long cha=h-num;
if(!(cha%p)){
ans+=cha/p;
}
else{
ans+=cha/p+;
}
num+=sum[x2][y2][p]+sum[x1-][y1-][p]-sum[x2][y1-][p]-sum[x1-][y2][p];
break;
}
else{
num+=sum[x2][y2][p]+sum[x1-][y1-][p]-sum[x2][y1-][p]-sum[x1-][y2][p];
ans+=cnt[x2][y2][p]+cnt[x1-][y1-][p]-cnt[x2][y1-][p]-cnt[x1-][y2][p];
}
}
if(num>=h)printf("%d\n",ans);
else printf("Poor QLW\n");
}
}
return ;
}
洛谷P2468 [SDOI2010]粟粟的书架的更多相关文章
- 洛谷P2468 SDOI 2010 粟粟的书架
题意:给你一个矩形书架,每个点是这本书的页数,每次询问(x1,y1)(x2,y2)这个小矩形里最少需要取几本书使得页数和等于Hi. 题解:小数据二位前缀和预处理+二分答案,大数据一行所以用主席树做,感 ...
- 洛谷P2468 [SDOI2010]粟粟的书架(二分答案 前缀和 主席树)
题意 题目链接 给出一个矩形,每个点都有一些值,每次询问一个子矩阵最少需要拿几个数才能构成给出的值 Sol 这题是真坑啊.. 首先出题人强行把两个题拼到了一起, 对于前$50 \%$的数据,考虑二分答 ...
- 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)
洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...
- BZOJ1925或洛谷2467 [SDOI2010]地精部落
BZOJ原题链接 洛谷原题链接 先讲下关于波动数列的\(3\)个性质. 性质\(1\):对于数列中的每一对\(i\)和\(i + 1\),若它们不相邻,那么交换这两个数形成的依旧是一个波动数列. 性质 ...
- 洛谷 P2467 [SDOI2010]地精部落
洛谷 我讲的应该没有这个[https://www.luogu.org/blog/user55639/solution-p2467]清楚. 贴个代码算了: #include <bits/stdc+ ...
- 洛谷 P2481 [SDOI2010]代码拍卖会
洛谷 这大概是我真正意义上的第一道黑题吧! 自己想出了一个大概,状态转移方程打错了一点点,最后还是得看题解. 一句话题意:求出有多少个\(n\)位的数,满足各个位置上的数字从左到右不下降,且被\(p\ ...
- 洛谷P2468 粟粟的书架
题目链接:https://www.luogu.org/problemnew/show/P2468 知识点: 可持久化线段树.二分.前缀和 解题思路: 对于 \(R, C \le 200, M \le ...
- 洛咕 P2468 [SDOI2010]粟粟的书架
强行二合一啊... 前面直接二分最小值,二维前缀和.后面用主席树查最小值.注意要写\(nlogn\). // luogu-judger-enable-o2 #include<bits/stdc+ ...
- k短路模板(洛谷P2483 [SDOI2010]魔法猪学院)(k短路,最短路,左偏树,priority_queue)
你谷数据够强了,以前的A*应该差不多死掉了. 所以,小伙伴们快来一起把YL顶上去把!戳这里! 俞鼎力的课件 需要掌握的内容: Dijkstra构建最短路径树. 可持久化堆(使用左偏树,因其有二叉树结构 ...
随机推荐
- TF坐标变换
一.什么是TF 二.TF使用方法 三.TF包内的指令工具 四.相关API 1.广播变换发布坐标之间的坐标关系 #include <ros/ros.h> #include <tf ...
- opencv-访问Mat中每个像素的值
参考:[OpenCV]访问Mat中每个像素的值(新) 膜拜大佬 以下例子代码均针对8位单通道灰度图. 1 .ptr和[]操作符 Mat最直接的访问方法是通过.ptr<>函数得到一行的指 ...
- Android之selector选择器的使用
1.selector简介 selector中文的意思选择器,在Android中常常用来作组件的背景,实现组件在不同状态下不同的背景颜色或图片的变换.使用十分方便.主要是用来改变ListView和But ...
- PHP实现图片的汉明码提取与降维
作者感言:数学不好,遇到算法问题分分钟狗带,毫无转寰的余地-_-||| 最近心血来潮,看了相似图片的搜索,最最最初级的方法即提取汉明码,之后匹配汉明距离.当然,在数以亿计的汉明码中,要筛出需要的图片, ...
- django中的request对象
Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将 HttpRequest对象 作为第一个参数传入该函数. 我们来看一看这个HttpRequest对 ...
- SpringMVC处理请求的大致流程是怎么样的
SpringMVC请求处理流程 Spring MVC请求处理架构图: 1.用户首先发送请求到前端控制器Dispatcher Servlet, 2.在doDispath这个方法中会为请求找到对 ...
- PageBarHelper分页显示类
一共有两个分页类,都可以使用(单独使用) using System;using System.Collections.Generic;using System.Linq;using System.Te ...
- Appscan standard怎么设置外部浏览器为IE
Appscan standard怎么设置外部浏览器为IE 方法/步骤 首先,打开一个的Appscan 的界面中,点击菜单中的 工具 的选项 点击了工具的选项之后,弹出了下拉菜单选中为 ...
- Luogu P3007 [USACO11JAN]大陆议会The Continental Cowngress
P3007 [USACO11JAN]大陆议会The Continental Cowngress 题意 题意翻译 简述:给出\(n\)个法案,\(m\)头牛的意见,每头牛有两个表决格式为"支持 ...
- 第一个入驻阿里云自营心选商城,如今它已经是营收过亿的SaaS独角兽
淘宝心选.网易严选.小米有品...越来越多的企业电商自有品牌围绕“低价好物”大做文章,用创新赢得了市场.作为To B从业人员,不由思考:C端的成功是否可以复制在B端? 伴随着互联网下半场的到来,云计算 ...