zoukankan      html  css  js  c++  java
  • 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 }

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

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

    加油加油頑張れ

  • 相关阅读:
    Executors提供的四种线程池和自定义线程池
    ava8并发教程:Threads和Executors
    Java 信号量 Semaphore 介绍
    Condition-线程通信更高效的方式
    ReentrantLock详解 以及与synchronized的区别
    FutureTask 源码解析
    Java多线程编程:Callable、Future和FutureTask浅析
    Callable 和 Runnable 的区别
    javascript之url转义escape()、encodeURI()和decodeURI()
    yii2.0安装ElasticSearch及使用
  • 原文地址:https://www.cnblogs.com/ecustlegendn324/p/13788151.html
Copyright © 2011-2022 走看看