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