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