博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-2828-Buy Tickets
阅读量:6305 次
发布时间:2019-06-22

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

链接:https://vjudge.net/problem/POJ-2828#author=0

题意:

有N个人排队,每一个人都有一个val来对应,每一个后来人都会插入当前队伍的某一个位置pos。要求把队伍最后的状态输出。

思路:

刚开始想不到线段树,看了题解之后还是有点懵。

就是线段树的单点更新。

代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const int MAXN = 2e5 + 10;int segment[MAXN*4];int a[MAXN], b[MAXN];int res[MAXN];void Push_up(int root){ segment[root] = segment[root<<1] + segment[root<<1|1];}void Build(int root, int l, int r){ if (l == r) { segment[root] = 1; return; } int mid = (l+r)/2; Build(root<<1, l, mid); Build(root<<1|1, mid+1, r); Push_up(root);}void Update(int root, int l, int r, int pos, int val){ if (l == r) { res[l] = val; segment[root] = 0; return; } int mid = (l+r)/2; if (segment[root<<1] >= pos) Update(root<<1, l, mid, pos, val); else Update(root<<1|1, mid+1, r, pos-segment[root<<1], val); Push_up(root);}int main(){ int n; while (~scanf("%d", &n)) { Build(1, 1, n); for (int i = 1;i <= n;i++) scanf("%d%d", &a[i], &b[i]); for (int i = n;i >= 1;i--) Update(1, 1, n, a[i]+1, b[i]); for (int i = 1;i <= n;i++) cout << res[i] << ' ' ; cout << endl; } return 0;}

 

转载于:https://www.cnblogs.com/YDDDD/p/10676528.html

你可能感兴趣的文章
[asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文
查看>>
微软注册dll在dotnet开发时起到缓存的作用
查看>>
Oracle 数据乱码
查看>>
[转] 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2出现0x80072f8a未指定的错误
查看>>
国家电力项目SSH搭建
查看>>
递归的实现
查看>>
BurpSuite中的安全测试插件推荐
查看>>
Spring Boot 集成MyBatis
查看>>
linux中chmod与chown两个命令详解
查看>>
查看Ubuntu是32位还是64位
查看>>
QT和MFC的差别
查看>>
Some Sites About .Net
查看>>
ADB Server Didn’t ACK ,failed to Start Daemon 解决方法
查看>>
linux下cacti一键自动安装脚本(适用于centos、redhat)-【原创】
查看>>
Delphi Menu Designer(菜单设计器)之一
查看>>
[zz]zeroMQ安装
查看>>
巧用 /etc/rc.local,开机时完成一些自动任务 - GNU/Linux,Windows的終結者 - KM大宝 - 和讯博客...
查看>>
BZOJ 2301: [HAOI2011]Problem b (莫比乌斯反演)
查看>>
Less is better than never
查看>>
ubuntu 经常使用软件及环境
查看>>