1 条题解

  • 1
    @ 2023-6-20 19:57:47

    用一个数组num[]num[]储存每个数排序后的位置。

    输入aia_i,更新num[]num[](num[a[i].id] = i)。

    • 操作1: 先直接修改:a[num[x]].x = v 然后排序。要用插入排序,而不是全部重新排序,因为其他未修改的数已经是单调递增的了。 排序后再更新一次num[]num[]
    • 操作2: 直接输出numxnum_x即可。

    code:

    #include <bits/stdc++.h>
    using namespace std;
    
    struct node
    {
    	int x,id;
    }a[8001];
    
    int n,q,x,v;
    int num[8001];//数排序后的位置
    
    bool cmp(node x,node y)
    {
    	if(x.x != y.x) return x.x < y.x;//排序
    	else return x.id < y.id;
    }
    
    void turn()
    {
    	for(int i = 1;i <= n;i++)
    	{
    		num[a[i].id] = i;//更新
    	}
    	return;
    }
    
    signed main()
    {
    	freopen("sort.in","r",stdin);
    	freopen("sort.out","w",stdout);
    	scanf("%d%d",&n,&q);
    	for(int i = 1;i <= n;i++)
    	{
    		scanf("%d",&a[i].x); 
    		a[i].id = i;
    	}
    	sort(a + 1,a + n + 1,cmp);
    	turn();
    	while(q--)
    	{
    		int o;
    		scanf("%d",&o);
    		if(o == 1)
    		{
    			scanf("%d%d",&x,&v);
    			a[num[x]].x = v;//直接修改
    			for(int i = 1;i < n;i++)//排序
    			{
    				if(a[i].x > a[i + 1].x)
    				{
    					swap(a[i],a[i + 1]);
    				}
    				else if(a[i].x == a[i + 1].x && a[i].id > a[i + 1].id)
    				{
    					swap(a[i],a[i + 1]);
    				}
    			}
    			for(int i = n - 1;i > 0;i--)
    			{
    				if(a[i].x > a[i + 1].x)
    				{
    					swap(a[i],a[i + 1]);
    				}
    				else if(a[i].x == a[i + 1].x && a[i].id > a[i + 1].id)
    				{
    					swap(a[i],a[i + 1]);
    				}
    			}
    			turn();
    		}
    		else
    		{
    			scanf("%d",&x);
    			printf("%d\n",num[x]);//输出
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    1476
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    30
    已通过
    8
    上传者