洛谷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构建最短路径树. 可持久化堆(使用左偏树,因其有二叉树结构 ...
随机推荐
- 用JS把数组内的日期转换为星期
核心代码 给定日期是星期几,应把字符串转为Date: new.Date('2017-12-30').getDay(); // 返回0,表示星期天,1:星期一…… 案例: 需求: 调用此方法 funct ...
- vue中使用watch函数,当数据改变时自动引发事件
本来我的需求是这样的,使用ElementUI的日期选择器,当日期选择器被更改时需要根据新日期来向服务器获取新数据,但是发现这个日期选择器没有change事件,后来终于发现vue有个watch函数就是用 ...
- Cocos2d-x发布Android.mk 导入所有cpp
#traverse all the directory and subdirectorydefine walk $(wildcard $(1)) $(foreach e, $(wildcard $(1 ...
- Apache Pig学习笔记(二)
主要整理了一下,pig里面的一些关键词的含义和用法,pig虽然是一种以数据流处理为核心的框架,但数据库的大部分关键词和操作,在pig里面基本上都能找到对应的函数,非常灵活与简洁,春节前的最后一篇文章 ...
- 编程之法:面试和算法心得(旋转字符串java实现)
内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b ...
- 新手redis集群搭建
redis集群搭建在开始redis集群搭建之前,我们先简单回顾一下redis单机版的搭建过程 下载redis压缩包,然后解压压缩文件:进入到解压缩后的redis文件目录(此时可以看到Makefile文 ...
- 12.Hibernate多对多关系
JavaBean的编写 Person private long pid ; private String name ; private Set<Role> roles = new Hash ...
- Python之MySQL语法(增删改查)
-- ID: 新闻的唯一标示 -- title: 新闻的标题 -- content: 新闻的内容 -- created_at: 新闻添加的时间 -- types: 新闻的类型 -- image: 新的 ...
- Django项目:CRM(客户关系管理系统)--75--65PerfectCRM实现CRM课程分数排名
# classtop_urls.py # ————————64PerfectCRM实现CRM课程排名详情———————— from django.conf.urls import url from b ...
- Schedule(Hackerrank Quora Haqathon)
题目链接 Problem Statement At Quora, we run all our unit tests across many machines in a test cluster on ...