博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2828 Buy Tickets 【线段树点更新】
阅读量:6823 次
发布时间:2019-06-26

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

题目:

题意:有n个人排队,每一个人有一个价值和要插的位置,然后当要插的位置上有人时全部的人向后移动一位当这个插入到这儿,假设没有直接插进去。

分析:分析发现直接插入移动的话花时间太多。我们可不能够用逆向思维。

从后往前来。由于最后一个位置是肯定能确定的,而其它的则插入空的第某个位置。

比方第一组例子:

40 771 511 332 69

開始时候位置都为空 编号0 1 2 3

首先从最后一个来2 69

第二个位置空,则能够直接放

然后编号变为0 1 69 2

接着放1 33

编号变为 0 33 69 1

然后放1 51

编号变为0 33 69 51

然后放最后一个0 77

则最后结果为 77 33 69 51

能够发现该怎么搞了。就是直接用线段树来维护区间上的值。然后选择插入对应的位置就可以。

AC代码:

#include 
#include
#include
using namespace std;typedef long long LL ;const int N = 220000;struct Node{ int l,r; int val,num;};Node tree[5*N];void build(int o,int l,int r){ tree[o].l = l,tree[o].r = r; if(l==r) { tree[o].val = 1; return ; } int mid = (l+r)/2; build(o+o,l,mid); build(o+o+1,mid+1,r); tree[o].val = tree[o+o].val + tree[o+o+1].val;}void update(int o,int num,int val){ //printf("%d %d %d %d\n",o,tree[o].l,tree[o].r,tree[o].val); if(tree[o].l==tree[o].r) { tree[o].num = val; tree[o].val = 0; return ; } if(tree[o+o].val>=num) update(o+o,num,val); else update(o+o+1,num-tree[o+o].val,val); tree[o].val = tree[o+o].val + tree[o+o+1].val;}vector
ans;void Yougth(int o){ if(tree[o].l==tree[o].r) { ans.push_back(tree[o].num); return ; } Yougth(o+o); Yougth(o+o+1);}pair
p[N];int main(){ //freopen("Input.txt","r",stdin); int n; while(~scanf("%d",&n)) { build(1,1,n); for(int i=0;i
=0;i--) update(1,p[i].first,p[i].second); Yougth(1); for(int i=0;i

转载地址:http://jarzl.baihongyu.com/

你可能感兴趣的文章
C# 集合已修改;可能无法执行枚举操作
查看>>
FSM Code Generator
查看>>
JDBC学习笔记——事务、存储过程以及批量处理
查看>>
JVM内存结构
查看>>
Java 锁
查看>>
7、索引在什么情况下遵循最左前缀的规则?
查看>>
c#中委托与事件
查看>>
mysql数据库备份之主从同步配置
查看>>
angularJs(1)指令篇
查看>>
自定义Xadmin
查看>>
jsp页面表单的遍历要怎么写
查看>>
循环引用,看我就对了
查看>>
软件工程——第一周作业
查看>>
ubuntu14.04安装vmware workstation
查看>>
ArcGIS API for Silverlight部署本地地图服务
查看>>
小知识点
查看>>
python mongodb MapReduce
查看>>
python-数据类型
查看>>
Google MapReduce/GFS/BigTable三大技术的论文中译版
查看>>
Linux atop监控工具部署
查看>>