130902 周赛

来源:互联网 发布:小智淘宝外设店网址 编辑:程序博客网 时间:2024/06/10 19:19

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 100005using 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 ;}