Queue (HDU - 5493,树状数组 + 二分 || 线段树)

若依框架二次开发——若依 Vue3 版本前端样式优化指南 阅读详情

一.题目链接:

HDU-5493

二.题目大意:

有 n 个人排队,身高各不相同.

给出每个人的身高,以及队中他前面比他高或者后面比他高的人数.

若此队伍存在,则输出最小字典序的队伍排列.

否则,输出 "impossible".

三.分析:

因为是求最小字典序,所以先对身高排序,之后再向队中加人.

假设第 i (1 ≤ i ≤ n) 个人的身高为 h,队中他前面比他高或者后面比他高的人数为 k.

则有两个位置可供他插入.

① 队中他前面比他高的人数为 k:则插入的位置应为从前往后的第 k + 1 个空位.

① 队中他后面比他高的人数为 k:则插入的位置应为从前往后的第 n - i - k + 1 个空位.

又因为要求最小字典序

所以第 i 个人所插入的位置应为 min(k+ 1, n - i - k + 1).

现在问题分解为了求第 x 个空位的索引.

有两种方法解决.

1 表示空位,0 表示已有人,

① 树状数组 + 二分:树状数组区间求和当做 check()函数,二分每个人的位置,之后再单点更新.

② 线段树:查询第 x 个空位的下标,之后再单点更新.

现在考虑什么情况是有矛盾的.

易得:第 i 个人前面的空位不足 k 且 后面的空位也不足 k.

即:k + i > n.

四.代码实现:

①树状数组 + 二分

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define lc k * 2
#define rc k * 2 + 1
#define pi acos(-1.0)
#define ll long long int
using namespace std;

const int M = (int)1e5;
const int inf = 0x3f3f3f3f;

struct node
{
    int k;
    int h;
}s[M + 5];

int n;
int h[M + 5];
int c[M + 5];

bool cmp(node a, node b)
{
    return a.h < b.h;
}

int lowbit(int x)
{
    return x & (-x);
}

void update(int x, int v)
{
    for(int i = x; i <= n; i += lowbit(i))
        c[i] += v;
}

int sum(int x)
{
    int ans = 0;
    for(int i = x; i > 0; i -= lowbit(i))
        ans += c[i];
    return ans;
}

int binary1(int i)
{
    int l = 1;
    int r = n;
    while(l < r)
    {
        int mid = (l + r) >> 1;
        if(sum(mid) < s[i].k + 1)
            l = mid + 1;
        else
            r = mid;
    }
    return r;
}

int binary2(int i)
{
    int l = 1;
    int r = n;
    while(l < r)
    {
        int mid = (l + r + 1) >> 1;
        if(sum(n) - sum(mid - 1) < s[i].k + 1)
            r = mid - 1;
        else
            l = mid;
    }
    return r;
}

int main()
{
    int T;
    scanf("%d", &T);
    for(int ca = 1; ca <= T; ++ca)
    {
        scanf("%d", &n);
        for(int i = 1; i <= n; ++i)
            scanf("%d %d", &s[i].h, &s[i].k);
        sort(s + 1, s + n + 1, cmp);
        memset(c, 0, sizeof(c));
        for(int i = 1; i <= n; ++i)
            update(i, 1);
        bool flag = 1;
        for(int i = 1; i <= n; ++i)
        {
            if(i + s[i].k > n)
            {
                flag = 0;
                break;
            }
            int pos = min(binary1(i), binary2(i));
            h[pos] = s[i].h;
            update(pos, -1);
        }
        printf("Case #%d: ", ca);
        if(flag)
        {
            for(int i = 1; i <= n; ++i)
                printf("%d%c", h[i], i == n ? '\n' : ' ');
        }
        else
            printf("impossible\n");
    }
    return 0;
}

② 线段树

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define lc k * 2
#define rc k * 2 + 1
#define pi acos(-1.0)
#define ll long long int
using namespace std;

const int M = (int)1e5;
const int inf = 0x3f3f3f3f;

int n;

struct node1
{
    int h;
    int k;
} s[M + 5];

int height[M + 5];
int tree[M * 4 + 5];

bool cmp(node1 a, node1 b)
{
    return a.h < b.h;
}

void push_up(int k)
{
    tree[k] = tree[lc] + tree[rc];
}

void build(int k, int l, int r)
{
    if(l == r)
    {
        tree[k] = 1;
        return;
    }
    int mid = (l + r) >> 1;
    build(lc, l, mid);
    build(rc, mid + 1, r);
    push_up(k);
}

int query(int k, int l, int r, int a, int b)
{
    if(l >= a && r <= b)
        return tree[k];
    int mid = (l + r) >> 1;
    int ans = 0;
    if(a <= mid)
        ans += query(lc, l, mid, a, b);
    if(mid < b)
        ans += query(rc, mid + 1, r, a, b);
    return ans;
}

void update(int k, int l, int r, int num, int h)
{
    if(l == r)
    {
        tree[k] = 0;
        height[l] = h;
        return;
    }
    int mid = (l + r) >> 1;
    if(num <= tree[lc])
        update(lc, l, mid, num, h);
    else
        update(rc, mid + 1, r, num - tree[lc], h);
    push_up(k);
}

int main()
{
    int T;
    scanf("%d", &T);
    for(int ca = 1; ca <= T; ++ca)
    {
        scanf("%d", &n);
        for(int i = 1; i <= n; ++i)
            scanf("%d %d", &s[i].h, &s[i].k);
        build(1, 1, n);
        sort(s + 1, s + n + 1, cmp);
        bool flag = 1;
        for(int i = 1; i <= n; ++i)
        {
            if(i + s[i].k > n)
            {
                flag = 0;
                break;
            }
            update(1, 1, n, min(s[i].k + 1, n - i - s[i].k + 1), s[i].h);
        }
        printf("Case #%d: ", ca);
        if(flag)
        {
            for(int i = 1; i <= n; ++i)
                printf("%d%c", height[i], i == n ? '\n' : ' ');
        }
        else
            printf("impossible\n");
    }
    return 0;
}

 

SAP_MM模块采购订单显示含税价&不含税简介 不含税价(Net Price):基础商品价格,不包含税金。含税价(Gross Price):基础价格加上适用税金后的总价。在SAP中,采购订单通常以不含税价为基础,通过配置税码和定价方案,系统会自动计算含税总价。 阅读详情

相关推荐

Wi-Fi QoS中AIFSN/CWmin/CWmax/TxOP参数是怎样计算的?

802.11e/WMM的EDCA机制通过AIFS、CWmin/CWmax和TxOP三组参数实现业务优先级控制。AIFS决定最短等待时间(AIFS=SIFS+AIFSN×SlotTime),CWmin/CWmax定义退避范围(2^ECW-1),TxOP设置最大占用时长(32µs单位)。默认配置中,语音业务(VO)优先级最高,其AIFSN最小(2)、CW范围最小(3-7)、TxOP适中(1.504ms);视频(VI)次之;普通数据(BE)和后台(BK)优先级最低。调优需根据网络特性调整参数:VoIP可降低AIF

1042484520@qq.com(邮箱) 1744

HDU-5493 Queue(线段树)

题意: 有nnn个人排队,但是他们不清楚自己的位置,他们只知道自己的身高hih_ihi​和队伍 前面或后面有多少人的身高比他们高(并不知道是前面还是后面)。 求一个合法的安排方案,并且该方案字典序最小。 题解: 先按照身高排序,从小到大依次安排位置,对于每个人,假设他前面或后面有k个人身高比他高,那么他的位置就必须要在从前往后的第k+1k+1k+1个空位置中或者从后往前的第k+1k+1k+1个空位置中,否则一定不满足,并且还要判断当前的空位置个数是否≥k+1\geq k+1≥k+1 。要求字典序最小,那么就

the best 的博客 213

computer planetary——全球生物多样性信息机构 (GBIF)

正如npartitions所表明的,这个Parquet数据集是由许多单独的parquet文件组成的。(GBIF) 是一个由世界各国政府资助的国际网络和数据基础设施,提供记录物种发生的全球数据。重新处理数据的原因有多种,包括主干分类的更改,因此该日期不一定是发生记录最后更改的日期。GBIF 发生数据集结合了来自广泛来源的数据,包括来自自然历史博物馆的标本相关数据、来自公民科学网络的观察和自动环境调查。为了了解最常观察到的物种,我们将对数据集进行分组,并获得每个物种的计数。大多数字段名称对应于。

此星光明博客 1635

HDU5493-Queue

Queue                                                                               Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

wang_128的博客 540

史上最全工商银行核心系统建设历程:从“数据集中”到“ECOS”2.0,见证银行业信息科技跨时代发展征程

ECOS工程的直接成果是建成了工商银行第五代信息系统,即从单一核心银行系统到去核心化开放生态系统,率先开启了以智能化、开放化为特征,数据驱动引领经营模式变革,创新提出了一整套国际领先的分布式开放生态银行系统建设方案,在大型银行全分布式系统架构、主机下移、银行系统生态化转型、大规模交易型分布式数据库等多个领域再次实现“0到1”的突破,建成了具备国际领先水平的全分布式开放生态银行系统,继续勇立数字化转型潮头,推动高质量发展再上新台阶。工商银行的业务连续性管理水平实现了跨越式发展,有力地保障了业务发展。

银行信息系统应用架构详解 824

融合双主干网络提升YOLOv8性能一种基于SOTA思想的目标检测改进

YOLOv8采用了单一的主干网络进行特征提取,通常是基于CSPDarknet作为骨干网络,在目标检测过程中通过不同的卷积层提取不同尺度的信息。虽然这种设计在大多数应用场景下表现出色,但在面对复杂背景、细节丰富的物体或小物体检测时,YOLOv8有时难以保持良好的精度。在本文中,我们提出了一种基于双主干网络的YOLOv8改进方案,通过结合先进的SOTA思想,全面提升了YOLOv8在目标检测任务中的表现。双主干网络架构。

博客 1153

Queue HDU - 5493

点击打开链接   每个人只记得前边或者后边有多少人比自己高 对于最高的人来说比他高的人不存在 次高的人最多有一个比他高 次次高的人最多有两个比他高。。。以此类推 只要有人超出这个范围就是impossible 而只要每个人都不超出这个范围 那这个队列一定存在(每个人都不超范围&lt;=&gt;队列存在) 因为题目给的条件是比某人高的人在其前或后有多少 且每个人的高度是唯一的 所以我们要按身高从...

sunyutian1998的博客 297

焊缝缺陷智能检测:基于 YOLO 的工业质检系统实战

从焊缝缺陷数据集的构建到模型训练,从桌面检测界面到缺陷统计输出,本文覆盖了一套工业焊缝质检系统的完整路线。这个场景的核心难点在数据层面——气孔和裂纹这类小目标的标注质量直接决定了模型的最终表现。建议先在开源数据集上跑通全链路,确认 mAP 达到可接受的水平后,再通过补充特定类型的小目标数据和提升输入分辨率来做精度优化。工业场景中,漏检一个气孔的成本和误报一个假阳性的成本不一样——根据对两类成本的承受力,调整置信度阈值来找到业务上的最佳平衡点。

m0_71589036的博客 202

HDU - 5493 Queue(二分+树状数组)

题目链接:传送门   题意:给你n个人,知道每个人的身高和每个人的前面或者后面有多少个比他高的,让你输出字典序最小的可能的排序。   思路:我们可以将人按身高升序顺序,然后模拟插空,因为这样我们就能保证之后插入的人有位置可插,只要注意每次我们可以判断需要插入的空位置=min(k,n-i-k)。(i为第i个人,k为第i个人有k个比他高的),如果小于0(代表n-i-k&lt;0,空位置小于k个...

liexss的博客 294

真随机数与伪随机数

前面我们学习了LFSR,这个玩意落地到具体的应用是什么呢?没错是寄存器,这里在网络找到了几个回答,这里做个记录,下面一起来学习一下吧。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1062

交货单冲销发货过账的正确姿势:用 VL09 与 ABAP 批量反冲 Goods Issue

摘要 本文详细解析了SAP系统中VL09事务码的技术实现与业务应用。VL09用于反冲发货的货物移动,通过标准冲销路径(移动类型602冲销601)确保单据链路一致、状态机正确回退和业务规则生效。文章对比了经典VL09与Fiori应用在不同SAP产品形态中的位置,并针对STO场景提供了ME23N验证方法。核心内容包括WS_REVERSE_GOODS_ISSUE函数模块的调用要点、必须COMMIT的原因(SAP LUW机制),以及处理Handling Unit等限制条件的注意事项。最后给出了将VL09工程化的项目

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 588

hdu 5493(线段树)

题意: 有n个人,每个人的身高和左边(或右边)比自己高的人的个数height[i],输出符合给出的条件且字典序最小的从左到右队列里每个人的身高。 思路: 先将每个人的身高按照从矮到高排序,当第i个人入座的时候,后面还有(n-i)个人比他高,第i个人要求左边或右边比他高的人数为k, 如果n-i身高字典序最小,我们可以在左边留k个空位或者右边,(具体留左边还是右边,看第i个人坐下去时,哪个字

程序员的冷浪漫 871

CAPL编程规范与最佳实践

通过本文的学习,读者应该对CAPL编程规范与最佳实践有了初步的了解,并能够编写高质量的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1747

Queue HDU - 5493(线段树||树状数组+二分)

NN people numbered from 1 to NN are waiting in a bank for service. They all stand in a queue, but the queue never moves. It is lunch time now, so they decide to go out and have lunch first. When they ...

starlet_kiss的博客 315

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

HDU 5493 Queue 二分+树状数组

Queue Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1553    Accepted Submission(s): 798   Problem Description N people numbered from 1 to ...

LSD20164388的博客 474

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

HDU 5493 Queue【树状数组+二分查找】

参看资料: https://blog.youkuaiyun.com/sdz20172133/article/details/86497650 https://blog.youkuaiyun.com/sky_miange/article/details/48791881 https://blog.youkuaiyun.com/hyczms/article/details/48767933 题目: NN people num...

二喵君的博客 336

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

补题列表

上海网络赛: HDU 5468 Puzzled Elena 莫比乌斯反演 树形DP HDU 5469 Antonidas 暴力+剪枝 HDU 5473 There was a kingdom 求凸包 然后做DP 合肥网络赛: HDU 5487 Difference of Languages BFS HDU 5486 Difference of Clustering 并查...

weixin_30641999的博客 105

HDU 5493 Queue (线段树逐个插入)

参考博客: http://blog.youkuaiyun.com/hyczms/article/details/48767933题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5493题目大意:有n个人排队,每个人都有一个身高,每个人记得他前面或者后面可能有x个人比他高(满足一个就行),问能否有一个序列满足给出的条件,如果有,请让字典序最小,解题思

仰望星空 883

HDU - 5493(线段树)

NN people numbered from 1 to NN are waiting in a bank for service. They all stand in a queue, but the queue never moves. It is lunch time now, so they decide to go out and have lunch first. When they ...

a1046765624的博客 363

HDU-5493(二分+树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5493 采用线段树也可解,本题解为树状数组 要字典序最小那么就要把身高排个序然后一个个插,每个人有两个可能位置,因为要求他前面的都比他矮,为了让字典序最小,就分给这个人一个较小的位置。注意要二分第i个人的位置, 然后用树状数组确定他前面有多少人以此得到空余的位置数 #include&lt;iostrea...

weixin_40630836的博客 341

hdu 5493

Queue Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 348    Accepted Submission(s): 194 Problem Description N people numbered fr

' 泪 添 无 言's blog 621

HDU - 5493 Queue —— 插空

Queue Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1436    Accepted Submission(s): 735 Problem Description N people numbered f

Lngxling的博客 277

HDU 5493 Queue(二分+树状数组)

题目链接: 点击打开链接 题意:有n个人排队,每个人都有一个独一无二的身高,告诉你每个人的身高和他前面或者后面的比他高的人的个数(到底是前是后是未知的)。  要求你还原原来的队列,并且字典序最小。 思路: 因为要求字典序最小, 我们可以先按照身高从小到大排序,假设当前到了第i高的人, 他前面或者后面有k个人, 那么他前面的所有人都比他矮, 比他高的还有n-i个人,那么假设他前面还有p个空位,

AC_Arthur的专栏 1573

HDU 5493 Queue(线段树啊 单点更新)

HDU 5493 Queue(线段树啊 单点更新)

1270

HDU5493 Queue【线段树】

题目大意: 有 N 个人排队,每个人都忘记自己的位置。但是每个人都知道自己的身高 Hi 和自己前 边或后边有 Ki 个比自己高的人。给你每个人的 Hi,Ki,求按身高满足最小序的情况。 如果不满足最小序的情况,则输出"impossible"。 解题思路: 题目要求输出身高字典序最小的情况,那么先对身高按从小到大排序。然后按身高从小 到大确定每个人的位置。由于每次都是从小到大,则每次放进的人都是比之前的人高的。 设当前放进的人是身高从小到大第 i 个人,如果要满足他前边或后边刚好有 k 个人比他 高,则:

程序员充电站(itcharge) 1209

Cupcake Bonuses(UCF Local Programming Contest 2018 E,dfs序 + 线段树)

一.题目链接: Cupcake Bonuses 二.题目大意: 初始有一个员工,有四种操作: 1 i:给第 i 员工一个员工. 2 i m:把第 i 号员工的工资系数置为 m. 3 i b:给第 i 号员工及其所有下属基金为 b 的工资,每个人的实际所获工资等于 基金b * 这个人的工资系数. 4 i:查询第 i 号员工当前已获得的实际工资. 三.分析: 这题直接暴力即可.(比赛...

The___Flash的博客 800
上一篇: MAZE(2019牛客暑期多校训练营(第二场)E,线段树 + 矩阵乘法)
下一篇: 序列变换 (HDU - 5256,Lis 应用)
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值