[HDU5592] ZYB's Premutation

题目大意:一个由\([1,n]\)组成的数列,但不知道具体排列,但给出每个前缀的逆序对数目,让你还原排列

Solution

创造一颗\([1,n]\)的权值线段树,初始权值都为\(1\),我们从后往前离线处理,每次拿到一个前缀的逆序对数\(p[i]\),说明在\(i\)上的这个数字\(a_i\)前面有\(sum=p[i]-p[i-1]\)个数字比它大,所以\(a_i\)是\(a_1,\cdots ,a_i\)中第\(i -sum\)大的数字,查询后这个\(a_i\)对前面就没有用了,需要在权值线段树上删去

Code

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #define sc(x) scanf("%d", &x)
  6. #define pf(x) printf("%d\n",x)
  7. #define lson cur << 1
  8. #define rson (cur << 1) | 1
  9. const int N = 50005;
  10. int num[N << 2], val[N << 2];
  11. int p[N], ans[N];
  12. int n;
  13. void build(int cur, int l, int r){
  14. num[cur] = r - l + 1;
  15. if(l == r){
  16. val[cur] = l;
  17. return;
  18. }else{
  19. int mid = l + ((r - l) >> 1);
  20. build(lson, l, mid);
  21. build(rson, mid + 1, r);
  22. }
  23. }
  24. int query(int cur, int l, int r, int k){
  25. int mid = l + ((r - l) >> 1);
  26. if(l == r){
  27. // pf(val[cur]);
  28. return val[cur];
  29. }else{
  30. if(num[lson] >= k){
  31. return query(lson, l, mid, k);
  32. }else{
  33. return query(rson, mid + 1, r, k - num[lson]);
  34. }
  35. }
  36. }
  37. void update(int cur, int l, int r, int k){
  38. num[cur]--;
  39. if(l == r){
  40. val[cur] = 0;
  41. return;
  42. }else{
  43. int mid = l + ((r - l) >> 1);
  44. if(k <= mid){
  45. update(lson, l, mid, k);
  46. }else{
  47. update(rson, mid + 1, r, k);
  48. }
  49. }
  50. }
  51. int main(){
  52. int t;
  53. scanf("%d", &t);
  54. while(t--){
  55. scanf("%d", &n);
  56. memset(num, 0, sizeof(num));
  57. memset(val, 0, sizeof(val));
  58. build(1, 1, n + 1);//l和r要和数组对应起来,不能建的时候是n+1,query和update时又变成了n
  59. for(int i = 1, la; i <= n; ++i){
  60. scanf("%d", &p[i]);
  61. }
  62. for(int i = n; i; --i){
  63. ans[i] = query(1, 1, n + 1, i - p[i] + p[i - 1]);
  64. update(1, 1, n + 1, ans[i]);
  65. }
  66. for(int i = 1; i < n; ++i){
  67. printf("%d ", ans[i]);
  68. }
  69. printf("%d\n", ans[n]);
  70. }
  71. return 0;
  72. }

Error

  • \(l\)和\(r\)要和数组对应起来,不能建的时候是\(n+1\),\(query\)和\(update\)时又变成了\(n\)

[HDU5592] ZYB's Premutation的更多相关文章

  1. ACM学习历程—HDU5592 ZYB's Premutation(逆序数 && 树状数组 && 二分)(BestCoder Round #65 1003)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5592 题目大意就是给了每个[1, i]区间逆序对的个数,要求复原原序列. 比赛的时候2B了一发. 首先 ...

  2. ZYB's Premutation(有逆序数输出原序列,线段树)

    ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  3. BestCoder Round #65 (ZYB's Premutation)

    ZYB's Premutation Accepts: 220 Submissions: 983 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...

  4. hdu 5592 ZYB's Premutation (权值线段树)

    最近在线段树的世界里遨游,什么都能用线段树做,这不又一道权值线段树了么. ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  5. HDU 5592——ZYB's Premutation——————【线段树单点更新、单点查询】

    ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  6. 线段树 - ZYB's Premutation

    ZYB has a premutation P,but he only remeber the reverse log of each prefix of the premutation,now he ...

  7. Bestcoder round #65 && hdu 5592 ZYB's Premutation 线段树

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

  8. ZYB's Premutation POJ5592

    Problem Description ZYBZYBZYB has a premutation PPP,but he only remeber the reverse log of each pref ...

  9. HDU 5592 ZYB's Premutation

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5592 题意: http://bestcoder.hdu.edu.cn/contests/contes ...

随机推荐

  1. Linux网络文件下载

    wget 以网络下载 maven 包为例 wget -c http://mirrors.shu.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-ma ...

  2. Vue & Sentry sourcemaps All In One

    Vue & Sentry sourcemaps All In One vue & sentry & sourcemaps https://docs.sentry.io/plat ...

  3. 在线打开,浏览PDF文件的各种方式及各种pdf插件------(MS OneDrive/google drive & google doc/ github ?raw=true)

    在线打开,浏览PDF文件的各种方式: 1 Google drive&doc   (国内不好使,you know GFW=Great Firewall) 1. google drive: 直接分 ...

  4. IE & 自定义滚动条 & scroll

    IE & 自定义滚动条 & scroll 请问这种在 IE 下的自定义滚动条,是如何实现的? https://fairyever.gitee.io/d2-admin-preview/# ...

  5. node --experimental-modules & node.js ES Modules

    node --experimental-modules & node.js ES Modules how to run esm modules in node.js cli $ node -v ...

  6. 如何用 js 实现一个 apply 函数

    如何用 js 实现一个 apply 函数 原理 实现方式 总结 refs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen ...

  7. W3C & 弹幕

    W3C & 弹幕 弹幕用例规范 Draft Community Group Report 21 August 2020 refs https://w3c.github.io/danmaku/u ...

  8. Python Learning Paths

    Python Learning Paths Python Expert Python in Action Syntax Python objects Scalar types Operators St ...

  9. js currying function All In One

    js currying function All In One js 实现 (5).add(3).minus(2) 功能 例: 5 + 3 - 2,结果为 6 https://stackoverflo ...

  10. Flutter 学习路径

    Flutter 学习路径 docs https://flutter.dev/docs https://flutter.dev/community/china https://flutter-io.cn ...