题目:https://www.acwing.com/problem/content/description/262/

题意:给定一个队伍,每个人过来的时候可以插队,每个人会输入一个插入到哪个位置,但是是按顺序的,所以前面的人选的位置有可能会被后面的人插队抢走,然后问最后的排列是多少

思路:仔细想想其实这题就是AcWing 244. 谜一样的牛,因为每个人都会选位置,但是只有最后的人选位置不会被抢走,这个时候我们肯定要从前往后,然后前一个人只用考虑后面的人是否抢了他的位置即可

#include<bits/stdc++.h>
#define maxn 200005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,a[maxn],c[maxn],e[maxn],ans[maxn];
ll lowbit(ll x){
return x&(-x);
}
void add(ll x,ll y){
while(x<=n){
c[x]+=y;
x+=lowbit(x);
}
}
ll query(ll x){
ll sum=;
while(x){
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
int main(){
while(scanf("%lld",&n)!=EOF)
{
memset(c,,sizeof(c));
for(int i=;i<=n;i++){
add(i,);
}
for(int i=;i<=n;i++) scanf("%lld%lld",&a[i],&e[i]);
for(int i=;i<=n;i++) a[i]++;
for(int i=n;i>=;i--){
ll l=,r=n;
while(l<r){
ll mid=(l+r)/;
if(query(mid)>=a[i]){
r=mid;
}
else l=mid+;
}
ans[r]=e[i];
add(r,-);
}
for(int i=;i<=n;i++){
printf("%lld ",ans[i]);
}
printf("\n");
}
}
/*
4
0 77
1 51
1 33
2 69
4
0 20523
1 19243
1 3890
0 31492 77 33 69 51
31492 20523 3890 19243
*/

最新文章

  1. swiper 增加同页面增加2个滚动
  2. Sprint(第三天11.16)
  3. hdu 3433 A Task Process(dp+二分)
  4. sql中的case when语句
  5. 洗礼灵魂,修炼python(3)--从一个简单的print代码揭露编码问题,运行原理和语法习惯
  6. 常用的Java Keytool Keystore命令
  7. Spring Cloud 2-Config 分布式配置中心(七)
  8. jfinal undertow web.xml
  9. 选择排序-C#
  10. windows平台MySQL密码设置与破解
  11. H5 67-清除浮动方式三
  12. 第28月第21天 记事本Unicode 游戏编程中的人工智能技术
  13. Android Studio 减小项目文件夹的大小和.gitignore文件配置
  14. learning ddr mode register MR3
  15. PAT 1080 MOOC期终成绩(25)(STL-map及multiset+思路+测试点分析)
  16. opencv2.4.13.7的resize函数使用(c++)
  17. WebClient类
  18. windows服务与其他进程使用MemoryMappedFile
  19. vs+qt编程相关
  20. [eclipse]Syntax error on tokens, delete these tokens问题解决

热门文章

  1. 测开之路八十五:python处理csv文件
  2. 爬虫中GET方法应用基本模型
  3. #C语言l作业04
  4. JavaScript defineProperties
  5. [暑假集训Day1T1]黑暗城堡
  6. P4843 清理雪道(上下界网络流)
  7. NGUI的sprite的使用(九宫切图)
  8. C#设计模式:单例模式(Singleton)
  9. js 程序执行与顺序实现详解
  10. mpvue 微信小程序半屏弹框(half-screen-dialog)