来了来了,随便拽一道题写题解【大雾】

最近发现自己基础奇差于是开始复习之前学过的东西,正好主席树我几乎完全没学会,然后打开洛谷试炼场…

发现了这么一道二合一的题。

这道题其实分成两个部分,前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]粟粟的书架的更多相关文章

  1. 洛谷P2468 SDOI 2010 粟粟的书架

    题意:给你一个矩形书架,每个点是这本书的页数,每次询问(x1,y1)(x2,y2)这个小矩形里最少需要取几本书使得页数和等于Hi. 题解:小数据二位前缀和预处理+二分答案,大数据一行所以用主席树做,感 ...

  2. 洛谷P2468 [SDOI2010]粟粟的书架(二分答案 前缀和 主席树)

    题意 题目链接 给出一个矩形,每个点都有一些值,每次询问一个子矩阵最少需要拿几个数才能构成给出的值 Sol 这题是真坑啊.. 首先出题人强行把两个题拼到了一起, 对于前$50 \%$的数据,考虑二分答 ...

  3. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

  4. BZOJ1925或洛谷2467 [SDOI2010]地精部落

    BZOJ原题链接 洛谷原题链接 先讲下关于波动数列的\(3\)个性质. 性质\(1\):对于数列中的每一对\(i\)和\(i + 1\),若它们不相邻,那么交换这两个数形成的依旧是一个波动数列. 性质 ...

  5. 洛谷 P2467 [SDOI2010]地精部落

    洛谷 我讲的应该没有这个[https://www.luogu.org/blog/user55639/solution-p2467]清楚. 贴个代码算了: #include <bits/stdc+ ...

  6. 洛谷 P2481 [SDOI2010]代码拍卖会

    洛谷 这大概是我真正意义上的第一道黑题吧! 自己想出了一个大概,状态转移方程打错了一点点,最后还是得看题解. 一句话题意:求出有多少个\(n\)位的数,满足各个位置上的数字从左到右不下降,且被\(p\ ...

  7. 洛谷P2468 粟粟的书架

    题目链接:https://www.luogu.org/problemnew/show/P2468 知识点: 可持久化线段树.二分.前缀和 解题思路: 对于 \(R, C \le 200, M \le ...

  8. 洛咕 P2468 [SDOI2010]粟粟的书架

    强行二合一啊... 前面直接二分最小值,二维前缀和.后面用主席树查最小值.注意要写\(nlogn\). // luogu-judger-enable-o2 #include<bits/stdc+ ...

  9. k短路模板(洛谷P2483 [SDOI2010]魔法猪学院)(k短路,最短路,左偏树,priority_queue)

    你谷数据够强了,以前的A*应该差不多死掉了. 所以,小伙伴们快来一起把YL顶上去把!戳这里! 俞鼎力的课件 需要掌握的内容: Dijkstra构建最短路径树. 可持久化堆(使用左偏树,因其有二叉树结构 ...

随机推荐

  1. springboot与任务(邮件任务)

    邮件发送需要引入spring-boot-starter-mail Spring Boot 自动配置MailSenderAutoConfiguration 定义MailProperties内容,配置在a ...

  2. Thinkphp5 RCE总结

    thinkphp5最出名的就是rce,我先总结rce,rce有两个大版本的分别 ThinkPHP 5.0-5.0.24 ThinkPHP 5.1.0-5.1.30 因为漏洞触发点和版本的不同,导致pa ...

  3. 【DM642学习笔记一】关于Can't Initialize Target CPU的一种解决方法 : Error 0x80000240

    花了几天时间,终于可以顺利进入ccs软件开始学习了! 我使用的是瑞泰公司的ICETEK-DM642-IDK-M图像处理系统(ICETEK5100USB仿真器,仿真芯片为DM642).使用ccs2.21 ...

  4. JavaEE三层架构

    三层架构         三层架构是javaee规范中的推荐架构,传统意义上是分为表示层(UI).业务逻辑层(BLL).数据访问层(DAL).在javaee的开发中,三层架构具体分为表示层(web层) ...

  5. python数据类型,数据结构

    数据类型:int,bool 数据结构:dict,list,tuple,set,str

  6. 《数据结构与算法分析——C语言描述》ADT实现(NO.04) : AVL树(AVL-Tree)

    上次我们已经实现了普通的二叉查找树.利用二叉查找树,可以用O(logN)高度的树状结构存储和查找数据,提高了存储和查找的效率. 然而,考虑一种极端情形:依次插入1,2,3,4,5,6,7,8,9九个元 ...

  7. java笔试之字符串反转

    写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串. package test; import java.util.Scanner; public class exam04 { public ...

  8. python中如何去除列表中重复元素?

    方法一: 用内置函数set: list1 = [1, 2, 3, 3, 4, 4, 5, 6, 6, 6, 7, 8, 9] list2 = list(set(list1)) print(list2) ...

  9. [转]WPF命令集 Command

    在我们日常的应用程序操作中,经常要处理各种各样的命令和进行相关的事件处理,比如需要复制.粘贴文本框中的内容;上网查看网页时,可能需要返回上一网页查看相应内容;而当我们播放视频和多媒体时,我们可能要调节 ...

  10. centos7.5安装公版mysql5.7.25

    ######### 卸载原来系统安装的包 # yum remove -y java cvs libselinux-devel postgresql mysql ecj jna sinjdoc 依赖包安 ...