题目大意:依次描述了一个N个人的队伍,每个人所站的序号以及他的价值,依次描述每个人的过程中,存在序号相同的人,表示该人插入到了前一个序号相同的人的前面。最后输出整个队伍的值排列情况。

这个题目确实难以想到居然可以用线段树做,之前还脑残去敲什么链表,结果发现链表这玩意儿真不是一般的垃圾,好多地方根本就无法对时间进行优化。

当然了,就算告诉了你用线段树做,可能还是会很头疼,这里涉及插队操作。。而且线段树具体是存放什么东西的呢

线段树就是为了模拟当前队伍的空位数,比如一个4人队伍,Root肯定是值为4 然后左右孩子都为 2 2 ,最底下4个孩子均为1,表示该位置还可以插入几个人

插队操作是比较蛋疼的,为了避免插队,大牛们给的神思路是从后往前遍历,原理很简单,如果是插队,那从后往前,最后一个插队的,必定是站在他插得位置,扫到前面,被插队的人,因为插队的人已经占据了线段树的一个孩子,所以被插队的人只能乖乖自己选择后面的孩子。由此,问题迎刃而解。

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 200005
#define Lson (x<<1),l,mid
#define Rson (x<<1|1),mid+1,r
using namespace std;
int d[maxn*];
int pos[maxn],v[maxn];
int ans[maxn];
void getup(int x)
{
d[x]=d[x<<]+d[x<<|];
}
void build (int x,int l,int r)//建树如同上面的分析,使得整棵树用来存队伍里的空位数
{
if (l==r)
{
d[x]=;
return;
}
int mid=(l+r)/;
build(Lson);
build(Rson);
getup(x);
}
void query(int loc,int rec,int x,int l,int r)
{
if (l==r)
{
d[x]--; //找到了对应的空位,则空位数--;
ans[l]=v[rec];//l保存了当前是队伍第几个
return;
}
int mid=(l+r)/;
if (loc<=d[x<<]) query(loc,rec,Lson);
else
query(loc-d[x<<],rec,Rson);//这里的比较需要注意,我之前一度弄混成比较loc和l,loc虽然代表了需要插入到队伍的位置,但也可以理解为空位数,即,假如loc=2,则可以理解为必须要有两个或者两个以上空位,否则转向右孩子,但loc值要减掉左孩子的空位值,意思就是左孩子已经提供了这么多空位。
getup(x); //及时将空位情况更新
}
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
build(,,n);
int i,j;
for (i=; i<=n; i++)
{
scanf("%d %d",&pos[i],&v[i]);
}
for (j=n; j>=; j--)
{
query(pos[j]+,j,,,n); //由于题目给的序号是从0开始,建树什么的,我都喜欢从1开始,故这里pos+1.
}
for (i=; i<n; i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n]);
}
return ;
}

POJ 2828 线段树活用的更多相关文章

  1. poj 2828 线段树

    http://poj.org/problem?id=2828 学到的思维: 1.变化的或者后来的优先影响前面的,那么从最后一个往前看,最后一个就成了 确定的, 而且后来的也能够确定----假设从前往后 ...

  2. poj 2828(线段树 逆向思考) 插队是不好的行为

    http://poj.org/problem?id=2828 插队问题,n个人,下面n行每行a,b表示这个人插在第a个人的后面和这个人的编号为b,最后输出队伍的情况 涉及到节点的问题可以用到线段树,这 ...

  3. POJ 2828 线段树(想法)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 15422   Accepted: 7684 Desc ...

  4. poj 2828(线段树单点更新)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 18561   Accepted: 9209 Desc ...

  5. POJ 2828 (线段树 单点更新) Buy Tickets

    倒着插,倒着插,这道题是倒着插! 想一下如果 Posi 里面有若干个0,那么排在最前面的一定是最后一个0. 从后往前看,对于第i个数,就应该插在第Posi + 1个空位上,所以用线段树来维护区间空位的 ...

  6. POJ 2828 线段树 逆序插入

    思路: 1.线段树 逆着插入就OK了 2.块状链表 (可是我并不会写) //By SiriusRen #include <cstdio> #include <cstring> ...

  7. POJ 2828 线段树单点更新 离线搞

    Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...

  8. poj 2886 线段树+反素数

    Who Gets the Most Candies? Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12744   Acc ...

  9. poj 3468(线段树)

    http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...

随机推荐

  1. 009、Java中超过了int的最大值或最小值的结果

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  2. 010.Oracle数据库 , ORDER BY 按升序降序排序

    /*Oracle数据库查询日期在两者之间*/ SELECT DISTINCT ATA FROM LM_FAULT WHERE ( OCCUR_DATE BETWEEN to_date( '2017-0 ...

  3. UVA - 11186 Circum Triangle (几何)

    题意:有N个点,分布于一个圆心在原点的圆的边缘上,问所形成的所有三角形面积之和. 分析: 1.sin的内部实现是泰勒展开式,复杂度较高,所以需预处理. 2.求出每两点的距离以及该边所在弧所对应的圆周角 ...

  4. GNS3 模拟Arp命令1

    R1 : conf t int f0/0 no shutdown ip add 192.168.1.1 255.255.255.0 end R2: conf t int f0/0 no shutdow ...

  5. CSS - flex 垂直水平居中

    display: flex; justify-content: center; /* 水平居中 */ align-items: center; /* 垂直居中 */

  6. 144-PHP trim函数的使用

    <?php //定义多个字符串 $str1='whello12x'; $str2='3462hello'; $str3='xayABCaxy'; $str1=trim($str1,'a..z') ...

  7. WCF 异常 The server was unable to process the request due to an internal error.

    实习用的C#,不搞.NET,但且记下. 只有标题中的错误提示,完全不知道哪里出错,要么是Oracle服务器.要么是服务程序,最不愿代码有问题. <behaviors> <servic ...

  8. opencv+python实时人脸检测、磨皮

    import numpy as np import cv2 cap = cv2.VideoCapture(0) face_cascade = cv2.CascadeClassifier("d ...

  9. 十、React 父组件传来值的类型控制propTypes、父组件如果不传值defaultProps

    父组件给子组件传值时: 1.defaultProps:父子组件传值中,如果父组件调用子组件的时候不给子组件传值,可以在子组件中使用defaultProps定义的默认值: 2.propTypes:验证父 ...

  10. DRF源码-fields.py

    https://www.cnblogs.com/pyspark/p/8607801.html https://www.cnblogs.com/LYliangying/articles/9896548. ...