• 130902 周赛


    UVALIVE地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=572

    待续。

    A。Arranging Heaps

    DP +斜率优化,见这里。http://blog.csdn.net/just_water/article/details/11021247

    B。

    C。Trie树+DFS

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <map>
    #include <list>
    #define mem(a, b) memset(a ,b, sizeof(a))
    #define maxn 100005
    
    using namespace std ;
    struct T {
        int count ;
        int fk ;
        int next[26] ;
        void init() {
            count = fk = 0 ;
            mem(next , 0) ;
        }
    } t[1011111] ;
    
    int num = 0 ;
    void init() {
        num = 0 ;
        t[0].init() ;
    }
    void build(char *a) {
        int l = strlen(a) ;
        int now = 0 ;
        for (int i = 0 ; i < l ; i ++ ) {
            int x = a[i] - 'a' ;
            if(t[now].next[x] == 0) {
                t[now].next[x] = ++ num ;
                t[num].init() ;
            }
            now = t[now].next[x] ;
        }
        t[now].fk = 1 ;
    }
    char a[1111111] ;
    int ans = 0 ;
    void dfs(int now , int dp) {
        int c = 0 ;
        for (int i = 0 ; i < 26 ; i ++ ) {
            if(t[now].next[i]) {
                c ++ ;
            }
        }
        if(c == 0 || t[now].fk) {
            ans += dp ;
        }
        if(c == 1) {
            for (int i = 0 ; i < 26 ; i ++ ) {
                if(t[now].next[i]) {
                    if(t[now].fk) {
                        dfs(t[now].next[i] , dp + 1) ;
                    } else {
                        dfs(t[now].next[i] , dp) ;
                    }
                }
            }
        } else if(c > 1) {
            for (int i = 0 ; i < 26 ; i ++ ) {
                if(t[now].next[i]) {
                    if(t[now].fk) {
                        dfs(t[now].next[i], dp + 1 ) ;
                    } else dfs(t[now].next[i] , dp + 1) ;
                }
            }
        }
    }
    int main() {
        int n ;
        while(cin >> n) {
            init() ;
            for (int i = 0 ; i < n ; i ++ ) {
                scanf("%s",a) ;
                build(a) ;
            }
            ans = 0 ;
            for (int i = 0 ; i < 26 ; i ++ )if(t[0].next[i])dfs(t[0].next[i] , 1) ;
            printf("%.2f
    ",ans * 1.0 / n ) ;
        }
        return 0 ;
    }
    


    D。签到题。

    E。

    F。

    G。

    H。签到题。

    I。线段树或者树状数组基础题。

    struct kdq {
        int l , r , num , ok ;
    } t[N * 4] ;
    
    int a[N] ;
    void push_up(int x) {
        t[x].num = t[LL(x)].num + t[RR(x)].num ;
        t[x].ok = t[LL(x)].ok & t[RR(x)].ok ;
    }
    void build(int l , int r , int x) {
        t[x].l = l ;
        t[x].r = r ;
        t[x].ok = 1 ;
        if(l == r) {
            if(a[l] < 0) {
                t[x].num = 1 ;
                t[x].ok = 1 ;
            } else if(a[l] == 0) {
                t[x].ok = 0 ;
                t[x].num = 0 ;
            } else {
                t[x].ok = 1 ;
                t[x].num = 0 ;
            }
            return ;
        }
        int mid = l + r >> 1 ;
        build(l , mid , LL(x)) ;
        build(mid + 1 , r , RR(x)) ;
        push_up(x) ;
    }
    
    void updata(int l ,int x ,int nn) {
        if(t[x].l == l && t[x].r == l) {
            if(nn < 0) {
                t[x].num = 1 ;
                t[x].ok = 1 ;
            } else if(nn > 0) {
                t[x].num = 0 ;
                t[x].ok = 1 ;
            } else {
                t[x].num = 0 ;
                t[x].ok = 0 ;
            }
            return ;
        }
        int mid = t[x].l + t[x].r >> 1 ;
        if(l <= mid)updata(l , LL(x) , nn );
        else if(l > mid)updata(l , RR(x) , nn) ;
        push_up(x) ;
    }
    
    int fk = 0 ;
    int query(int l , int r , int x) {
        if(l > t[x].r)return 0 ;
        if(r < t[x].l)return 0 ;
        if(t[x].l == l && t[x].r == r) {
            if(t[x].ok) {
                return t[x].num ;
            } else {
                fk = 1 ;
                return 0 ;
            }
        }
        int mid = t[x].l + t[x].r >> 1 ;
        if(r <= mid)return query( l , r , LL(x)) ;
        else if(l > mid)return query(l , r , RR(x)) ;
        else {
            return query(l , mid , LL(x)) + query(mid + 1 ,r , RR(x)) ;
        }
    
    }
    int main() {
        int n , m ;
        while(cin >> n >> m) {
            for (int i = 1 ; i <= n ; i ++ )scanf("%d",&a[i]) ;
            char str[2] ;
            int aa , bb ;
            build(1 , n , 1) ;
            while(m -- ) {
                scanf("%s%d%d",str ,&aa,&bb) ;
                if(str[0] == 'C') {
                    a[aa] = bb ;
                    updata(aa , 1 , bb) ;
                    fk = 0 ;
                    int num = query(aa , bb , 1) ;
                    if(fk) {
                        putchar('0') ;
    
                    } else if(num & 1)putchar('-') ;
                    else putchar('+') ;
                }
            }
            cout << endl;
        }
        return 0 ;
    }
    




  • 相关阅读:
    成为 Team Leader 后我最关心的那些事
    《管理的实践》读书心得
    玩黑客学校CTF
    DHCP中继器
    test
    初窥XSS跨站脚本攻击
    TCP/IP模型
    逻辑漏洞-客户端验证的邮箱-Web渗透实例之中国教育部青少年普法网站逻辑漏洞
    逻辑漏洞-支付风险-大疆某处支付逻辑漏洞可1元买无人机
    逻辑漏洞-密码找回之验证码发给了客户端
  • 原文地址:https://www.cnblogs.com/james1207/p/3306352.html
Copyright © 2020-2023  润新知