zoukankan      html  css  js  c++  java
  • codeforces 876 D. Sorting the Coins(线段树(不用线段树写也行线段树写比较装逼))

    题目链接:http://codeforces.com/contest/876/problem/D

    题解:一道简单的类似模拟的题目。其实就是看右边连出来有多少连续不需要换的假设位置为pos只要找pos-1左边一共有多少x就行(x是什么看一下样例)

    第一个是正常解法第二个是用线段树写的,其实正常写就是模拟一下就好

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<ctime>
    #include<utility>
    using namespace std;
    typedef long long ll;
    int a[333333];
    int main()
    {
        int n , x;
        scanf("%d",&n);
        int ans = 1 , pos = n;
        printf("%d ",ans);
        for(int i = 1 ; i <= n ; i++)
        {
            ans++;
            scanf("%d" , &x);
            a[x]=1;
            while(pos >= 1 && a[pos])
            {
                pos--;
                ans--;
            }
            printf("%d " , ans);
        }
        return 0;
    }

    这个是用线段树写的没有参考意义

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define lson (i << 1)
    #define rson ((i << 1) | 1)
    using namespace std;
    const int M = 3e5 + 10;
    int a[M] , ans[M];
    struct TnT {
        int l , r , sum;
    }T[M << 2];
    void push_up(int i) {
        T[i].sum = T[lson].sum + T[rson].sum;
    }
    void build(int l , int r , int i) {
        int mid = (l + r) >> 1;
        T[i].sum = 0 , T[i].l = l , T[i].r = r;
        if(l == r) {
            return ;
        }
        build(l , mid , lson);
        build(mid + 1 , r , rson);
        push_up(i);
    }
    void update(int pos , int i) {
        int mid = (T[i].l + T[i].r) >> 1;
        if(T[i].l == T[i].r && T[i].l == pos) {
            T[i].sum ^= 1;
            return ;
        }
        if(mid < pos) {
            update(pos , rson);
        }
        else {
            update(pos , lson);
        }
        push_up(i);
    }
    int query(int l , int r , int i) {
        int mid = (T[i].l + T[i].r) >> 1;
        if(T[i].l == l && T[i].r == r) {
            return T[i].sum;
        }
        if(mid < l) {
            return query(l , r , rson);
        }
        else if(mid >= r) {
            return query(l , r , lson);
        }
        else {
            return query(l , mid , lson) + query(mid + 1 , r , rson);
        }
    }
    int query_right(int l , int r , int i) {
        int mid = (T[i].l + T[i].r) >> 1;
        if(T[i].l == T[i].r) {
            if(T[i].sum == 0) {
                return T[i].l;
            }
            return -1;
        }
        if(T[rson].sum < (T[rson].r - T[rson].l + 1)) {
            return query_right(mid + 1 , r , rson);
        }
        else {
            return query_right(l , mid , lson);
        }
    }
    int main() {
        int n;
        scanf("%d" , &n);
        for(int i = 1 ; i <= n ; i++) {
            scanf("%d" , &a[i]);
        }
        ans[0] = 1;
        build(1 , n , 1);
        for(int i = 1 ; i <= n ; i++) {
            update(a[i] , 1);
            int Ri = query_right(1 , n , 1);
            if(Ri != -1) {
                ans[i] = query(1 , Ri , 1) + 1;
            }
            else {
                ans[i] = 1;
            }
        }
        for(int i = 0 ; i <= n ; i++) {
            printf("%d " , ans[i]);
        }
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    目前最大的IPV6安全风险有哪些?
    PHP中exec、system等函数调用linux命令问题
    ubuntu下LAMP环境安装
    Ubuntu配置Apache虚拟主机
    XML和YAML的区别与使用方法
    使用CURL访问站点的时候出现403的解决办法
    IPv6安装及使用手册
    SuperSlide2.1-滚动
    HTML常用手册
    关于Ajax参数的思考
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/7678640.html
Copyright © 2011-2022 走看看