CF1354D

 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 }

思路还是蛮简单的,写对二分了耶

打字速度好像也快了那么一内内

加油加油頑張れ

原文地址:https://www.cnblogs.com/ecustlegendn324/p/13788151.html