• poj 2182 Lost Cows


    题目链接如下:

    2182 -- Lost Cows

    假设输入的所有排名是pre[i],其中pre[0]=0,那么我们每次倒过来取第pre[i]+1个数字就可以了。

    目录

    1.暴力解决

    2.普通二叉树实现线段树

    3.完全二叉树实现线段树


    1.暴力解决

    就和分析的一样,我们每次只要选出剩下的数组里边特定位置的数字就可以了。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. using namespace std;
    13. #define MAXN 20001
    14. int n;
    15. int pre[MAXN], ans[MAXN];
    16. int num[MAXN];
    17. int main(){
    18. scanf("%d",&n);
    19. pre[1]=0;
    20. for (int i = 2; i <= n; ++i) {
    21. scanf("%d",&pre[i]);
    22. }
    23. for (int i = 1; i <= n; ++i) {
    24. num[i]=i;
    25. }
    26. int k;
    27. for (int i = n; i > 0; --i) {
    28. k=0;
    29. for (int j = 1; j <= n; ++j) {
    30. if (num[j]!=-1){
    31. ++k;
    32. if (k==pre[i]+1){
    33. ans[i]=j;
    34. num[j]=-1;
    35. break;
    36. }
    37. }
    38. }
    39. }
    40. for (int i = 1; i <= n; ++i) {
    41. printf("%d\n",ans[i]);
    42. }
    43. return 0;
    44. }

    2.普通二叉树实现线段树

    用一颗树来维护区间,每个叶子节点代表的是某个数,那么我们相当于每次查找都维护这颗树就行了,并且还只要维护区间中点的个数就可以。

    代码如下所示:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. using namespace std;
    13. #define MAXN 20001
    14. struct {
    15. int l,r,len;
    16. }tree[MAXN];
    17. int n;
    18. int pre[MAXN], ans[MAXN];
    19. void build_tree(int l,int r,int rt){
    20. tree[rt].l=l;
    21. tree[rt].r=r;
    22. tree[rt].len=r-l+1;
    23. if (l
    24. build_tree(l,(l+r)/2,rt<<1);
    25. build_tree((l+r)/2+1,r,rt<<1|1);
    26. }
    27. }
    28. int query(int num,int rt){
    29. tree[rt].len--;
    30. if (tree[rt].l==tree[rt].r){
    31. return tree[rt].l;
    32. }
    33. if (tree[rt<<1].len>=num){
    34. return query(num,rt<<1);
    35. } else{
    36. return query(num-tree[rt<<1].len,rt<<1|1);
    37. }
    38. }
    39. int main(){
    40. scanf("%d",&n);
    41. build_tree(1,n,1);
    42. pre[1]=0;
    43. for (int i = 2; i <= n; ++i) {
    44. scanf("%d",&pre[i]);
    45. // cout<
    46. }
    47. for (int i = n; i >= 1; --i) {
    48. ans[i]=query(pre[i]+1,1);
    49. }
    50. for (int i = 1; i <= n; ++i) {
    51. printf("%d\n",ans[i]);
    52. }
    53. return 0;
    54. }

    3.完全二叉树实现线段树

    这里用tree记录区间内剩下数字的数量,建立一颗完全二叉树。

    代码如下所示:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. using namespace std;
    14. #define MAXN 20001
    15. int n;
    16. int pre[MAXN], ans[MAXN];
    17. int tree[4*MAXN];
    18. void build_tree(int last_left,int n){
    19. for (int i = last_left; i < last_left+n; ++i) {
    20. tree[i]=1;
    21. }
    22. while (last_left!=1){
    23. for (int i = last_left/2; i < last_left; ++i) {
    24. tree[i]=tree[i<<1]+tree[i<<1|1];
    25. }
    26. last_left/=2;
    27. }
    28. }
    29. int query(int num,int rt,int last_left){
    30. tree[rt]--;
    31. if (tree[rt]==0 && rt>=last_left){
    32. return rt;
    33. }
    34. if (tree[rt<<1]>=num){
    35. return query(num,rt<<1,last_left);
    36. } else{
    37. return query(num-tree[rt<<1],rt<<1|1,last_left);
    38. }
    39. }
    40. int main(){
    41. scanf("%d",&n);
    42. int last_left=1<<((int)(log((double)n)/ log(2.0))+1);
    43. build_tree(last_left,n);
    44. pre[1]=0;
    45. for (int i = 2; i <= n; ++i) {
    46. scanf("%d",&pre[i]);
    47. }
    48. for (int i = n; i > 0; --i) {
    49. ans[i]=query(pre[i]+1,1,last_left)-last_left+1;
    50. }
    51. for (int i = 1; i <= n; ++i) {
    52. printf("%d\n",ans[i]);
    53. }
    54. return 0;
    55. }

  • 相关阅读:
    LyScript 实现对内存堆栈扫描
    南大通用数据库-Gbase-8a-学习-04-部署分布式集群
    H3C V7版本交换机配置IRF
    【数据结构基础_链表】Leetcode 707.设计链表(好题)
    Arch Linux安装桌面环境
    Jmeter基础(2) 目录介绍
    【每日一题】正数分裂
    SQLSERVER基础--存储过程
    案例赏析 | 土耳其开赛利:闲置屋顶坐享“阳光收益”,助力企业实现绿色低碳转型
    List 去重的几种方法
  • 原文地址:https://blog.csdn.net/weixin_46266058/article/details/128203073