zoukankan      html  css  js  c++  java
  • HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )

    线段树成段更新+区间最值。

    注意某人的乘车区间是[a, b-1],因为他在b站就下车了。

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    
    #define lson l, m, rt << 1
    #define rson m + 1, r, rt << 1 | 1
    #define lc rt << 1
    #define rc rt << 1 | 1
    
    using namespace std;
    
    const int MAXN = 1000100;
    
    struct node
    {
        int l, r;
    };
    
    node D[MAXN];
    int limit, Q;
    int maxi[ MAXN << 2 ];
    int lazy[ MAXN << 2 ];
    int N;
    
    void build( int l, int r, int rt )
    {
        maxi[rt] = lazy[rt] = 0;
        if ( l == r ) return;
        int m = ( l + r ) >> 1;
        build( lson );
        build( rson );
        return;
    }
    
    void PushUp( int rt )
    {
        maxi[rt] = max( maxi[lc], maxi[rc] );
        return;
    }
    
    void PushDown( int rt )
    {
        if ( lazy[rt] )
        {
            lazy[lc] += lazy[rt];
            lazy[rc] += lazy[rt];
            maxi[lc] += lazy[rt];
            maxi[rc] += lazy[rt];
            lazy[rt] = 0;
        }
        return;
    }
    
    void update( int L, int R, int l, int r, int rt )
    {
        if ( L <= l && r <= R )
        {
            lazy[rt] += 1;
            maxi[rt] += 1;
            return;
        }
        PushDown( rt );
        int m = ( l + r ) >> 1;
        if ( L <= m ) update( L, R, lson );
        if ( R > m )  update( L, R, rson );
        PushUp( rt );
        return;
    }
    
    int query( int L, int R, int l, int r, int rt )
    {
        if ( L <= l && r <= R )
        {
            return maxi[rt];
        }
        PushDown( rt );
        int m = ( l + r ) >> 1;
    
        int res = -10;
        if ( L <= m ) res = max( res, query( L, R, lson ) );
        if ( R > m )  res = max( res, query( L, R, rson ) );
        PushUp( rt );
        return res;
    }
    
    int main()
    {
        int T, cas = 0;
        scanf( "%d", &T );
        while ( T-- )
        {
            scanf( "%d%d", &limit, &Q );
            N = 0;
            for ( int i = 0; i < Q; ++i )
            {
                int u, v;
                scanf( "%d%d", &u, &v );
                N = max( N, v );
                --v;
                D[i].l = u, D[i].r = v;
            }
    
            build( 1, N, 1 );
            printf( "Case %d:
    ", ++cas );
            for ( int i = 0; i < Q; ++i )
            {
                int ans = query( D[i].l, D[i].r, 1, N, 1 );
                if ( ans < limit )
                {
                    printf( "%d ", i + 1 );
                    update( D[i].l, D[i].r, 1, N, 1 );
                }
            }
            puts("
    ");
        }
        return 0;
    }
  • 相关阅读:
    下拉复选框
    tp mysql 去重
    前端面试准备2----Javascript中的Undefined和null小结
    前端面试准备1----JS中eval()解析和为什么不要使用eval
    点击一个按钮触发文件选择
    解决JS在url中传递参数时参数包含中文乱码的问题
    asp.net文件/大文件上传需要配置的项目整理
    网页元素位置、鼠标事件位置信息小结
    DOM事件总结
    学习require.js中的一些总结
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/3322260.html
Copyright © 2011-2022 走看看