POJ 2828(线段树点修改 思维)
来源:互联网 发布:微商拍小视频软件 编辑:程序博客网 时间:2024/05/29 15:39
POJ 2828
题目大意
一个队列,一开始为空,有n个人按顺序去插队,每个人用一对形如
分析
一开始想到了从后往前考虑,比如最后一个人是一定能确定座位的,再看倒数第二个他的插入位置之和他后面有多少个人会插入到他前面有关(包括他所要插入的位置),但是我们并不能直接的知道他后面的人有多少个插到他前面,在我们逆序遍历的过程中,我们是逐个确定每一个人的位置的,假设第i个人后面的都确定好了之后,对于第i个人,他前面有x个人已经插入了,那么我们应该将i的位置再向后推移x个,但直接出现了一个问题,在推移的过程中还可能遇到已经插入的人,那就还需要再往后推移,然后就卡在了这个地方。看了题解之后发现其实我们可以换个角度看这个问题,我们不从他前面有多少个人考虑,而从他前面有多少个空位考虑他后面的人的位置是已经确定了的,那么将这些人去掉之后第i个人的座位就应该是他一开始应该插入的位置,那么将他插入到第pos[i]个空位的位置就行了,这样就避免了从人考虑的过程中人数在动态变换的麻烦。
总结
通过对一些边界情况或简单情况的考虑我们或许能够发现一些规律从而归纳出解决题目的方法。
从多个角度去看一个问题
代码
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<queue>#include<map>#include<algorithm>#include<set>#include<stack>using namespace std;const int MAXN=200005;int pos[MAXN],val[MAXN];//pos[i]表示第i个人要插到pos[i]的后面去int n;int ans[MAXN];//保存最后每个座位上的值是多少int blank[MAXN*4];void Init(){ memset(blank,0,sizeof(blank));}void Pushup(int rt)//节点rt一下的信息已经维护,现在将信息上传{ blank[rt]=blank[rt*2]+blank[rt*2+1];}void Build(int l,int r,int rt){ if(l==r){blank[rt]=1;return ;} int m=(l+r)/2; Build(l,m,rt*2); Build(m+1,r,rt*2+1); Pushup(rt);}void Update(int x,int val,int l,int r,int rt)//在线段l到r的第x个空穴插入val{ if(l==r){ans[l]=val;blank[rt]=0;return ;} int m=(l+r)/2; if(x<=blank[rt*2])Update(x,val,l,m,rt*2); else Update(x-blank[rt*2],val,m+1,r,rt*2+1); Pushup(rt);}void Print(){ for(int i=1;i<=n;i++) { cout<<ans[i]<<" "; } cout<<endl;}void Work(){ Init(); int loc; Build(1,n,1); for(int i=n;i>=1;i--) { loc=pos[i]+1; Update(loc,val[i],1,n,1); } Print();}int main(){ while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d%d",&pos[i],&val[i]); } Work(); } return 0;}
0 0
- POJ 2828(线段树点修改 思维)
- POJ 2828Buy Tickets 线段树 + 思维
- POJ 2155 二维线段树 修改区间查询点
- POJ 2828(线段树,思维,逆序数变形题)
- hdu2795线段树点修改
- 线段树点修改uva12299
- 线段树点修改hdu1166
- 线段树点修改hdu2795
- POJ 3264 Balanced Lineup(线段树点修改 查询最大最小总和 修改 增加/模板)
- 线段树模板:点修改,区间修改
- poj 2828 Buy Tickets 【线段树点更新】
- POJ 2828 Buy Tickets线段树+点更新+小技巧
- 线段树-点修改-hdoj-1754
- 线段树(1):点修改
- RMQ with Shifts 线段树+点修改
- Permutation +uva+线段树+点修改
- hdu1166敌兵布阵(线段树点修改)
- hdu_2642 Stars 线段树+点修改
- git命令之git remote的用法详解
- 定期翻译 国外开源库,技术文章的网站
- E/C
- [HPU] 机房的位置(三)[二分图最大匹配][匈牙利算法]
- Java程序运行过程
- POJ 2828(线段树点修改 思维)
- Java与js中的多态
- Python:Non-ASCII character
- “推恩令”——分治法
- UnityEditor<三>自定义窗口 案例1
- 无序容器unorder_map使用自定义类型
- 四旋翼之路——前篇
- Android中必须学习的八大开源项目
- MFC_快速使用01