POJ 2828 Buy Tickets(线段树单点)
https://vjudge.net/problem/POJ-2828
题目意思:有n个数,进行n次操作,每次操作有两个数pos, ans。pos的意思是把ans放到第pos 位置的后面,pos后面的数就往后推一位。最后输出每个位置的ans。
思路:根据题 目可知,最后插入的位置的数才是最终不变的数,所以可以从最后的输入作第1个放入,依此类推,倒插入。在插入时也有一定的技术,首先创建一棵空线段树时,每个节点记录当前范围内有多少个空位置。在插入时,要注意,一个数放入之后那么这个位置就不用管了,那么树中所有的空位置就是余下的数所对应的位置,也就是把余下的数又可以看作是一个新的集合。那么每次插入都是当前集合的第1次放。
- 1 #include <iostream>
- 2 #include <algorithm>
- 3 #include <string>
- 4 #include <sstream>
- 5 #include <set>
- 6 #include <vector>
- 7 #include <stack>
- 8 #include <map>
- 9 #include <queue>
- 10 #include <deque>
- 11 #include <cstdlib>
- 12 #include <cstdio>
- 13 #include <cstring>
- 14 #include <cmath>
- 15 #include <ctime>
- 16 #include <functional>
- 17 // #include <bits/stdc++.h>
- 18 using namespace std;
- 19
- 20 int n,ans[1000000];
- 21
- 22 struct node
- 23 {
- 24 int n,val;
- 25 }a[1000000];
- 26
- 27 struct tree
- 28 {
- 29 int l,r,n;
- 30 }b[1000000];
- 31
- 32 void init()
- 33 {
- 34 int i,j,k;
- 35 for(k=1;k<n;k<<=1);
- 36 for(i=k;i<2*k;i++)
- 37 {
- 38 b[i].l=b[i].r=i-k+1;
- 39 b[i].n=1;//每个叶子节点只能放入一个人
- 40 }
- 41 for(i=k-1;i>0;i--)
- 42 {
- 43 b[i].l=b[2*i].l;
- 44 b[i].r=b[2*i+1].r;
- 45 b[i].n=b[2*i].n+b[2*i+1].n;//每个区间是其左右子树所能放入的人数总和
- 46 }
- 47 }
- 48
- 49 void insert(int i,int x,int m)
- 50 {
- 51 if(b[i].l==b[i].r)//找到叶子节点,这个节点存放该人,并且叶子节点能放入的人数清0
- 52 {
- 53 ans[b[i].l]=m;
- 54 b[i].n=0;
- 55 return;
- 56 }
- 57 if(x<=b[2*i].n)//其插入的位置若能放入左子树(还能放人),往左子树放人,否则走右子树
- 58 insert(2*i,x,m);
- 59 else
- 60 insert(2*i+1,x-b[2*i].n,m);
- 61 b[i].n--;
- 62 }
- 63
- 64 int main()
- 65 {
- 66 int i,j;
- 67 while(scanf("%d",&n)!=EOF)
- 68 {
- 69 for(i=1;i<=n;i++)
- 70 scanf("%d%d",&a[i].n,&a[i].val);
- 71 init();
- 72 for(i=n;i>0;i--)//逆推
- 73 {
- 74 insert(1,a[i].n+1,a[i].val);
- 75 }
- 76 cout<<ans[1];
- 77 for(i=2;i<=n;i++)
- 78 cout<<" "<<ans[i];
- 79 cout<<endl;
- 80 }
- 81 return 0;
- 82 }
POJ 2828 Buy Tickets(线段树单点)的更多相关文章
- poj 2828 Buy Tickets (线段树(排队插入后输出序列))
http://poj.org/problem?id=2828 Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissio ...
- POJ 2828 Buy Tickets (线段树 or 树状数组+二分)
题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...
- POJ 2828 Buy Tickets 线段树 倒序插入 节点空位预留(思路巧妙)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19725 Accepted: 9756 Desc ...
- POJ 2828 Buy Tickets | 线段树的喵用
题意: 给你n次插队操作,每次两个数,pos,w,意为在pos后插入一个权值为w的数; 最后输出1~n的权值 题解: 首先可以发现,最后一次插入的位置是准确的位置 所以这个就变成了若干个子问题, 所以 ...
- POJ 2828 Buy Tickets(线段树·插队)
题意 n个人排队 每一个人都有个属性值 依次输入n个pos[i] val[i] 表示第i个人直接插到当前第pos[i]个人后面 他的属性值为val[i] 要求最后依次输出队中各个人的属性 ...
- poj 2828 Buy Tickets (线段树)
题目:http://poj.org/problem?id=2828 题意:有n个人插队,给定插队的先后顺序和插在哪个位置还有每个人的val,求插队结束后队伍各位置的val. 线段树里比较简单的题目了, ...
- POJ - 2828 Buy Tickets (段树单点更新)
Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...
- poj-----(2828)Buy Tickets(线段树单点更新)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 12930 Accepted: 6412 Desc ...
- 线段树(单点更新) POJ 2828 Buy tickets
题目传送门 /* 结点存储下面有几个空位 每次从根结点往下找找到该插入的位置, 同时更新每个节点的值 */ #include <cstdio> #define lson l, m, rt ...
随机推荐
- 《高性能利器》-32张图带你解决RocketMQ所有场景问题
一.RocketMQ的基本原理 RocketMQ基本架构图如下 从这个架构图上我们可以知道,RocketMQ有4块核心部分: NameServer:管理Broker的信息,让使用MQ的系统感知到集群里 ...
- 解决vscode+python不提示numpy函数的问题
前言 使用vscode编写numpy代码时,对于numpy.array()等方法总是无法提示.查找了很多博客后,大部分都是修改配置和安装多种vscode插件,经过尝试后方法对于我来说无效.最后在调试p ...
- go配置私有仓库 (go mod配置私有仓库)
windows 配置go私有仓库 一.环境 1.私有gitlab (gitlab.xxx.com) 2.go 1.16.3 3.win10系统, 家目录:C:\Users\Administrator, ...
- MySQL记录之间是单向链表还是双向链表?
前言 本文的观点是基于MySQL使用Innodb存储引擎的情况下进行的! 很多渠道说:MySQL数据按照主键大小依次排列,记录之间是双向链表连起来.如果说我告诉你这种说法很大程度上是错的,你肯定说我在 ...
- Pytest+Allure 示例
0. 前言 简介 Allure 框架是一个灵活的.轻量级的.支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有 ...
- maven打包war,导入本地jar包
方法1: 一 . 在项目根目录创建lib文件夹,把jar放入lib文件夹中 二 . 在项目中使用本地jar pom文件配置如下: <properties> <project.buil ...
- C#比较两个对象是否为同一个对象。 Visual Studio调试器指南---多线程应用程序调试(一)
两个对象是否为同一个对象:是看两个对象是否指向堆中的同一块内存. 1.使用object.ReferenceEquals() class Program { static void Main(strin ...
- 安全|常见的Web攻击手段之CSRF攻击
对于常规的Web攻击手段,如XSS.CRSF.SQL注入.(常规的不包括文件上传漏洞.DDoS攻击)等,防范措施相对来说比较容易,对症下药即可,比如XSS的防范需要转义掉输入的尖括号,防止CRSF攻击 ...
- linux下静态库的制作
在我们编写软件的过程当中,少不了需要使用别人的库函数.因为大家知道,软件是一个协作的工程.作为个人来讲,你不可能一个人完成所有的工作.另外,网络上一些优秀的开源库已经被业内广泛接受,我们也没有必要把 ...
- 07.SpringMVC之静态资源
如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截"/",拦截了所有的请求,同时对 ...