记录编号 |
562680 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[POJ 2828]排队买票 |
最终得分 |
100 |
用户昵称 |
yrtiop |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.125 s |
提交时间 |
2021-07-09 09:38:05 |
内存使用 |
1.00 MiB |
显示代码纯文本
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- const int maxn = 200005;
- int n;
- int pos[maxn],val[maxn];
- int ans[maxn];
- int lowbit(int x) {
- return x & -x;
- }
- int c[maxn];
- void build() {
- for(int i = 1;i <= 2e5;++ i) {
- c[i] = lowbit(i);
- }
- return ;
- }
- void update(int x,int k) {
- for(;x <= n;x += lowbit(x)) {
- c[x] += k;
- }
- return ;
- }
- int query(int k,int val) {
- int sum = 0,cnt = 0;
- for(int p = 1 << 17;p;p >>= 1) {
- if(sum + p <= n&&cnt + c[sum + p] <= k) {
- sum += p;
- cnt += c[sum];
- }
- }
- ans[sum + 1] = val;
- return sum + 1;
- }
- int main() {
- freopen("buytickets.in","r",stdin);
- freopen("buytickets.out","w",stdout);
- while(~ scanf("%d",&n)) {
- for(int i = 1;i <= n;++ i) {
- scanf("%d%d",&pos[i],&val[i]);
- }
- build();
- for(int i = n;i;-- i) {
- int t = query(pos[i] , val[i]);
- update(t , -1);
- }
- for(int i = 1;i <= n;++ i) {
- printf("%d ",ans[i]);
- }
- putchar('\n');
- }
- fclose(stdin);
- fclose(stdout);
- return 0;
- }