BZOJ1926[Sdoi2010]粟粟的书架——二分答案+主席树
题目描述
输入
输出
样例输入
14 15 9 26 53
58 9 7 9 32
38 46 26 43 38
32 7 9 50 28
8 41 9 7 17
1 2 5 3 139
3 1 5 5 399
3 3 4 5 91
4 1 4 1 33
1 3 5 4 185
3 3 4 3 23
3 1 3 3 108
样例输出
15
2
Poor QLW
9
1
3
提示
#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]粟粟的书架——二分答案+主席树的更多相关文章
- BZOJ5343: [Ctsc2018]混合果汁 二分答案+主席树
分析: 整体二分或二分答案+主席树,反正没有要求强制在线,两个都可以做... 贪心还是比较显然的,那么就是找前K大的和...和CQOI的任务查询系统很像 附上代码: #include <cstd ...
- 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则说明 ...
- 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并不固定,似乎不是很好算.考 ...
- BZOJ3277 串(后缀数组+二分答案+主席树)
因为不会SAM,考虑SA.将所有串连起来并加分隔符,每次考虑计算以某个位置开始的子串有多少个合法. 对此首先二分答案,找到名次数组上的一个区间,那么只需要统计有多少个所给串在该区间内出现就可以了.这是 ...
- [CTSC2018]混合果汁(二分答案+主席树)
考场上写了60分的二分答案,又写了15分的主席树,然后就弃了.. 合起来就A了啊!主席树忘了开20倍空间最后还炸掉了. 最水的签到题被我扔了,主要还是不会用线段树求前缀和. 做法应该是比较显然的,首先 ...
随机推荐
- QWidget设置背景颜色
如果widget是子窗口首先要添加一句: this->setAttribute(Qt::WA_StyledBackground,true); this->setStyleSheet(&qu ...
- Android Universal Image Loader java.io.FileNotFoundException: http:/xxx/lxx/xxxx.jpg
前段时间在使用ImageLoader异步加载服务端返回的图片时总是出现 java.io.FileNotFoundException: http://xxxx/l046/10046137034b1c0d ...
- 开发板测试-Wi-Fi
一,下载STM32程序 1,方式一,串口下载(其他下载方式在最后补充) ①调整拨动开关位置 → 短接BOOT0和3.3V → 复位STM32 ②打开下载软件,下载程序 去掉短接 ③测试 {data:s ...
- BZOJ1185 HNOI2007 最小矩形覆盖 凸包、旋转卡壳
传送门 首先,肯定只有凸包上的点会限制这个矩形,所以建立凸包. 然后可以知道,矩形上一定有一条边与凸包上的边重合,否则可以转一下使得它重合,答案会更小. 于是沿着凸包枚举这一条边,通过旋转卡壳找到离这 ...
- 【转】单KEY业务,数据库水平切分架构实践
本文将以“用户中心”为例,介绍“单KEY”类业务,随着数据量的逐步增大,数据库性能显著降低,数据库水平切分相关的架构实践: 如何来实施水平切分 水平切分后常见的问题 典型问题的优化思路及实践 一.用户 ...
- Luogu P2597 [ZJOI2012]灾难
一道非常综合的好题然后就莫名其妙地知道了动态LCA的求法 果然是ZJOI的题目,只能说这思路服了 首先我们发现每次操作只会灭绝一种动物,然后我们想一下就知道如果有\(n(n>=2)\)个食物的动 ...
- 洛谷 P4409 [ZJOI2006] 皇帝的烦恼
题目链接-> OVO 题解: 很久没有写博客了,可能是因为最近太颓废了吧. 刚刚考完期末考试,无比期盼早点外出学习,不要面对成绩,害怕. #include <cstdio> #inc ...
- bash:express:command not found
重新设置了node_global和node_cache目录后,总是显示command not found 找了几篇博文后,终于解决了这个问题 步骤如下: 1.新建node_global和node_ ...
- pycharm2019注册码一键实时获取,永久有效!
pycharm2019专业版激活码 56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1NlpTNVBRMVJGIiwibGljZW5zZWVOYW1lIjoi5q2j54mI5o6I5p2 ...
- [C#]使用Windows Form开发的百度网盘搜索工具
BaiduDiskSearcher 用C#编写的百度网盘搜索工具(.NET4.0 & Visual Studio 2017) 功能 1.搜索任意名称的百度网盘共享文件 2.可以左键双击打开网盘 ...