1 条题解

  • 0
    @ 2024-10-04 17:12:52

    正常人会使用题目中说的办法,只能拿到 \(52pts\)。
    代码:

    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        int x;
        int id;
    };
    bool cmp(node x,node y)
    {
        return x.x<y.x;
    }
    int main()
    {
        int a[8005];
        int n,q;
        scanf("%d %d",&n,&q);
        for(int i = 1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        node b[8005];
        int op;
        int x;
        int u;
        for(int i = 1;i<=q;i++)
        {
            scanf("%d",&op);
            if(op == 1)
            {
                scanf("%d %d",&x,&u);
                a[x] = u;
            }
            else
            {
                scanf("%d",&x);
                for(int i = 1;i<=n;i++)
                {
                    b[i].x = a[i];
                    b[i].id = i;
                }
                stable_sort(b+1,b+n+1,cmp);
                for(int i = 1;i<=n;i++)
                {
                    if(b[i].id == x)
                    {
                        printf("%d\n",i);
                        break;
                    }
                }
            }
        }
        return 0;
    }
    

    但是我们逆向思考,将每次排序的位置改为每一次修改之后,修改完后再记录下每一个数修改后的排序后的位置,当然,在询问开始前,也得排序一次,记录下每一个数的排序后位置。
    代码:

    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        int x;
        int id;
    };
    int cmp(node x,node y)
    {
        return x.x == y.x?x.id<y.id:x.x<y.x;
    }
    int main()
    {
        int b[8005];
        node a[8005];
        int n,q;
        scanf("%d %d",&n,&q);
        for(int i = 1;i<=n;i++)
        {
            scanf("%d",&a[i].x);
            a[i].id = i;
        }
        stable_sort(a+1,a+n+1,cmp);
        for(int i = 1;i<=n;i++)
        {
            b[a[i].id] = i;
        }
        for(int i = 1;i<=q;i++)
        {
            int op;
            int x;
            int u;
            scanf("%d",&op);
            if(op == 1)
            {
                scanf("%d %d",&x,&u);
                a[b[x]].x = u;
                stable_sort(a+1,a+n+1,cmp);
                for(int i = 1;i<=n;i++)
                {
                    b[a[i].id] = i;
                }
            }
            else
            {
                scanf("%d",&x);
                printf("%d\n",b[x]);
            }
        }
        return 0;
    }
    
  • 1

[CSP-J 2021 第二题] 插入排序

信息

ID
1012
难度
2
分类
(无)
标签
递交数
1
已通过
1
通过率
100%
上传者