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