http://poj.org/problem?id=2828

插队问题,n个人,下面n行每行a,b表示这个人插在第a个人的后面和这个人的编号为b,最后输出队伍的情况

涉及到节点的问题可以用到线段树,这里因为每个人插队时有顺序的,如果按照正着的顺序来情况太复杂,所以可以试试倒过来,从最后一个人开始,此时找到的位置

一定是最终位置,这样就很简单了,   结构体中多开一个mark表示每个区间的空位置,多开一个sum表示人的编号

这道题不错,提醒我们有时候换一换思路,逆向思考一下

 #include<cstdio>
using namespace std;
struct point {
int l,r;
int sum,mark;
};
point tree[*];
int a[],b[];
void build(int i,int left,int right)
{
tree[i].l=left,tree[i].r=right;
tree[i].mark=(tree[i].r-tree[i].l)+;
tree[i].sum=;
if (right==left) return;
int mid=(left+right)/;
build(i*,left,mid);
build(i*+,mid+,right);
}
void update(int i,int pos,int val)
{
if (tree[i].l==tree[i].r)
{
tree[i].sum=val;
tree[i].mark--;
return ;
}
if (pos<=tree[i*].mark)
update(i*,pos,val);
else
update(i*+,pos-tree[i*].mark,val);
tree[i].mark=tree[i*].mark+tree[i*+].mark; //更新区间的空位
}
void check(int i)
{
if (tree[i].l==tree[i].r)
{
printf("%d ",tree[i].sum);
return ;
}
check(i*);
check(i*+);
}
int main()
{
int n,i;
while (~scanf("%d",&n))
{
for (i=;i<=n;i++)
scanf("%d %d",&a[i],&b[i]);
build(,,n);
for (i=n;i>;i--)
update(,a[i]+,b[i]);
check();
printf("\n");
}
return ;
}

最新文章

  1. 解决服务器SID引起虚拟机不能加入AD域用户,无法远程登录的问题
  2. 通过goto语句学习if...else、switch语句并简单优化
  3. 给Source Insight做个外挂系列之六--“TabSiPlus”的其它问题
  4. CentOS 7 系统的初始划配置
  5. C# - MVC
  6. php向队列服务里插入一条insert sql例如
  7. Mybatis 的日志管理
  8. jmeter if 控制器
  9. (一) 从零开始搭建Spark Standalone集群环境搭建
  10. Android的有关EditText的能多行显示但无法禁止自动换行的Bug!
  11. 利用SpringMVC参数绑定实现动态插入数据
  12. [转] git修改author
  13. Linux文件的查找
  14. OPENCV基本滤波算法
  15. Maven就是这么简单
  16. go语言调度器源代码情景分析之五:汇编指令
  17. call, apply 和 bind 方法
  18. C++实现多级排序
  19. 第一周CTF (合天CTF)
  20. win7升级IE11后F12无法正常操作

热门文章

  1. C# windows服务:通过cmd命令安装、卸载、启动和停止Windows Service(InstallUtil.exe)
  2. http://wenku.baidu.com/view/26afdb8371fe910ef12df8ccRevit采用DWG和FBX两种格式导入3D max方法的总结
  3. 如何用java完成一个中文词频统计程序
  4. 函数练习以及 if else 三元运算
  5. ETL工具总结
  6. 文字在线转图片二维码的公用API接口
  7. php优化-》常用到的部分优化
  8. depth: working copy\infinity\immediates\files\empty
  9. CRM某些表加入审计
  10. 分布式监控系统Zabbix-3.0.3-完整安装记录