• 厦门大学 ACM 1466 线段树维护


    链接 http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1466

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    using namespace std;
    inline int max( int a,int b ){return (a)>(b)?(a):(b);}
    struct date{
       int pre,pos;
    }temp;
    struct date2{
        int v,next;
    }edge[212345];
    struct date3{
        int lt,rt,Max;
    }node[4123456];
    
    vector<date>s[112345];
    int arr[112345],res[1123456],head[112345],N,M,k;
    void add_edge( int u,int v ){
        edge[k].v = v;
        edge[k].next = head[u];
        head[u] = k++;
    }
    void build_tree( int lt,int rt,int t ){
        node[t].lt = lt; node[t].rt = rt; node[t].Max = 0;
        if( lt == rt ) return ;
        int mid = ( lt + rt )>>1;
        build_tree( lt,mid,t<<1 );
        build_tree( mid+1,rt,t<<1|1 );
    }
    int update( int pos,int val,int t ){
        if( node[t].lt == node[t].rt ) return node[t].Max = val;
        if( node[t<<1].rt >= pos )  update( pos,val,t<<1 );
        if( node[t<<1|1].lt <= pos )update( pos,val,t<<1|1 );
        return node[t].Max = max( node[t<<1].Max,node[t<<1|1].Max );
    }
    int query( int lt,int rt,int t ){
        if( node[t].lt == lt && node[t].rt == rt )  return node[t].Max;
        if( node[t<<1].rt >= rt )query( lt,rt,t<<1 );
        else if( node[t<<1|1].lt <= lt )query( lt,rt,t<<1|1 );
             else{
                int a = query( lt,node[t<<1].rt,t<<1 );
                int b = query( node[t<<1|1].lt,rt,t<<1|1 );
                return max( a,b );
             }
    }
    void DFS( int u,int deep ){
        update( deep,arr[u],1 );
        int len = s[u].size( );
        for( int i = 0; i < len; i++ )
        {
            int pre = deep  - s[u][i].pre;
            if( pre <= 0 )res[s[u][i].pos] = -1;
            else          res[s[u][i].pos] = query( pre,deep,1 );
        }
        for( int i = head[u]; i != -1; i = edge[i].next )
        DFS( edge[i].v,deep+1 );
    }
    int main( )
    {
        while( scanf("%d",&N) != EOF )
        {
            for( int i = 0; i <= N; i++ )s[i].clear( );
            for( int i = 1; i <= N; i++ )
               scanf("%d",&arr[i]);
            int v,k = 0;arr[0] = 0;
            memset( head,-1,sizeof(head) );
            for( int u = 1; u <= N; u++ )
            {
                scanf("%d",&v);
                add_edge( v,u );
            }
              scanf("%d",&M);
            for( int i = 1; i <= M; i++ )
            {
                scanf("%d%d",&temp.pre,&v);
                temp.pos = i;
                s[v].push_back(temp);
            }
            build_tree( 1,N,1 );  DFS( 0,1 );
            for( int i = 1; i <= M; i++ )
            if( res[i] == -1 )printf("Wrong request\n");
            else              printf("%d\n",res[i]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    springcloud 入门 11 (Hystrix Dashboard)
    springcloud 入门 10 (eureka高可用)
    springcloud 入门 9 (消息总线)
    springboot 学习之路 20 (整合RabbitMQ)
    springcloud 入门 8 (config配置中心)
    springcloud 入门 7 (zuul路由网关)
    springcloud 入门 6 (断路器hystrix)
    springcloud 入门 5 (feign源码分析)
    springcloud 入门 4 (rebbon源码解读)
    Java实现多线程下载 URL以及URLConnection
  • 原文地址:https://www.cnblogs.com/wulangzhou/p/3078779.html
Copyright © 2020-2023  润新知