• 湘潭大学 ACM 1159 线段树


    http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1159

    因为只有加点  没有删点  所以线段树维护

    #include<iostream>
    #include<stdio.h>
    #include<cstring>
    #include<string>
    #include<algorithm>
    using namespace std;
    
    struct date {
        int lt,rt,val,pre;
    }node[412345];
    bool vis[112345];
    void build_tree( int lt,int rt,int t )
    {
        node[t].lt = lt;  node[t].rt = rt;
        node[t].val = 0;  node[t].pre = 0;
        if( lt == rt )return;
        int mid = ( lt + rt )>>1;
        build_tree( lt,mid,t<<1 );
        build_tree( mid+1,rt,t<<1|1 );
    }
    void update( int pre,int pos,int val,int t )
    {
        if( node[t].lt == node[t].rt )
        {
            node[t].val += val;
            node[t].pre = pos;
            return;
        }
        if( node[t<<1].rt >= pos )
             update( pre,pos,val,t<<1 );
        else update( pre,pos,val,t<<1|1 );
        if( node[t<<1].val > node[t<<1|1].val )
        {
            node[t].val = node[t<<1].val;
            node[t].pre = node[t<<1].pre;
        }
        else
        {
            node[t].val = node[t<<1|1].val;
            if( node[t<<1].val == node[t<<1|1].val )
                 node[t].pre = max( node[t<<1].pre,node[t<<1|1].pre );
            else node[t].pre = node[t<<1|1].pre;
        }
    }
    int query( int t )
    {
        if( node[t].lt == node[t].rt )return node[t].lt;
        if( node[t<<1].val > node[t<<1|1].val )
              return query( t<<1 );
        else  if( node[t<<1].val < node[t<<1|1].val )
              return query( t<<1|1 );
              else if( node[t<<1].pre > node[t<<1|1].pre )
                        return query( t<<1 );
                   else return query( t<<1|1 );
    }
    int main( )
    {
        int N,val,x,y; char str[3];
        while( scanf("%d",&N) != EOF && N )
        {
            build_tree( 1,N,1 ); bool fell = false;
            memset( vis,0,sizeof(vis) );
            int k = 1;
            for( int i = 1; i <= N; i++ )
            {
                scanf("%s",&str);
                if( str[0] == 'N' )
                {
                    scanf("%d",&val);
                    update( i,k++,val,1 );
                }
                if( str[0] == 'I' )
                {
                    scanf("%d%d",&x,&y);
                    if( vis[x] )continue;
                    update( i,x,y,1 );
                }
                if( str[0] == 'D' )
                {
                    scanf("%d%d",&x,&);
                    if( vis[x] )continue;
                    update( i,x,y*(-1),1 );
                }
                if( str[0] == 'E' )
                {
                    scanf("%d",&x);
                    update( i,x,(1<<30)*-1,1 );
                    vis[x] = true;
                }
                if( str[0] == 'S' )
                {
                    if( fell ){printf(" ");}
                    fell = true;
                    printf("%d",query( 1 ));
                }
            }
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    深入研究Node.js的底层原理和高级使用
    Node.js实际案例分享
    Node.js的下载、安装、配置、Hello World、文档阅读
    Node.js初识
    sphinx初识
    Yii2中后台用前台的代码设置验证码显示不出来?
    彻底解决Yii2中网页刷新时验证码不刷新的问题
    yii2高级模板使用一个域名管理前后台
    Shot(三分)
    遮挡判断(模拟)
  • 原文地址:https://www.cnblogs.com/wulangzhou/p/3075526.html
Copyright © 2020-2023  润新知