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

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

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

这道题其实分成两个部分,前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. 左神算法进阶班6_1LFU缓存实现

    [题目] LFU也是一个著名的缓存算法,自行了解之后实现LFU中的set 和 get 要求:两个方法的时间复杂度都为O(1) [题解] LFU算法与LRU算法很像 但LRU是最新使用的排在使用频率最前 ...

  2. 关于python DataFrame的学习记录

    df_1 = pd.DataFrame({'A': [0, 1, 2], 'B': [3, 4, 5]}) print df_1 默认左边行index0往上递增,AB为顶部标识,数组内为内容 loc— ...

  3. AlexNet结构图详解

  4. Leetcode946. Validate Stack Sequences验证栈序列

    给定 pushed 和 popped 两个序列,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true:否则,返回 false . 示例 1: 输入:pus ...

  5. P1009阶乘之和

    n=int(input()) ans=0 for i in range(1,n+1): t=1 for j in range(1,i+1): t*=j; ans+=t; print(ans)

  6. 2018.10.29安装tensorflow

    先安装tensorflow时按照中文社区安装,结果安装的0.5版本与cuda和cudnn版本不一样,后面才知道需要安好对应版本安装. 1.卸载protobuf pip uninstall protob ...

  7. JavaScript RegExp 对象的三种方法

    JavaScript RegExp 对象有 3 个方法:test().exec() 和 compile().(1) test() 方法用来检测一个字符串是否匹配某个正则表达式,如果匹配成功,返回 tr ...

  8. 洛谷 P1155 双栈排序

    题面 解题思路 这道题乍一看还以为是个模拟..怒写一发30分(noip提高组t4有模拟吗?). 其实很好hack,如 10 10 2 8 1 7 9 3 4 5 6 按模拟的思路,应该是10入第一个栈 ...

  9. mysql把表的指定字段值赋给本表另一个字段

    原本是主键一对一关联的,后来发现这样操作很不方便,改成主外键一对一 所以添加一个外键字段bodyId(文章正文单独存一个表) UPDATE t_article SET bodyId=id; 但是等了半 ...

  10. [转载] OpenCV2.4.3 CheatSheet学习(二)

    二.矩阵操作(拷贝.洗牌.局部访问): src.copyTo(dst) 把src矩阵中的数据拷贝到dst. src.convertTo(dst, type,scale, shift) 缩放并转换到另外 ...