博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Buy Tickets(线段树)
阅读量:5098 次
发布时间:2019-06-13

本文共 1441 字,大约阅读时间需要 4 分钟。

题意:有n个人排队买票,每个人的位置为pos(0~n-1),价值是val,如果位置相同,来的晚的人可以插入他选的位置。最后输出队列中的val。

1 #include 
2 #include
3 const int N=200010; 4 int Tree[N*4],seq[N]; 5 int pos[N],val[N]; 6 7 void build(int l,int r,int rt) 8 { 9 Tree[rt]=r-l+1;//初始每个区间的空位数10 if(l==r)11 return;12 int mid=(l+r)>>1;13 build(l,mid,2*rt);14 build(mid+1,r,2*rt+1);15 }16 void update(int p,int v,int l,int r,int rt)17 {18 Tree[rt]--;//每更新一次空位数-119 if(l==r)20 {21 seq[l]=v;//将value放在l位置中22 return ;23 }24 int mid=(l+r)>>1;25 if(Tree[2*rt] >= p)//左区间的空位数量够26 update(p,v,l,mid,2*rt);//更新左区间27 else //左区间的空位数量不够,则p在右区间28 {29 p-=Tree[2*rt];//减去左区间的空位30 update(p,v,mid+1,r,2*rt+1);//更新右区间31 }32 }33 int main()34 {35 int n;36 while(~scanf("%d",&n))37 {38 build(1,n,1);39 for (int i = 1; i <= n; i++)40 {41 scanf("%d%d",&pos[i],&val[i]);42 pos[i]++;43 }44 for (int i = n; i > 0; i--)//倒着更新,因为来的越晚的人越有利于占据pos位置45 {46 update(pos[i],val[i],1,n,1);47 }48 for (int i = 1; i <= n; i++)49 {50 if (i==1)51 printf("%d",seq[i]);52 else53 printf(" %d",seq[i]);54 }55 puts("");56 }57 return 0;58 }
View Code

 

转载于:https://www.cnblogs.com/lahblogs/p/3554395.html

你可能感兴趣的文章
Ring 0 Inline Hook
查看>>
Linux man C++ 库函数
查看>>
PE结构对照表
查看>>
复杂性渐近阶的重要性
查看>>
js数组创建两种方法
查看>>
IOS自得其乐系列(一)-------------------加载动态图片
查看>>
Function Spec
查看>>
关于我 Jake Lin
查看>>
hue简单介绍
查看>>
现代服务业是什么?
查看>>
java学习笔记十——堆和栈的理解
查看>>
css遮罩蒙版效果 分栏效果
查看>>
rule.xml属性概念
查看>>
JDBC学习笔记
查看>>
css坑了我一下下之line-height
查看>>
python 集合并集
查看>>
CSS样式书写顺序
查看>>
java解决跨域
查看>>
css scroll bug
查看>>
[编织消息框架][JAVA核心技术]动态代理应用8-IRpcReceive实现
查看>>