Poj2828Buy Tickets线段树

  倒着搞就可以了,先进会被后面覆盖。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
#include<math.h>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int maxn=222222;
int sum[maxn<<2];
int color[maxn<<2];
int a[maxn];int b[maxn];
void up(int rt)
{
    sum[rt]= sum[rt<<1]+sum[rt<<1|1];
}

void build(int l,int r,int rt)
{
    color[rt]=0;
    if(l==r){
        sum[rt]=1; return ;
    }
    int mid=(l+r)>>1;
    build(lson);
    build(rson);
    up(rt);
}

void update(int ans,int add,int l,int r,int rt)
{
    if(l==r){
        sum[rt]-=1; color[rt]= add;
        return ;
    }
    int mid=(l+r)>>1;
    if(ans<=sum[rt<<1]) update(ans,add,lson);
    else update(ans-sum[rt<<1],add,rson);
    up(rt);
}

void ask(int key,int l,int r,int rt)
{
    if(l==r){
        printf("%d ",color[rt]) ;return ;
    }
    int mid=(l+r)>>1;
    if(key<=mid) ask(key,lson);
    else ask(key,rson);
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        build(1,n,1);
        for(int i=0;i<n;i++){
            scanf("%d%d",&a[i],&b[i]);
        }
        for(int i=n-1;i>=0;i--){
            update(a[i]+1,b[i],1,n,1);
        }
        for(int i=1;i<=n;i++)
            ask(i,1,n,1);
        cout<<endl;
    }
    return 0;
}

Poj2828Buy Tickets线段树,布布扣,bubuko.com

时间: 2025-01-07 11:16:33

Poj2828Buy Tickets线段树的相关文章

poj2828--Buy Tickets(线段树+详解)

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 13618   Accepted: 6802 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 wa

POJ训练计划2828_Buy Tickets(线段树/单点更新)

解题报告 题意: 插队完的顺序. 思路: 倒着处理数据,第i个人占据第j=pos[i]+1个的空位. 线段树维护区间空位信息. #include <iostream> #include <cstdio> #include <cstring> using namespace std; struct node { int x,v; } num[201000]; int sum[1000000],ans[201000]; void cbtree(int rt,int l,in

POJ 2828 Buy Tickets (线段树)

题目大意: 排队有人插队,每一次都插到第 i 个人的后面. 最后输出顺序. 思路分析: 你会发现,如果反向处理的话,你就知道这个人是第几个了. 那么问题一下子就简化了. 就是在线段树上找第几个空位置就行了. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <vector> #define lson num<<1

POJ 2828 Buy Tickets 线段树解法

此题应用线段树的方法非常巧妙.没做过真的难想得出是这么想的. 是一个逆向思维的运用. 其实一看到这道题目我就想到要运用逆向思维的了,但是就是没那么容易想通的. 思路: 1 要从后面往前更新线段树 2 线段树记录的是当前区间还剩下多少个记录空间 3 因为后面的插入会使得前面的插入往后退,那么前面插入的下标如果大于前面可以插入的空间,就需要往后退了. 好难理解的操作.仔细观察一下下面update这个函数吧. 二分地去查找适合的插入位置,把插入操作时间效率提高到 O(lgn),如果使用一般方法插入操作

poj-----(2828)Buy Tickets(线段树单点更新)

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 12930   Accepted: 6412 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 wa

【poj2828】Buy Tickets 线段树 插队问题

[poj2828]Buy Tickets 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

POJ 2828 Buy Tickets(线段树单点)

https://vjudge.net/problem/POJ-2828 题目意思:有n个数,进行n次操作,每次操作有两个数pos, ans.pos的意思是把ans放到第pos 位置的后面,pos后面的数就往后推一位.最后输出每个位置的ans. 思路:根据题 目可知,最后插入的位置的数才是最终不变的数,所以可以从最后的输入作第1个放入,依此类推,倒插入.在插入时也有一定的技术,首先创建一棵空线段树时,每个节点记录当前范围内有多少个空位置.在插入时,要注意,一个数放入之后那么这个位置就不用管了,那么

POJ 2828 Buy Tickets (线段树 or 树状数组+二分)

题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容易就确定了,那最后第二个人的位置也可以推(与最后一个人的位置无关)...依次就都可以确定所有的人了. 用前缀和的思想,要是这个人的位置确定了,那么就标记这个人位置的值为0,然后回溯更新,跟求逆序对个数的思想比较类似. 线段树: 1 #include <iostream> 2 #include &l

POJ 2828 Buy Tickets(线段树&#183;插队)

题意  n个人排队  每个人都有个属性值  依次输入n个pos[i]  val[i]  表示第i个人直接插到当前第pos[i]个人后面  他的属性值为val[i]  要求最后依次输出队中各个人的属性值 从头到尾看的话  队列是动态的   无法操作  但是反过来看时  pos[i]就可以表示第i个人前面还有多少个人了  然后想到了用线段树做就简单了  线段树维护对应区间还有多少个空位  每次把i放到前面刚好有pos[i]个空位的位置就行了  具体看代码 #include <cstdio> #de