俄罗斯套娃(JOISC 2016 Day 1)

题目描述

你开了一家卖俄罗斯套娃的店。因此,你向厂家订购了 \(N\)个俄罗斯套娃,这些娃娃被编号为 \(1\) 到 \(N\),其中第 \(i\) 个套娃是一个的直径为 \(R_i\) 高度为 \(H_i\) 的直♂柱体 。每个俄罗斯套娃都只能套高和直径严格比他小的套娃。同时只要满足条件,俄罗斯套娃可以嵌套多次。

有一天,你收到了厂家的来电,告诉你你预定的 \(N\) 个娃娃不能一次性全部做完。所以第一批只会送达直径大于等于 \(A\) 并且高度小于等于 \(B\) 的所有套娃。你需要预先安排出一个方案,使送来的套娃经过若干次嵌套后,没有被套的套娃数量最小。

由于厂家经常搞大新闻,所以他会改变 \(A\) 和 \(B\) 的值,总共 \(Q\) 次,因此你需要对每对 \((A,B)\) 都作出回答,询问之间互不干扰。

输入

第一行有两个整数 \(N\)和 \(Q\) ,表示套娃的个数和 \((A,B)\) 的对数;
之后的 \(N\) 行,每行两个数 \(R_i\) 与 \(H_i\) 表示第$ i$ 个数的直径和高度;
之后的 \(Q\) 行,每行两个数 \(A_i\) 与 \(B_i\) 表示第 \(i\) 个询问, \(A_i\) 与 \(B_i\) 的意思如上所示。

输出

一个整数,表示符合条件的方案个数。

思路

重要结论

这题每个套娃都是二维的,于是可以用\(xy​\)坐标轴表示所有的套娃,任意一个点只要在另一个点的右上方就可以把那点(娃娃)装进去

(横坐标为R,纵坐标为H)

这题根据人类的智慧可以得到

(直接)甩结论:最少的没被套的娃娃个数=最长的\(R\)递增,\(H\)递减的序列长度

这个可以感性理解一下,所有不在该序列上的点都必定会在一个点的右上方,所以就相当于所有多出来的点都是可以被装进另一个点中的。

离线+离散

知道这个后就去考虑每个询问,对于每个询问,若逐个计算每次的答案,用一个树状数组其中一维,显然要将一维进行离散。那么剩下的一位直接考虑进行离线处理,那么复杂度就被用优化成\(O((n+q)log_(n+q))\),可以开两个数组分别表示娃娃和询问,不过放一个数组里面一起排序会简单一些,不过注意在遇到询问和娃娃的两个值完全相同时,一定要先更新娃娃在回答询问(当时就被这个卡了。。。)

代码

#include<bits/stdc++.h>
#define FOR(i,l,r) for(int i=(l),END=(r);i<=END;i++)
#define DOR(i,r,l) for(int i=(r),END=(l);i>=END;i--)
#define loop(i,n) for(int i=0,END=(n);i<END;i++)
#define sf scanf
#define pf printf
#define pb push_back
#define pii pair<int,int>
#define R first
#define H second
#define mms(a,x) memset(a,x,sizeof a)
using namespace std;
typedef long long ll;
typedef long double db;
template<typename A,typename B>inline void chkmax(A &x,const B y){if(x<y)x=y;}
template<typename A,typename B>inline void chkmin(A &x,const B y){if(x>y)x=y;}
const int N=2e5+5;
int n,q;
pii doll[N];
struct Pt2{struct node{int x,y,id;bool operator<(const node &A)const{if(x!=A.x)return x>A.x;if(y!=A.y)return y<A.y;return id<A.id;}}A[N<<1];int b[N<<1],ans[N],ct;struct Binary_Indexed_Tree{#define lowbit(x) (x&-(x))static const int M=4e5;int c[N<<1];void update(int x,int val){while(x<=M)chkmax(c[x],val),x+=lowbit(x);}int query(int x){int ret=0;while(x)chkmax(ret,c[x]),x-=lowbit(x);return ret;}}BIT;void solve(){FOR(i,1,n)b[++ct]=doll[i].H,A[i]=(node){doll[i].R,doll[i].H,0};;FOR(i,1,q){sf("%d%d",&A[n+i].x,&A[n+i].y);A[n+i].id=i,b[++ct]=A[n+i].y;}sort(b+1,b+ct+1);ct=unique(b+1,b+ct+1)-b-1;sort(A+1,A+n+q+1);FOR(i,1,n+q)A[i].y=lower_bound(b+1,b+ct+1,A[i].y)-b;FOR(i,1,n+q){if(A[i].id)ans[A[i].id]=BIT.query(A[i].y);else {int nw=BIT.query(A[i].y);BIT.update(A[i].y,nw+1);}}FOR(i,1,q)pf("%d\n",ans[i]);}
}Pt_2;

转载于:https://www.cnblogs.com/Heinz/p/10683381.html

俄罗斯套娃(JOISC 2016 Day 1)相关推荐

  1. 「JOISC 2016 Day 3」回转寿司

    https://loj.ac/problem/2736 题解 挺有意思的题. 考虑这种操作不好直接维护,还有时限比较长,所以考虑分块. 考虑一个操作对整个块的影响,无非就是可能把最大的拿走,再把新的元 ...

  2. 等比数列三角形 (数论 + 黄金分割点)+ JOISC 2016 Day3 T3 「电报」(基环树 + 拓扑排序)

    文章目录 T1:等比数列三角形 题目 题解 代码实现 T2:电报 题目 题解 代码实现 T1:等比数列三角形 题目 求三边都是 ≤n 的整数,且成等比数列的三角形个数 注意三角形面积不能为 0 注意 ...

  3. JOISC 2016 回转寿司

    题目 分块题都先考虑一个操作: 如果每次操作都是[1,n][1,n][1,n], 那么我们建一个大根堆,每次删除最大值,再把AAA塞进去即可. 再考虑一个操作: 操作完之后要根据堆和初始的数组更新出现 ...

  4. 【题解】「JOISC 2016 Day 3」回转寿司

    想一下传送带 (233) 我记得我和 lh 说了可以对于一个整块把一堆操作放在一起处理 暴力匹配是 O(nq)O(nq)O(nq) 的. 但是如果加一个优先队列呢? 那你就可以在 O(BlogQi)O ...

  5. 「小组联考」第二周三次考试

    「小组联考」第二周三次考试 T1 「JOISC 2016 Day 3」电报 题目 考场思考 正解 T2 「CQOI2016」路由表 题目 考场思考 正解 T3 「NOIP2014」飞扬的小鸟 题目 考 ...

  6. 2016计算机二级java_2016计算机二级JAVA练习题及答案

    2016计算机二级JAVA练习题及答案 21.下列选项中,不能输出100个整数的.是( ). A.for(int i=0;i<100;i++) System.out.println(i); B. ...

  7. 电大计算机应用,(2016年电大)电大全国计算机应用考试网考.doc

    (2016年电大)电大全国计算机应用考试网考 计算机基础知识一般认为,世界上第一台电子数字计算机诞生于-------.(1946年)计算机当前已应用于各种行业,各种领域,而计算机最早的设计是针对--- ...

  8. 2016多校赛2 A 数学推公式 E 极角排序,组合数(待补) L dp+bitset优化

    2016 Multi-University Training Contest 2 A - Acperience 题意:给出w[],求S((w[i]-aB[i])^2)的最小值(B[i]为1或-1). ...

  9. 2016.04.09 使用Powerdesigner进行创建数据库的概念模型并转为物理模型

    2016.04.09 使用Powerdesigner进行创建数据库的概念模型并转为物理模型 2016-04-09  21:10:24     本文原创受版权保护,严禁转载. 请大家不要用于商业用途,支 ...

最新文章

  1. linux创建组并指定gid的命令,在Linux中用groupadd命令创建组:创建具有特定GID的组及系统组...
  2. 如何在StackOverflow上获得第一个标签徽章-以及为什么它很重要。
  3. LIS路径记录(UVA481)
  4. 开源应用架构之asterisk
  5. 在java代码中设置TextView文本内容可滚动
  6. Google 面试题和详解
  7. StringBuffer,StringBuilder区别是啥
  8. 深入理解jvm jdk1,7(1)
  9. «构建并破坏它»:某些算法如何生成验证码,而另一些则如何破解
  10. (226)FPGA入门推荐书籍
  11. 为什么登录赛尔号显示服务器未开启,赛尔号之勇者无敌无法打开怎么办 赛尔号之勇者无敌登录不了解决方案...
  12. 环比同比YOY\QoQ及QQ\PP图Q-Q\P-P…
  13. 一些杂谈和对他们的认识程度
  14. html文件做屏保win10,win10系统把屏保设置为桌面壁纸的处理方法
  15. 知乎80万高赞的window10壁纸
  16. 黑喵桌面音乐播放器汉化版
  17. 网络安全等级保护备案申请指南(杭州)
  18. mysql 突然报错 1878 Temporary file write failure
  19. 微信接口php oa,你必须了解OA与微信结合的几种方式
  20. 胜天半子!阿里内部力荐SpringBoot全栈笔记全网首发,源码实战齐飞

热门文章

  1. 不止命令行-自定义VS生成事件
  2. C#中具有进程间通信的Singleton应用程序
  3. Ubuntu 20.04 LTS(Focal Fossa)发布
  4. linux 迁移mysql目录_linux默认mysql迁移目录
  5. msu文件无法运行_安装程序遇到报错?无法验证发布者?无法使用脚本直接调用?...
  6. 应用挂载beegfs指定目录_BeeGFS源码分析1-元数据服务概要分析
  7. 电脑时钟倒计时_倒计时久坐休息提醒工具
  8. acer软件保护卡怎么解除_人社局回应!从单位辞职了社保怎么处理
  9. java timestamp时间戳_求助!java中关于时间戳Timestamp的问题
  10. php中pdo连接数据库,PHP使用PDO连接数据库