首页 > 其他分享 >按按钮题解

按按钮题解

时间:2024-06-04 21:45:40浏览次数:12  
标签:int 题解 机器人 按钮 区间 define

按按钮题解

在量体温,打不了代码,来写题解。

赞美 lwq,三句话让我跟上了课堂节奏。

题意

数轴 \(n\) 个按钮,第 \(i\) 个按钮在坐标 \(i\)。有 \(m\) 次询问,\(i\) 询问为在时刻 \(t_i\) 按下 \(b_i\)。

可以在时刻 \(0\) 安排一些机器人,机器人可以花 \(1\) 单位时间向左或右移动 \(1\) 个单位。机器人按下按钮不需要时间。

问最初最少安排多少个机器人。

Solution

每个按钮在被按后,改点的机器人可以走到的范围是一个区间。

\[[b_i+Max-t_i,b_i-(Max-t_i)] \]

其中 \(Max\) 为最大的 \(t_i\)。

接着,如果这些区间里存在一些小区间被一个大区间完全覆盖,那么这些小区间的任务可以都交给一个机器人去做。

思路到此就很清晰了,即求一个最小集,这个集合里都是互不完全包含的区间。答案即这个集合的大小。

怎么做呢?

区间按左端点从小到大、右区间从大到小排序,然后树状数组处理一下就好了。

时间复杂度 \(O(n\log n)\)。

#include<bits/stdc++.h>
using namespace std;

#define int long long
#define pii pair<int,int>
#define ft first
#define sd second

const int N=5e6+5;

int n,m;
int t[N],b[N];
pii a[N];
int tr[N];
int tmp[N],tot;
map<int,int> Hs;

void add(int x,int k) {for(;x<=tot;x+=x&-x)tr[x]=max(tr[x],k);}

int query(int x) {int c=0;for(;x;x-=x&-x)c=max(c,tr[x]);return c;}

bool cmp(pii x,pii y)
{
    if(x.ft!=y.ft)
        return x.ft<y.ft;
    return x.sd>y.sd;
}

signed main()
{
    scanf("%lld%lld",&n,&m);
    int Max=0;
    for(int i=1;i<=m;i++)
        scanf("%lld",&t[i]),Max=max(Max,t[i]);
    for(int i=1;i<=m;i++)
    {
        scanf("%lld",&b[i]);
        tmp[++tot]=b[i]-(Max-t[i]);
        tmp[++tot]=b[i]+Max-t[i];
    }
    sort(tmp+1,tmp+tot+1);
    for(int i=1;i<=tot;i++)
        Hs[tmp[i]]=i;
    for(int i=1;i<=m;i++)
    {
        a[i].ft=Hs[b[i]-(Max-t[i])];
        a[i].sd=Hs[b[i]+Max-t[i]];
    }
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=m;i++)
        add(a[i].sd,query(a[i].sd-1)+1);
    printf("%lld\n",query(tot));
    return 0;
}

标签:int,题解,机器人,按钮,区间,define
From: https://www.cnblogs.com/holmes-wang/p/18231812

相关文章

  • acwing329 围栏障碍训练场 题解
    考试压轴题,意识到这题是线段树优化\(dp\)时追悔莫及。为了简化题目,我将从起点到原点变成了从原点到起点(这样就可以省去两个数组的空间)。想到设\(dp_{i,j}\)表示在第\(i\)层,奶牛们在\(j\)列时的最小移动范围,则转移方程为(设输入为\(l,r\)):\[\begin{cases}dp_{i,j}=dp_{......
  • 会前会后系统Q&A:董事会管理工具相关问题解答
    不同企业在购买董事会管理工具时,都会带有不同的功能需求,希望能够借此提升本企业的董事会管理效率和质量。作为垂直领域的专业SaaS工具,会前会后针对董事会的工作流程研发,符合董事会成员的使用系统,在董事履职、董事会管理中提供颇多助力。下面是关于会前会后系统董事会管理工具......
  • Codeforces Round 949 (Div. 2) 中文题解
    A对于一个特定的\(x\),Piggy总是会选择\(p\)使得\(p\)是质数,所以分数就是\(x\)的质因子个数。容易发现至少有\(t\)个质因子的数是\(2^t\)。最大的满足\(2^t\ler\)的整数\(t\)是\(\left\lfloor\log_2r\right\rfloor\)。又因为\(2l\ler\),所以\(\log_2l+......
  • gpt4free软件的 g4f gui 网页速度非常慢的问题解决
    问题:g4f gui启动网页很难连上gpt4free是一个为大众提供的Openai等大模型API调用服务的软件,但是在装好启动g4f gui,使用8080端口连接后,发现网页一直在执行,半天还没好。怀疑是网页里面的一些js加载有问题。通过在python命令行使用importg4f;g4f.version命令来找到g4f的......
  • MySQL数据库:Lock wait timeout exceeded; try restarting transaction问题解析及解决方
    MySQL数据库:Lockwaittimeoutexceeded;tryrestartingtransaction问题解析及解决方案一、背景描述二、原因分析三、解决方案3.1方案一事务信息查询3.2方案二如果杀掉线程依然不能解决,可以查找执行线程耗时比较久的任务,kill掉3.3方案三innodb_lock_wait_timeout锁定等......
  • (第25天)【leetcode题解】二叉树的层序遍历
    目录429、N叉树的层序遍历题目描述思路代码515、在每个树行中找最大值题目描述思路代码116、填充每个节点的下一个右侧节点指针题目描述思路代码117、填充每个节点的下一个右侧节点指针II题目描述思路代码104、二叉树的最大深度题目描述思路代码111、二叉树的最小深......
  • 2009年408真题解析
    2009年408真题解析【2009.1】为解决计算机主机与打印机之间速度不匹配问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是。A.栈B.队列C.树D.图【知识点】栈和队列特点及应用。【答案】B......
  • 防止按钮重复点击 Swift
     typealiasActionBlock=((UIButton)->Void)extensionUIButton{privatestructAssociatedKeys{staticvarActionBlock="ActionBlock"staticvarActionDelay="ActionDelay"}///运行时关联......
  • BootStrap入门到实战:BootStrap组件(一)- Glyphicons字体图标、下拉菜单、按钮组、按钮式
    目录 一、Glyphicons字体图标二、下拉菜单1.基本实例1.1示例1.2用jQuery实现1.3菜单向上弹出2.对齐3.标题4.分割线5.禁用的菜单项三、按钮组1.基本实例2.按钮工具栏3.尺寸4.嵌套5.垂直排列6.两端对齐排列的按钮组四、按钮式下拉菜单1.单按......
  • P10536 [Opoi 2024] 二十六点 题解
    比较直接的做法。当\(P_x=1\)时显然可以暴力DP,设\(f_{x,c}\)表示\(x\)的子树中以\(c\)开头的最长不下降子序列的长度。直接转移即可。\(P_x\neq1\)的时候呢?我们发现,所谓“忽略掉这些路径中的第\(2\)到第\(P_x\)个的点”,代表的就是按照深度转移,大概就是这样:......