【HDU】5493 Queue(2015 ACM/ICPC Asia Regional Hefei Online)
2016-07-12 19:10
585 查看
Queue
题目链接
Queue题目大意
有n个高度hi不一样的人在一起排队,打散后每个人只记得在自己前面或者后面有ki个人比自己高。现在告诉你hi和ki,要你还原这个队列。题解
线段树
其实动态维护前缀和然后二分也可以,只是我个人比较喜欢用线段树而已…可以看到个字小的人是不会影响到个字高的人的ki的,所以我们想到从小到大处理,我们处理出每个数最前的位置(因为字典序最小),然后用线段树进行插入,最后输出结果即可。
代码
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define maxn 100005 using namespace std; struct Mine { int h,k; bool operator <(const Mine &x) const { return h<x.h; } }; Mine a[maxn]; struct tree { int l,r,val; }; tree d[maxn<<2]; int T,n,ans[maxn]; void buildtree(int n,int l,int r) { d .l=l; d .r=r; d .val=0; if (l==r) { d .val=1; return ; } int mid=(l+r)>>1; buildtree(n<<1,l,mid); buildtree(n<<1|1,mid+1,r); d .val=d[n<<1].val+d[n<<1|1].val; } void Insert(int n,int num,int val) { if (d .l==d .r) { d .val=0; ans[d .l]=val; return ; } if (num<=d[n<<1].val) Insert(n<<1,num,val); else Insert(n<<1|1,num-d[n<<1].val,val); d .val=d[n<<1].val+d[n<<1|1].val; } int main() { int Case=1; scanf("%d",&T); while (T--) { memset(d,0,sizeof(d)); memset(a,0,sizeof(a)); memset(ans,0,sizeof(ans)); scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d%d",&a[i].h,&a[i].k); buildtree(1,1,n); sort(a+1,a+n+1); bool f=0; for (int i=1;i<=n;i++) { int c=n-i,p; if (a[i].k>c) { f=1; break; } p=min(a[i].k,c-a[i].k); Insert(1,p+1,a[i].h); } printf("Case #%d: ",Case++); if (f) printf("impossible\n"); else { for (int i=1;i<n;i++) printf("%d ",ans[i]); printf("%d\n",ans ); } } return 0; }
相关文章推荐
- MUI上拉加载
- MUI下拉刷新
- MUI Ajax
- MUI utils
- AbstractQueuedSynchronizer(一)——概述
- MUI事件管理
- MUI窗口管理
- IOS Dev Intro - UISwitch
- Fuel 30 分钟快速安装OpenStack
- MUI组价五:开关、底部选项卡、9宫格和分页
- MUI组件四:选择器、滚动条、单选框、区域滚动和轮播组件
- JZOJ.1240. Fibonacci sequence
- 347. Top K Frequent Elements
- easyui datagrid属性和方法
- Longest Ordered Subsequence-POJ2533 <O(nlog(n))算法>
- xUtils的retry error, curr request is null问题
- 关于easyUI分页
- 关于easyUI一些标签的使用
- 关于easyUI
- 关于easyUI的一些js方法