`
Simone_chou
  • 浏览: 197458 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Buy Tickets(线段树)

    博客分类:
  • POJ
 
阅读更多
Buy Tickets
Time Limit: 4000MS   Memory Limit: 65536K
Total Submissions: 10862   Accepted: 5273

Description

Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queue…

The Lunar New Year was approaching, but unluckily the Little Cat still had schedules going here and there. Now, he had to travel by train to Mianyang, Sichuan Province for the winter camp selection of the national team of Olympiad in Informatics.

It was one o’clock a.m. and dark outside. Chill wind from the northwest did not scare off the people in the queue. The cold night gave the Little Cat a shiver. Why not find a problem to think about? That was none the less better than freezing to death!

People kept jumping the queue. Since it was too dark around, such moves would not be discovered even by the people adjacent to the queue-jumpers. “If every person in the queue is assigned an integral value and all the information about those who have jumped the queue and where they stand after queue-jumping is given, can I find out the final order of people in the queue?” Thought the Little Cat.

Input

There will be several test cases in the input. Each test case consists of N + 1 lines where N (1 ≤ N ≤ 200,000) is given in the first line of the test case. The next N lines contain the pairs of values Posi and Vali in the increasing order of i (1 ≤ i ≤ N). For each i, the ranges and meanings of Posi and Vali are as follows:

  • Posi ∈ [0, i − 1] — The i-th person came to the queue and stood right behind the Posi-th person in the queue. The booking office was considered the 0th person and the person at the front of the queue was considered the first person in the queue.
  • Vali ∈ [0, 32767] — The i-th person was assigned the value Vali.

There no blank lines between test cases. Proceed to the end of input.

Output

For each test cases, output a single line of space-separated integers which are the values of people in the order they stand in the queue.

Sample Input

4
0 77
1 51
1 33
2 69
4
0 20523
1 19243
1 3890
0 31492

Sample Output

77 33 69 51
31492 20523 3890 19243

Hint

The figure below shows how the Little Cat found out the final order of people in the queue described in the first test case of the sample input.

       题意:

       N(1到200000)个人插队问题。给出N个人的插队位置(0到N-1)和编号(0到32767),最终输出这N个人的顺序。

      

       思路:

       人一个个的插入队列中,如果按顺序的插入的话,这个人当前的位置不一定是最终的位置,可能会被后面的人插队而导致退后,所以应该换种思考方式思考。从最后一个开始往前插空,最后一个插进去的位置一定是固定的,所以应该从最后一个开始往前固定每个人的座位,前面pos的值代表该人前面有多少个空位,用线段树维护每个区间的空位数即可求出最终序列。

 

       AC:

#include<stdio.h>
#define MAX (200000+5)  //这里要括号
typedef struct
{
	__int64 l,r,ex;
}node;

node no[MAX*3];
__int64 ex[MAX],num[MAX],fin[MAX];
__int64 t;  //定义t全局变量

void build(__int64 from,__int64 to,__int64 i)
{
	__int64 mid=(from+to)/2;
	no[i].l=from;
	no[i].r=to;
	if(from==to)
	{
		no[i].ex=1;
		return;
	}
	build(from,mid,2*i);
	build(mid+1,to,2*i+1);
	no[i].ex=no[2*i].ex+no[2*i+1].ex;
}

void find(__int64 p,__int64 i)
{
	if(no[i].l==no[i].r)
	{
		no[i].ex--;
//插到这个位置之后,这个位置清零
		fin[no[i].l]=num[t];
//用fin数组保存最终的顺序
		return;
	}
	if(no[2*i].ex<=p) find(p-no[2*i].ex,2*i+1);
//如果左儿子的空位数小于这个位置所需要的空位数,则访问右儿子
//要减去左儿子的空位数再访问
	else              find(p,2*i);
	no[i].ex=no[2*i].ex+no[2*i+1].ex;
}

int main()
{
	__int64 n;
	while(scanf("%I64d",&n)!=EOF)
	{
		for(__int64 i=1;i<=n;i++)
			scanf("%I64d%I64d",&ex[i],&num[i]);
		build(1,n,1);
//从最后一个开始往前插入空位
		for(t=n;t>=1;t--)
			find(ex[t],1);
		for(__int64 i=1;i<=n;i++)
			{
				printf("%d",fin[i]);
				i==n?printf("\n"):printf(" ");
			}
	}
	return 0;
}

 

        总结:

        1.同样也是多输入,细心;

        2.灵活运用,多加练习。

 

14 - 7 - 23  AC:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX = 200005;

int q[MAX * 10], num[MAX];
int a[MAX], b[MAX];

void push_up (int node) {
        q[node] = q[node << 1] + q[node << 1 | 1];
}

void build(int node, int l, int r) {
        if (l == r) {
                q[node] = 1;
        } else {
                int mid = (r + l) >> 1;
                build (node << 1, l, mid);
                build (node << 1 | 1, mid + 1, r);
                push_up(node);
        }
}

void update (int node, int l, int r, int k, int who) {
        if (l == r) {
                q[node] = 0;
                num[l] = who;
                return;
        }

        int mid = (r + l) >> 1;
        if (q[node << 1] > k) update(node << 1, l, mid, k, who);
        else update(node << 1 | 1, mid + 1, r, k - q[node << 1], who);

        push_up(node);
}

int main() {
        int n;

        while (~scanf("%d", &n)) {
                build (1, 1, n);

                for (int i = 1; i <= n; ++i) {
                        scanf("%d%d", &a[i], &b[i]);
                }

                for (int i = n; i >= 1; --i) {
                        update(1, 1, n, a[i], b[i]);
                }

                printf("%d", num[1]);
                for (int i = 2; i <= n; ++i) {
                        printf(" %d", num[i]);
                }
                printf("\n");
        }

        return 0;
}

 

分享到:
评论

相关推荐

    线段树小总结

    1011 Buy Tickets (100% 完成率) - **问题描述**:购票问题,可能需要通过线段树来优化购票策略或者查询票价区间。 - **解决方案**:通过维护票价的变化区间,可以快速更新票价并在用户购买时查询最优价格。 ####...

    Python-tickets通过CLI进行票务操作

    "Python-tickets通过CLI进行票务操作"的项目旨在利用Python构建一个命令行界面(CLI)工具,使得用户能够方便地进行票务管理。CLI工具通常以简洁、高效的方式交互,对于快速执行任务和自动化流程非常理想。 首先,...

    Tmall_Tickets-master.rar

    【标题】"Tmall_Tickets-master.rar" 是一个与天猫平台相关的压缩文件,根据描述,它包含了一个天猫茅台抢购软件。这个软件可能是一个浏览器插件,设计用于帮助用户更高效地参与天猫上的茅台酒抢购活动。茅台酒作为...

    Laravel开发-tickets

    在本文中,我们将深入探讨基于Laravel框架的“tickets”项目开发。Laravel是一个流行的、开源的PHP框架,它为Web应用开发提供了优雅的工具和结构,使得开发者能够快速、高效地构建高质量的Web应用程序。 首先,让...

    Python库 | tickets-0.2.0-py3-none-any.whl

    标题中的"tickets-0.2.0-py3-none-any.whl"是一个Python库的发行文件,这通常是一个轮子(wheel)文件,是Python软件包的二进制格式。这种格式的文件使得安装Python库更为高效,因为它可以直接被Python的pip工具安装...

    Tickets.pdf

    由于您提供的文件标题为“Tickets.pdf”,没有具体的内容和标签信息,因此我无法提供一个与文件内容相关的详细知识点。为了满足您的要求,我会尝试根据文件标题“Tickets.pdf”进行假设,并提供一些通用的知识点,...

    PHP Support Tickets-开源

    - `support_tickets.sql`:这是一个SQL文件,很可能包含了数据库结构和初始数据,用于快速设置和初始化数据库。 - `upload`:可能是一个目录,用于存储用户上传的附件或证据文件。 3. **开源软件的优势**: - ...

    095&096-Tickets, Please..lrc

    095&096-Tickets, Please..lrc

    tixcraft_bot:Max抢票机器人(maxbot) help you quickly buy your tickets

    tixcraft_bot maxbot(Max抢票机器人) help you quickly buy your ticketsDownload (抢票程式下载) Demo (示范影片) How to use (如何使用) or How to execute source code (透过原始码的执行方法) 1: download ...

    Python库 | django_zendesk_tickets-0.8-py2-none-any.whl

    **Python库 django_zendesk_tickets-0.8-py2-none-any.whl 深度解析** `django_zendesk_tickets-0.8-py2-none-any.whl` 是一个针对Python开发者的库,用于集成Django框架与Zendesk客服系统。这个库允许开发者在...

    The Lottery Tickets Hypothesis for Supervised and Self-Supervise

    The Lottery Tickets Hypothesis for Supervised and Self-Supervised Pre-Training in Computer Vision Models

    Flights & Tickets 航班机票数据集.7z

    数据集“Flights & Tickets 航班机票数据集.7z”是一个专门针对航班和机票搜索趋势的研究资源,它提供了Google搜索引擎对于此类关键词的排行信息。这个数据集的独特之处在于其持续性,每15天更新一次,覆盖了100个...

    这是一个火车售票管理系统_train-tickets.zip

    这是一个火车售票管理系统_train-tickets

    damai_tickets-master1.zip

    【标题】"damai_tickets-master1.zip" 是一个与在线票务系统相关的代码仓库的压缩包,很可能包含了一个名为 "damai_tickets-master" 的项目源码。从名称来看,这个项目可能与大麦网(Damai)的票务系统有关,可能是...

    java-leetcode题解之Minimum Cost For Tickets.java

    在解决“Minimum Cost For Tickets”这道题目时,我们主要需要关注动态规划这一算法的应用。该问题可以被视为一个典型的背包问题,需要计算在不同旅行天数情况下所需的最小费用。在编程实践中,我们通常会使用数组来...

    SWP_Abstract_Tickets

    SWP_Abstract_Ticket 摘要HÜ erzeugen Sie eine abstrakte Klassefür门票(体育,Konzert和剧院门票) Abzuspeichernde Informationen: 违规行为 普通名称 巴氏杆菌 票证 eine Methode berechneTicketpreis ...

    C++对象模型

    在这个例子中,`Person` 类有一个虚函数 `BuyTickets`,而 `Student` 类继承自 `Person` 并重写了 `BuyTickets` 函数。当通过 `Fun` 函数调用 `BuyTickets` 时,会根据传入的参数类型决定调用哪个版本的 `BuyTickets...

    for tickets

    this source is used for those people who are far from their home to book a ticket easily.

Global site tag (gtag.js) - Google Analytics