题意:给你一个矩形书架,每个点是这本书的页数,每次询问(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. sys模块进度条玩法笔记

    #! /user/bin/env python# -*- encoding:utf-8 -*-import time,sys for i in range(31): sys.stdout.write( ...

  2. vue处理异步数据踩过的坑

    在开发时,由于数据是异步的导致页面在render 时data是空值 出现报错和警告. 我是这么处理的 把data先写出一个空的完整结构.暂时是这么处理 或者用三元表达式进行赋值监听.data ?myd ...

  3. [转帖]Kerberos和NTLM - SQL Server

    Kerberos和NTLM - SQL Server https://www.cnblogs.com/dreamer-fish/p/3458425.html 当我们使用Windows Authenti ...

  4. 【Java基础】switch语句实现根据数字输出对应星期

    代码: import java.util.Scanner; /* * switch语句格式: * switch(表达式) { * case 值1: * 语句体1; * break; * case 值2 ...

  5. rpm和yum

    RMP(红帽软件包管理器) RPM有点像Windows系统中的控制面板,会建立统一的数据库文件,详细记录软件信息并能够自动分析依赖关系. YUM(软件仓库)

  6. python爬虫之Beautiful Soup的基本使用

    1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...

  7. Java多线程2:线程的使用及其生命周期

    一.线程的使用方式 1.继承Thread类,重写父类的run()方法 优点:实现简单,只需实例化继承类的实例,即可使用线程 缺点:扩展性不足,Java是单继承的语言,如果一个类已经继承了其他类,就无法 ...

  8. 织梦后台如何生成站点地图sitemap.xml

    第一步在网站根目录建立sitemap.php文件 内容如下: 写一个计划任务文件命名为generate_sitemap.php,放在/plus/task目录里,文件内容如下: <?php//定时 ...

  9. NPOI 上传Excel功能(二)

    3.上传文件,写入log using DC.BE.Business.SYS; using DC.BE.Entity.ERP; using DC.BE.Entity.SAS; using DC.BE.E ...

  10. c++ 实现哈夫曼树中遇见的问题

    为了提高效率求得 叶子 节点中权值最小的两个元素,我们需要使用堆数据结构,它可以以O(logn)的复杂度 取得n个元素中的最小元素.为了绕过堆的实现,我们可以使用标准模板库中相应的标准模板—优先队列. ...