深圳市做网站公司,自己做网站翻译服务器 - 添加网站,保定网站建设公司排名,动漫网站怎么做的题目#xff1a; 样例解释#xff1a; 【样例解释 #1】 在修改操作之前#xff0c;假设 H 老师进行了一次插入排序#xff0c;则原序列的三个元素在排序结束后所处的位置分别是 3,2,1。 在修改操作之后#xff0c;假设 H 老师进行了一次插入排序#xff0c;则原序列的三个…题目 样例解释 【样例解释 #1】 在修改操作之前假设 H 老师进行了一次插入排序则原序列的三个元素在排序结束后所处的位置分别是 3,2,1。 在修改操作之后假设 H 老师进行了一次插入排序则原序列的三个元素在排序结束后所处的位置分别是 3,1,2。 注意虽然此时 a2a3但是我们不能将其视为相同的元素。 思路 可以发现对于一个已经有序的数列单点修改一个值我们可以通过前后冒泡各一次来保持有序举个例子 原序列为 1,1,4,5,6,71,1,4,5,6,7修改为 1,1,9,5,6,71,1,9,5,6,7。 我们可以从前往后冒泡再次维持了数列的有序。这样的操作是 O(n)O(n) 的。 同样的我们可以维护一个有序数列并记录原下标与先下标之间的关系用数组记录每次修改后更新这种关系。 这样修改操作是 O(n)O(n) 的查询是 O(1)O(1) 的。 代码
#includeiostream
#includecstdio
#includealgorithm
using namespace std;
const int MAXN8005;
int n,q;
int t[MAXN];
struct node{int pre,id;
}a[MAXN];
bool cmp(node x,node y){if(x.pre!y.pre) return x.prey.pre;return x.idy.id;
}//两个元素之间的优先级
int main(){//freopen(sort.in,r,stdin);//freopen(sort.out,w,stdout);scanf(%d%d,n,q); for(int i1;in;i){scanf(%d,a[i].pre);a[i].idi;}//输入sort(a1,an1,cmp);//排序for(int i1;in;i)t[a[i].id]i;for(int i1;iq;i){int opt,x,v;scanf(%d,opt);if(opt1){//单点修改scanf(%d%d,x,v);//Ax-va[t[x]].prev;for(int jn;j2;j--)if(cmp(a[j],a[j-1])){node kkksc03a[j];a[j]a[j-1];a[j-1]kkksc03;}//前扫for(int j2;jn;j)if(cmp(a[j],a[j-1])){node kkksc03a[j];a[j]a[j-1];a[j-1]kkksc03;}//后扫for(int i1;in;i)t[a[i].id]i;//更新之间的关系}else{scanf(%d,x);printf(%d\n,t[x]);}}return 0;
}