题意:插队问题;

2016.5.20,复习这道题。

总结:线段树基础不牢,建树,更新尚不熟悉,注意加强理解记忆。

主要理解:(单点更新,逆序插入)

发生插队时,前面的队伍是连续没有空位的,即pos:2,1,这种情况不会出现,至少应该为pos:1,2,1

插入顺序是逆序的(最后插入的val的位置不会再发生变化),如果正序插入则每个val的顺序是动态的。

插入pos,那么在pos这个位置之前应该还有pos-1个空位。

访问右节点的时候注意pos要修改,改为pos-sum[rt],即整个线段的第pos个空位,在下一个右儿子那的第pos-sum[rt]个空位。

void Insert(int pos,int val,int l,int r,int rt)
{
if(l==r)
{
spare[rt]=0;
seq[l]=val;
return;
}
int mid=(r+l)>>1;
if(pos<=spare[rt<<1])
Insert(pos,val,l,mid,rt<<1);
else
Insert(pos-spare[rt<<1],val,mid+1,r,rt<<1|1);
PushUp(rt);
}

代码:

#include<iostream>
#include<cstdio>
using namespace std; #define N 200005 int spare[N<<2];
int seq[N]; void PushUp(int rt)
{
spare[rt]=spare[rt<<1]+spare[rt<<1|1];
} void build(int l,int r,int rt)
{
if(l==r)
{
spare[rt]=1;
return;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
PushUp(rt);
} void Insert(int pos,int val,int l,int r,int rt)
{
if(l==r)
{
spare[rt]=0;
seq[l]=val;
return;
}
int mid=(r+l)>>1;
if(pos<=spare[rt<<1])
Insert(pos,val,l,mid,rt<<1);
else
Insert(pos-spare[rt<<1],val,mid+1,r,rt<<1|1);
PushUp(rt);
} int main()
{
int n,p[N],v[N];
while(scanf("%d",&n)!=EOF)
{
build(1,n,1);
int i;
for(i=1;i<=n;i++)
{
scanf("%d%d",&p[i],&v[i]);
p[i]++;
}
for(i=n;i>0;i--)
{
Insert(p[i],v[i],1,n,1);
}
for(i=1;i<=n;i++)
{
if(i!=n)
printf("%d ",seq[i]);
else
printf("%d\n",seq[i]);
}
     /*for(i=1;i<=n;i++)         //如果这样输出就会超时,线段树容易超时
{
       printf("%d",seq[i]);
if(i!=n)
printf(" ");
else
printf("\n");
}*/
} return 0; }

  

最新文章

  1. Django models对象的select_related方法(减少查询次数)
  2. ADB
  3. C# DataTable中根据某Column值(不重复)获取该值所在行
  4. lua 操作中文字符串之截取和长度竖排显示
  5. mysql查询结果导出到文件
  6. MVC的用法和作用
  7. 问题解决——OpenGL超级宝典 第四章 4.5.2 关于freeglut.lib问题的解决过程
  8. 解决Unable to reach a settlement: [diffie-hellman-group1-sha1, diffie-hellman-group-exchange-sha1] and [curve25519-sha256@li
  9. vijosP1159 岳麓山上打水
  10. Java反射机制剖析(一)-定义和API
  11. win7 VMware CentOS桥接(bridge)模式网络配置
  12. JavaScript变量转换
  13. JVM内存模型你只要看这一篇就够了
  14. Space Ant
  15. C# 简述Action与function
  16. 获取可用的处理器(CPU)核数【转】
  17. java Web的MVC最基础暂定分层包
  18. hive表增量抽取到oracle数据库的通用程序(二)
  19. spring定时任务注解@Scheduled的记录
  20. mac 安装配置使用nexus3.x

热门文章

  1. ubuntu下vi的使用
  2. Cracking the Coding Interview 150题(二)
  3. Mariadb 索引及外键
  4. Python开发【第5节】【函数基础】
  5. Matplotlib作图基础
  6. 【bzoj1303】[CQOI2009]中位数图
  7. 蓝书4.1-4.4 树状数组、RMQ问题、线段树、倍增求LCA
  8. ZOJ 3955 Saddle Point 校赛 一道计数题
  9. 洛谷P1850 [noip2016]换教室——期望DP
  10. bzoj3670 [Noi2014]动物园——KMP