记录编号 562680 评测结果 AAAAAAAAAA
题目名称 [POJ 2828]排队买票 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 0.125 s
提交时间 2021-07-09 09:38:05 内存使用 1.00 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. using namespace std;
  5. const int maxn = 200005;
  6. int n;
  7. int pos[maxn],val[maxn];
  8. int ans[maxn];
  9. int lowbit(int x) {
  10. return x & -x;
  11. }
  12. int c[maxn];
  13. void build() {
  14. for(int i = 1;i <= 2e5;++ i) {
  15. c[i] = lowbit(i);
  16. }
  17. return ;
  18. }
  19. void update(int x,int k) {
  20. for(;x <= n;x += lowbit(x)) {
  21. c[x] += k;
  22. }
  23. return ;
  24. }
  25. int query(int k,int val) {
  26. int sum = 0,cnt = 0;
  27. for(int p = 1 << 17;p;p >>= 1) {
  28. if(sum + p <= n&&cnt + c[sum + p] <= k) {
  29. sum += p;
  30. cnt += c[sum];
  31. }
  32. }
  33. ans[sum + 1] = val;
  34. return sum + 1;
  35. }
  36. int main() {
  37. freopen("buytickets.in","r",stdin);
  38. freopen("buytickets.out","w",stdout);
  39. while(~ scanf("%d",&n)) {
  40. for(int i = 1;i <= n;++ i) {
  41. scanf("%d%d",&pos[i],&val[i]);
  42. }
  43. build();
  44. for(int i = n;i;-- i) {
  45. int t = query(pos[i] , val[i]);
  46. update(t , -1);
  47. }
  48. for(int i = 1;i <= n;++ i) {
  49. printf("%d ",ans[i]);
  50. }
  51. putchar('\n');
  52. }
  53. fclose(stdin);
  54. fclose(stdout);
  55. return 0;
  56. }