1 #include<iostream>
2 #include<algorithm>
3 #include<cstring>
4 #include<vector>
5 #include<cmath>
6 using namespace std;
7 int n, q;
8 int main(){
9 std::vector<int> v;
10 scanf("%d%d",&n,&q);
11 int x;
12 for(int i = 1 ; i <= n ; i++){
13 scanf("%d",&x);
14 if(i == 1) v.push_back(x);
15 else v.insert(lower_bound(v.begin(), v.end(), x), x);
16 }
17
18 for(int i = 1 ; i <= q ; i++){
19 scanf("%d",&x);
20 if(x < 0){
21 x *= -1;
22 vector<int>::iterator it = v.begin() + x - 1;
23 v.erase(it);
24 }else{
25 v.insert(lower_bound(v.begin(), v.end(), x),x);
26 }
27 }
28 if(v.empty()){
29 printf("0
");
30 }else{
31 printf("%d
",v.front());
32 }
33
34
35 return 0;
36 }
本来想能不能vector水过......实则不能
存着当vector的使用复习资料还不错
树状数组的正解写出来再挂着
10min后
1 #include<iostream>
2 #include<algorithm>
3 #include<cstring>
4 #include<vector>
5 #include<cmath>
6 #include<iomanip>
7 using namespace std;
8 const int maxn = 1e6 + 10;
9 int n, q, x;
10 int t[maxn];
11
12 int lowbit(int x)
13 {
14 return x & -x;
15 }
16
17 void add(int x, int val)
18 {
19 for(int i = x ; i <= n ; i += lowbit(i)){
20 t[i] += val;
21 }
22 }
23
24 int gets(int x)
25 {
26 int tmp = 0;
27 for(int i = x ; i >= 1 ; i -= lowbit(i)){
28 tmp += t[i];
29 }
30 return tmp;
31 }
32
33 int query(int x)
34 {
35 int l = 1, r = n, mid;
36 while(l < r){
37 mid = (l + r) >> 1;
38 if(gets(mid) < x){
39 l = mid + 1;
40 }else{
41 r = mid;
42 }
43 }
44 return l;
45 }
46
47 int main(){
48 scanf("%d%d",&n,&q);
49 for(int i = 1 ; i <= n ; i++){
50 scanf("%d",&x);
51 add(x, 1);
52 }
53 int cnt = n;
54 for(int i = 1 ; i <= q ; i++){
55 scanf("%d",&x);
56 if(x > 0){
57 add(x, 1);
58 cnt++;
59 }else{
60 add(query(-x), -1);
61 cnt--;
62 }
63 }
64
65 if(cnt > 0){
66 printf("%d
",query(1));
67 }else{
68 printf("0
");
69 }
70 return 0;
71 }
思路还是蛮简单的,写对二分了耶
打字速度好像也快了那么一内内
加油加油頑張れ