[bzoj1926][Sdoi2010]粟粟的书架_二分_主席树
粟粟的书架 bzoj-1926 Sdoi-2010
题目大意:题目链接
注释:略
想法:分成两个题
前面的我们可以二分,直接二分出来检验即可。
对于R=1的,相当一个数列,我们在上面建立主席树。
然后查询时,我们通过优先遍历右子树的方式使得拿的书最少。
最后,附上丑陋的代码... ...
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int cnt;
int n,m,q;
int a,b,c,d,h;
int f[500010];
int s[210][210];
int l[10000010];
int r[10000010];
int v[10000010];
int root[500010];
int sum[10000010];
int val[210][210][1010];
int num[210][210][1010];
bool check(int x)
{
if(val[c][d][x]-val[a-1][d][x]-val[c][b-1][x]+val[a-1][b-1][x]>=h)
{
return true;
}
return false;
}
void partation()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&s[i][j]);
}
}
for(int k=0;k<=1000;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]>=k)
{
val[i][j][k]=val[i-1][j][k]+val[i][j-1][k]-val[i-1][j-1][k]+s[i][j];
num[i][j][k]=num[i-1][j][k]+num[i][j-1][k]-num[i-1][j-1][k]+1;
}
else
{
val[i][j][k]=val[i-1][j][k]+val[i][j-1][k]-val[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];
}
}
}
}
while(q--)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&h);
if(val[c][d][0]-val[a-1][d][0]-val[c][b-1][0]+val[a-1][b-1][0]<h)
{
printf("Poor QLW\n");
continue;
}
int l=0;
int r=1001;
int mid;
int ans=-1;
while(l<r-1)
{
mid=(l+r)>>1;
if(check(mid)==true)
{
l=mid;
ans=mid;
}
else
{
r=mid;
}
}
if(ans==-1)
{
printf("Poor QLW\n");
continue;
}
printf("%d\n",num[c][d][ans]-num[a-1][d][ans]-num[c][b-1][ans]+num[a-1][b-1][ans]-(val[c][d][ans]-val[a-1][d][ans]-val[c][b-1][ans]+val[a-1][b-1][ans]-h)/ans);
}
}
int updata(int pre,int L,int R,int k)
{
int rt=++cnt;
l[rt]=l[pre];
r[rt]=r[pre];
sum[rt]=sum[pre]+1;
v[rt]=v[pre]+k;
int mid=(L+R)/2;
if(L==R)
{
return rt;
}
if(k<=mid)
{
l[rt]=updata(l[pre],L,mid,k);
}
else
{
r[rt]=updata(r[pre],mid+1,R,k);
}
return rt;
}
int query(int rr,int ll,int L,int R,int h)
{
int x=v[r[rr]]-v[r[ll]];
if(v[rr]-v[ll]<h)
{
return -1e9;
}
if(L==R)
{
return (h/L)+(h%L!=0);
}
int mid=(L+R)/2;
if(x>=h)
{
return query(r[rr],r[ll],mid+1,R,h);
}
else
{
return query(l[rr],l[ll],L,mid,h-x)+sum[r[rr]]-sum[r[ll]];
}
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
if(n>1)
{
partation();
}
else
{
for(int i=1;i<=m;i++)
{
scanf("%d",&f[i]);
root[i]=updata(root[i-1],0,1000,f[i]);
}
while(q--)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&h);
int ans=query(root[d],root[b-1],0,1000,h);
if(ans<0)
{
printf("Poor QLW\n");
}
else
{
printf("%d\n",ans);
}
}
}
}
小结:主席树... ...
[bzoj1926][Sdoi2010]粟粟的书架_二分_主席树的更多相关文章
- BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树
BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树 题意:给出每个果汁的价格p,美味度d,最多能放的体积l.定义果汁混合后的美味度为果汁的美味度的最小值. m次询问,要求花费不大于g, ...
- 2019杭电多校第四场hdu6621 K-th Closest Distance(二分答案+主席树)
K-th Closest Distance 题目传送门 解题思路 二分答案+主席树 先建主席树,然后二分答案mid,在l和r的区间内查询[p-mid, p+mid]的范围内的数的个数,如果大于k则说明 ...
- BZOJ_3207_花神的嘲讽计划Ⅰ_哈希+主席树
BZOJ_3207_花神的嘲讽计划Ⅰ_哈希+主席树 Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程 ...
- BZOJ5343: [Ctsc2018]混合果汁 二分答案+主席树
分析: 整体二分或二分答案+主席树,反正没有要求强制在线,两个都可以做... 贪心还是比较显然的,那么就是找前K大的和...和CQOI的任务查询系统很像 附上代码: #include <cstd ...
- BZOJ1926[Sdoi2010]粟粟的书架——二分答案+主席树
题目描述 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位 ...
- BZOJ4556 [Tjoi2016&Heoi2016]字符串 SA ST表 二分答案 主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4556.html 题目传送门 - BZOJ4556 题意 给定一个长度为 $n$ 的字符串 $s$ . ...
- Codeforces Round #276 (Div. 1) E. Sign on Fence (二分答案 主席树 区间合并)
链接:http://codeforces.com/contest/484/problem/E 题意: 给你n个数的,每个数代表高度: 再给出m个询问,每次询问[l,r]区间内连续w个数的最大的最小值: ...
- BZOJ 4556: [Tjoi2016&Heoi2016]字符串(后缀数组 + 二分答案 + 主席树 + ST表 or 后缀数组 + 暴力)
题意 一个长为 \(n\) 的字符串 \(s\),和 \(m\) 个询问.每次询问有 \(4\) 个参数分别为 \(a,b,c,d\). 要你告诉它 \(s[a...b]\) 中的所有子串 和 \(s ...
- BZOJ2653 middle(二分答案+主席树)
与中位数有关的题二分答案是很常用的trick.二分答案之后,将所有大于它的看成1小于它的看成-1,那么只需要判断是否存在满足要求的一段和不小于0. 由于每个位置是1还是-1并不固定,似乎不是很好算.考 ...
随机推荐
- [Swift通天遁地]六、智能布局-(2)视图对象的尺寸和位置相对约束
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Linux下sublime 无法输入中文的解决
个人认为linux下的编辑器,对于小白来说,最好用的就是sublime了,但是,安装之后敲代码无法输入中文 ,很尴尬. 百度后,发现了解决方法. 项目链接:https://github.com/lyf ...
- Java的Thread.currentThread().getName() 和 this.getName() 以及 对象.getName()区别???
最近在看Java多线程这本书,但是发现里面有个概念自己搞不清楚.就是Thread.currentThread().getName() 和 this.getName() 以及 对象.getName()区 ...
- 【BZOJ3110】[ZJOI2013]K大数查询(整体二分)
题目: BZOJ3110 分析: 整体二分模板题-- 先明确一下题意:每个位置可以存放多个数,第一种操作是"加入 (insert) "一个数而不是"加上 (add) &q ...
- 普通平衡树代码。。。Treap
应一些人之邀...发一篇代码 #include <iostream> #include <cstdio> #include <cstdlib> #include & ...
- 题解报告:hdu 1028 Ignatius and the Princess III(母函数or计数DP)
Problem Description "Well, it seems the first problem is too easy. I will let you know how fool ...
- ios TextField 不被键盘遮住
首先放一个scrollView窗口,将Scroll View视图占整个屏幕. 向Scroll View 添加TextField 控件. 首先,ViewController.h 代码如下; #i ...
- Elasticsearch之CURL命令的version控制
普通关系型数据库使用的是(悲观并发控制(PCC)) 当我们在修改一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修改这一行数据 ES使用的是(乐观并发控制(OCC)) ES不会阻止某一数据 ...
- hibernate annotation 生成uuid主键
JPA标准方式下,不可以生成uuid类型的主键,但是hibernate提供了一些方式生成uuid主键,具体如下: 1.主键生成器 @GeneratedValue(generator=" ...
- [ ZJOI 2006 ] Mahjong
\(\\\) \(Description\) 现有权值分别为\(1\text~100\)的\(100\)种牌,分别给出每种排的张数\(A_i\),试判断能否胡牌,胡牌需要将所有牌不重不漏地分成以下几类 ...