- 【Level 1 语法基础课】检验赛2
插入排序详解(当时课上给你们讲没讲完,有问题问我)
- 2024-2-5 20:54:58 @
离散化
#include<bits/stdc++.h>
using namespace std;
const int N=8010;
int n,q,b[N];//用b数组来存原来的下标
int num,x,v;
struct node{
int id;
int num;
}a[N];//a为原数组
bool cmp(node a,node b)
{
if(a.num==b.num)
return a.id<b.id;
else
return a.num<b.num;
}
void jiaohuan(int pos) //pos是position简写
{
while(pos>1) //从右向左找
{
if(a[pos].num>a[pos-1].num)
break;
if(a[pos].num==a[pos-1].num&&a[pos].id>a[pos-1].id)
break;
swap(a[pos-1],a[pos]); //ID和num都交换
b[a[pos].id]=pos; //更新位置
pos--;
}
while(pos<n)
{
if(a[pos].num<a[pos+1].num)
break;
if(a[pos].num==a[pos+1].num&&a[pos].id<a[pos+1].id)
break;
swap(a[pos+1],a[pos]);
b[a[pos].id]=pos;
pos++;
}
b[a[pos].id] = pos; //把最后一个(或第一个)补上
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i].num;
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
b[a[i].id]=i; // 这里是用b数组来存第i个数的下标的下标,可以理解为形成一个映射关系
}
while(q--)
{
cin>>num;
if(num==1) //找到原数组a的第x个元素,更换为v (可以更改数组)
{
cin>>x>>v;
a[b[x]].num=v;//按题意模拟
change(b[x]);
//sort(a+1,a+n+1,cmp);
//for(int i=1;i<=n;i++)
// b[a[i].id] = i;
}
if(num==2) //从小到大排序,找到排序前数组a的第x个元素的新位置 (不更改数组)
{
cin>>x;
cout<<b[x]<<endl;
}
}
return 0;
}
2 comments
-
Collinor LV 2 @ 2024-2-20 20:52:16Edited
-
2024-2-12 20:57:27@
18 25
- 1