洛谷P2468 SDOI 2010 粟粟的书架
题意:给你一个矩形书架,每个点是这本书的页数,每次询问(x1,y1)(x2,y2)这个小矩形里最少需要取几本书使得页数和等于Hi。
题解:小数据二位前缀和预处理+二分答案,大数据一行所以用主席树做,感觉数组开得玄学,洛谷上很好过,BZOJ经历了TLE->MLE->CE emmmmm,找不到CE在哪里。
#include<bits/stdc++.h>
#define long long ll
using namespace std;
const int maxn=5e5+100;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,vv;
int val[205][205][1005];
int sum[205][205][1005];
int cc[1005];
int page[205][205];
struct node
{
int l,r;
int val,sum;
}no[maxn*20];
inline int get_val(int x1,int y1,int x2,int y2,int k)
{
return val[x2][y2][k]-val[x1-1][y2][k]-val[x2][y1-1][k]+val[x1-1][y1-1][k];
}
inline int get_sum(int x1,int y1,int x2,int y2,int k)
{
return sum[x2][y2][k]-sum[x1-1][y2][k]-sum[x2][y1-1][k]+sum[x1-1][y1-1][k];
}
int rs,p,q,pp,qq;
inline void work1()
{
int tmp=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
page[i][j]=read();
cc[page[i][j]]++;
if(page[i][j]>tmp)tmp=page[i][j];
}
}
for(int k=0;k<=tmp;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
val[i][j][k]=val[i-1][j][k]+val[i][j-1][k]-val[i-1][j-1][k]+(page[i][j]>=k?page[i][j]:0);
sum[i][j][k]=sum[i-1][j][k]+sum[i][j-1][k]-sum[i-1][j-1][k]+(page[i][j]>=k?1:0);
}
}
}
while(vv--)
{
p=read();q=read();pp=read();qq=read();rs=read();
if(get_val(p,q,pp,qq,0)<rs)
{
printf("Poor QLW\n");
continue;
}
int l=1,r=tmp,ans=-1;
while(l<=r)
{
int mid=(l+r)>>1;
if(get_val(p,q,pp,qq,mid)>=rs)l=mid+1,ans=mid;
else r=mid-1;
}
if(ans==-1)printf("Poor QLW\n");
else{
int res=get_sum(p,q,pp,qq,ans)-(get_val(p,q,pp,qq,ans)-rs)/ans;
printf("%d\n",res);
}
}
}
int cnt=0;
int ssq[maxn];
int root[maxn];
void build(int &x,int l,int r)
{
x=++cnt;
no[x].val=no[x].sum=0;
if(l==r)return;
int mid=(l+r)>>1;
build(no[x].l,l,mid);
build(no[x].r,mid+1,r);
}
void insertt(int&x,int pre,int l,int r,int pl)
{
x=++cnt;
no[x]=no[pre];
no[x].sum++;
no[x].val+=pl;
if(l==r)return ;
int mid=(l+r)>>1;
if(pl<=mid)insertt(no[x].l,no[pre].l,l,mid,pl);
else insertt(no[x].r,no[pre].r,mid+1,r,pl);
}
int query(int x,int pre,int l,int r,int rs)
{
if(l==r)
{
if(rs%l==0)return rs/l;
return rs/l+1;
}
int mid=(l+r)>>1;
int tmp=no[no[x].r].val-no[no[pre].r].val;
int ans=0;
if(tmp<rs)
{
rs-=tmp;
ans+=no[no[x].r].sum-no[no[pre].r].sum;
ans+=query(no[x].l,no[pre].l,l,mid,rs);
}
else{
ans+=query(no[x].r,no[pre].r,mid+1,r,rs);
}
return ans;
}
void work2()
{
int maxx=0;
for(int i=1;i<=m;i++)ssq[i]=read(),maxx=max(ssq[i],maxx);
build(root[0],1,maxx);
for(int i=1;i<=m;i++)insertt(root[i],root[i-1],1,maxx,ssq[i]);
while(vv--)
{
p=read();q=read();pp=read();qq=read();rs=read();
if(no[root[qq]].val-no[root[q-1]].val<rs)
{
printf("Poor QLW\n");
continue;
}
printf("%d\n",query(root[qq],root[q-1],1,maxx,rs));
}
}
int main()
{
n=read();m=read();vv=read();
if(n==1)work2();
else work1();
}
洛谷P2468 SDOI 2010 粟粟的书架的更多相关文章
- 洛谷P2468 [SDOI2010]粟粟的书架
来了来了,随便拽一道题写题解[大雾] 最近发现自己基础奇差于是开始复习之前学过的东西,正好主席树我几乎完全没学会,然后打开洛谷试炼场… 发现了这么一道二合一的题. 这道题其实分成两个部分,前50%是一 ...
- bzoj 2005 & 洛谷 P1447 [ Noi 2010 ] 能量采集 —— 容斥 / 莫比乌斯反演
题目:bzoj 2005 https://www.lydsy.com/JudgeOnline/problem.php?id=2005 洛谷 P1447 https://www.luogu.org/ ...
- 洛谷P2468 粟粟的书架
题目链接:https://www.luogu.org/problemnew/show/P2468 知识点: 可持久化线段树.二分.前缀和 解题思路: 对于 \(R, C \le 200, M \le ...
- 洛谷P2468 [SDOI2010]粟粟的书架(二分答案 前缀和 主席树)
题意 题目链接 给出一个矩形,每个点都有一些值,每次询问一个子矩阵最少需要拿几个数才能构成给出的值 Sol 这题是真坑啊.. 首先出题人强行把两个题拼到了一起, 对于前$50 \%$的数据,考虑二分答 ...
- [洛谷P5190][COCI 2010] PROGRAM
题目大意:给你$k(k\leqslant10^6)$个数,$f(x)$表示$x$的约数在$k$个数中出现的次数,在这任何数都是$0$的约数.$m(m\leqslant10^6)$次询问,每次给出$l, ...
- 洛谷 P2335 SDOI 2005 毒瘤 位图(也补上注释了)
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using ...
- [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)
[NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)
To 洛谷.1774 最接近神的人 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的 ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
随机推荐
- asp.net core Api配置swagger
这个很简单的一篇文章用来记录以下使用swagger的过程,以后有用. 1.nuget 下载install-package Swashbuckle.AspNetCore 2.startup里面confi ...
- 1244. Minimum Genetic Mutation
描述 A gene string can be represented by an 8-character long string, with choices from "A", ...
- node 模块化思想中index.js的重要性
目录结构如上图 module1和modlue2.main在同一级 module1下文件: index.js var test2=require('./test2'); var sayHi=functi ...
- WampServer的安装和配置
1.安装WampServer 启动时发现WampServer的图标是红色的,状态为put offline状态:发现无法put online,并报错could not found the menu it ...
- 阿里云ECS服务器,CentOS 7.4配置jdk+tomcat+mysql
参考博客: https://mp.weixin.qq.com/s?__biz=MzIxMzk3Mjg5MQ==&mid=2247484020&idx=1&sn=6e0aa07f ...
- spring 在容器中一个bean依赖另一个bean 需要通过ref方式注入进去 通过构造器 或property
spring 在容器中一个bean依赖另一个bean 需要通过ref方式注入进去 通过构造器 或property
- hdu1839(最小生成树)
题意:字面意思: 思路:就是多了一个前提,有些点之间可能有边,有两个处理方法,一个是有边的,这条边权值归零,另一个是,先一次循环用并查集过一遍: 代码:(用的是第一种方法) #include<i ...
- CSS初步学习
1.选择器: 如果你要在HTML元素中设置CSS样式,你需要在元素中设置"id" 和 "class"选择器. id 选择器 id 选择器可以为标有特定 id 的 ...
- Asteroids POJ - 3041 匈牙利算法+最小点覆盖König定理
题意: 给出一个N*N的地图N 地图里面有K个障碍 你每次可以选择一条直线 消除这条直线上的所有障碍 (直线只能和列和行平行) 问最少要消除几次 题解: 如果(x,y)上有一个障碍 则把 ...
- jenkins运行脚本生成HTML报告时遇到的问题
1.jenkins生成HTML报告 1)安装插件:HTML Publisher plugin 2)系统管理->插件管理->安装HTMLHTML Publisher plugin 2.job ...