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\n",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 ;

}


 



 

你可能感兴趣的:(130902 周赛)