题意:给你一个矩形书架,每个点是这本书的页数,每次询问(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 粟粟的书架的更多相关文章

  1. 洛谷P2468 [SDOI2010]粟粟的书架

    来了来了,随便拽一道题写题解[大雾] 最近发现自己基础奇差于是开始复习之前学过的东西,正好主席树我几乎完全没学会,然后打开洛谷试炼场… 发现了这么一道二合一的题. 这道题其实分成两个部分,前50%是一 ...

  2. bzoj 2005 & 洛谷 P1447 [ Noi 2010 ] 能量采集 —— 容斥 / 莫比乌斯反演

    题目:bzoj 2005 https://www.lydsy.com/JudgeOnline/problem.php?id=2005   洛谷 P1447 https://www.luogu.org/ ...

  3. 洛谷P2468 粟粟的书架

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

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

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

  5. [洛谷P5190][COCI 2010] PROGRAM

    题目大意:给你$k(k\leqslant10^6)$个数,$f(x)$表示$x$的约数在$k$个数中出现的次数,在这任何数都是$0$的约数.$m(m\leqslant10^6)$次询问,每次给出$l, ...

  6. 洛谷 P2335 SDOI 2005 毒瘤 位图(也补上注释了)

    #include<iostream> #include<cstdio> #include<queue> #include<cstring> using ...

  7. [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)

    [NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...

  8. 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)

    To 洛谷.1774 最接近神的人 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的 ...

  9. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

随机推荐

  1. vue单页面模板说明文档(1)

    Introduction This boilerplate is targeted towards large, serious projects and assumes you are somewh ...

  2. Laravel 获取 Route Parameters (路由参数) 的 5 种方法

      Laravel 获取路由参数的方式有很多,并且有个小坑,汇总如下.   假设我们设置了一个路由参数:   现在我们访问 http://test.dev/1/2   在 TestController ...

  3. CentOS7安装使用ab压力测试工具

    执行安装命令:yum -y install httpd-tools 安装完毕,执行:ab -help,显示命令参数 命令模板:ab -c 100 -n 10000 待测试网站(建议完整路径) -c 即 ...

  4. Python给照片换底色(蓝底换红底)

    环境要求 Python3 numpy函数库 opencv库 安装 下载适应版本的numpy函数库,我电脑是WIN10 64位,安装的函数库是 numpy-1.13.1+mkl-cp36-cp36m-w ...

  5. php2

    session   //将用户的会话数据存储在服务端,通过 session_start()开启session,通过$_SESSION读写session session_start(); //开启ses ...

  6. How to proof RSA

    欧拉函数 :欧拉函数是数论中很重要的一个函数,欧拉函数是指:对于一个正整数 n ,小于 n 且和 n 互质的正整数(包括 1)的个数,记作 φ(n) . 完全余数集合:定义小于 n 且和 n 互质的数 ...

  7. Spring Boot 构建电商基础秒杀项目 (六) 用户登陆

    SpringBoot构建电商基础秒杀项目 学习笔记 userDOMapper.xml 添加 <select id="selectByTelphone" resultMap=& ...

  8. 基于 vue+vue-router+vuex+axios+koa+koa-router 本地开发全栈项目

    因为毕业设计要做基于Node服务器的项目,所以我就想着用刚学的vue作为前端开发框架,vue作为Vue.js应用程序的状态管理模式+库,axios基于promise用于浏览器和node.js的http ...

  9. 关于i++和i++的左值、右值问题

    1.什么是左值和右值? 左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址: 右值是指存储在某内存地址中的数据,也称为变量的数据. 左值可以作为右值 ...

  10. POI Excel 单元格内容类型判断并取值

    个人用到的 String birthdayVal = null;                                                                     ...