题目大意:依次描述了一个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 ;
}

最新文章

  1. ubuntu包管理
  2. Linux 问题汇总
  3. 导出Excel之Epplus使用教程4(其他设置)
  4. LintCode &quot;Previous Permutation&quot;
  5. 高性能的EMI滤波器及其小型化设计技术
  6. 关于&lt;ul&gt;&lt;ol&gt;&lt;li&gt;的用法
  7. Application.mk中APP_ABI 的含义
  8. asp 自我定时删除
  9. .htaccess 保护文件夹
  10. iKcamp出品|全网最新|微信小程序|基于最新版1.0开发者工具之初中级培训教程分享
  11. c# 实时监控数据库 SqlDependency
  12. 【代码笔记】Web-CSS-CSS Text(文本)
  13. 关于centerOS下修改网络连接
  14. nginx使用“sudo service nginx start”启动报错解决方案
  15. 【转】ORA-00054 的解决方法
  16. C#SendMessage用法
  17. [温故]图解java多线程设计模式(一)
  18. Shiro Annotation保护实例
  19. linux文件编程----系统调用
  20. Flask之初体验

热门文章

  1. CSS:导航栏下拉菜单模板
  2. 在 Delphi 中使用微软全文翻译的小例子
  3. 剑指offer自学系列(一)
  4. UVA - 10382 Watering Grass(几何)
  5. POJ 3916:Duplicate Removal 将相近的重复元素删除
  6. docker 后台运行和进入后台运行的容器
  7. 找不到xml、找不到类
  8. BZOJ 2744
  9. 在各浏览器和各分辨率下如何让div内的table垂直水平居中?
  10. 留学Essay写作:从入门到精通