poj 2828(线段树 逆向思考) 插队是不好的行为
http://poj.org/problem?id=2828
插队问题,n个人,下面n行每行a,b表示这个人插在第a个人的后面和这个人的编号为b,最后输出队伍的情况
涉及到节点的问题可以用到线段树,这里因为每个人插队时有顺序的,如果按照正着的顺序来情况太复杂,所以可以试试倒过来,从最后一个人开始,此时找到的位置
一定是最终位置,这样就很简单了, 结构体中多开一个mark表示每个区间的空位置,多开一个sum表示人的编号
这道题不错,提醒我们有时候换一换思路,逆向思考一下
- #include<cstdio>
- using namespace std;
- struct point {
- int l,r;
- int sum,mark;
- };
- point tree[*];
- int a[],b[];
- void build(int i,int left,int right)
- {
- tree[i].l=left,tree[i].r=right;
- tree[i].mark=(tree[i].r-tree[i].l)+;
- tree[i].sum=;
- if (right==left) return;
- int mid=(left+right)/;
- build(i*,left,mid);
- build(i*+,mid+,right);
- }
- void update(int i,int pos,int val)
- {
- if (tree[i].l==tree[i].r)
- {
- tree[i].sum=val;
- tree[i].mark--;
- return ;
- }
- if (pos<=tree[i*].mark)
- update(i*,pos,val);
- else
- update(i*+,pos-tree[i*].mark,val);
- tree[i].mark=tree[i*].mark+tree[i*+].mark; //更新区间的空位
- }
- void check(int i)
- {
- if (tree[i].l==tree[i].r)
- {
- printf("%d ",tree[i].sum);
- return ;
- }
- check(i*);
- check(i*+);
- }
- int main()
- {
- int n,i;
- while (~scanf("%d",&n))
- {
- for (i=;i<=n;i++)
- scanf("%d %d",&a[i],&b[i]);
- build(,,n);
- for (i=n;i>;i--)
- update(,a[i]+,b[i]);
- check();
- printf("\n");
- }
- return ;
- }
poj 2828(线段树 逆向思考) 插队是不好的行为的更多相关文章
- poj 2828 线段树
http://poj.org/problem?id=2828 学到的思维: 1.变化的或者后来的优先影响前面的,那么从最后一个往前看,最后一个就成了 确定的, 而且后来的也能够确定----假设从前往后 ...
- poj 2828(线段树单点更新)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 18561 Accepted: 9209 Desc ...
- POJ 2828 线段树(想法)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 15422 Accepted: 7684 Desc ...
- POJ 2828 线段树活用
题目大意:依次描述了一个N个人的队伍,每个人所站的序号以及他的价值,依次描述每个人的过程中,存在序号相同的人,表示该人插入到了前一个序号相同的人的前面.最后输出整个队伍的值排列情况. 这个题目确实难以 ...
- POJ 2828 (线段树 单点更新) Buy Tickets
倒着插,倒着插,这道题是倒着插! 想一下如果 Posi 里面有若干个0,那么排在最前面的一定是最后一个0. 从后往前看,对于第i个数,就应该插在第Posi + 1个空位上,所以用线段树来维护区间空位的 ...
- POJ 2828 线段树 逆序插入
思路: 1.线段树 逆着插入就OK了 2.块状链表 (可是我并不会写) //By SiriusRen #include <cstdio> #include <cstring> ...
- POJ 2828 线段树单点更新 离线搞
Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...
- poj 2886 线段树+反素数
Who Gets the Most Candies? Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12744 Acc ...
- poj 2886 (线段树+反素数打表) Who Gets the Most Candies?
http://poj.org/problem?id=2886 一群孩子从编号1到n按顺时针的方向围成一个圆,每个孩子手中卡片上有一个数字,首先是编号为k的孩子出去,如果他手上的数字m是正数,那么从他左 ...
随机推荐
- 初探 objc_msgSend函数
1.0 执行某个对象的方法 [receiver message] 被编译为: id objc_msgSend(id self,SEL op,...): objc_msgSend 发送信息的过程 ...
- Ubuntu Spark 环境搭建(转)
在安装Spark之前,我们需要在自己的系统当中先安装上jdk和scala 可以去相应的官网上下载: JDK:http://www.oracle.com/technetwork/java/javase/ ...
- js高级-原型链
JavaScript是基于原型的面向对象的语言(相当于一个基类,父类),而不是像Java通过类模板构造实例,通过原型实现属性函数的复用 函数都有 prototype属性 指向函数的原型对象 只有函数根 ...
- php yii 命令
php yii 敲回车 This is Yii version 2.0.11. The following commands are available: - asset Allows you to ...
- c 中的单引号和双引号的使用
1. 在c中,'A' 表示的是一个 character constant ,表示的是字符集的数值:而 "A" 表示的是一个字符串常量,代表的是指向字符串的指针.
- PowerDesigner导入sql脚本生成物理模型
https://www.cnblogs.com/zsswpb/p/5771623.html
- svn 更新lib库时,报错
svn: E195012: Unable to find repository location for svn:// in revision 9718 Can't revert without re ...
- 项目没有build path问题(转)
感谢作者分享:https://blog.csdn.net/u012572815/article/details/76353018 问题1.通过eclipse的svn资源库添加的项目,显示的方式和直接创 ...
- pandas的日常笔记--查询
- tomcat指向外部项目
参考 https://www.cnblogs.com/ysocean/p/6893446.html conf/server.xml中增加 <Context path="/myweb&q ...