1 条题解
-
0linjinkun (linjinkun) LV 5 MOD @ 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
信息
- ID
- 1012
- 难度
- 2
- 分类
- (无)
- 标签
- 递交数
- 1
- 已通过
- 1
- 通过率
- 100%
- 上传者