1.蓝桥杯
1.1压缩变换
解法1(使用HashMap和HashSet)
2016年蓝桥杯javaB组省赛
public static void main ( String[ ] args) {
Scanner scan = new Scanner ( System. in) ;
int n = scan. nextInt ( ) ;
int [ ] a = new int [ n] ;
for ( int i = 0 ; i < n; i++ ) {
a[ i] = scan. nextInt ( ) ;
}
int [ ] b = new int [ n] ;
Map< Integer, Integer> map = new HashMap < > ( ) ;
for ( int i = 0 ; i < n; i++ ) {
if ( ! map. containsKey ( a[ i] ) ) {
b[ i] = - a[ i] ;
} else {
int t= 0 ;
Set< Integer> set = new HashSet < > ( ) ;
for ( int j = map. get ( a[ i] ) + 1 ; j < i; j++ ) {
set. add ( a[ j] ) ;
}
b[ i] = set. size ( ) ;
}
map. put ( a[ i] , i) ;
}
for ( int i = 0 ; i < n; i++ ) {
System. out. print ( b[ i] + " " ) ;
}
}
解法2(使用线段树)
static Map< Integer, Integer> lastIndex = new HashMap < Integer, Integer> ( ) ;
static int [ ] a;
static int [ ] ans;
static int [ ] b;
private static int n;
private static SegTree root;
public static void main ( String[ ] args) throws FileNotFoundException {
System. setIn ( new FileInputStream ( new File ( "F:\\provincialGames_07_2016\\data10\\in8.txt" ) ) ) ;
System. setOut ( new PrintStream ( new File ( "F:\\provincialGames_07_2016\\data10\\output8.txt" ) ) ) ;
Scanner sc = new Scanner ( System. in) ;
n = sc. nextInt ( ) ;
a = new int [ n] ;
ans = new int [ n] ;
b = new int [ n] ;
root = buildSegTree ( 0 , n - 1 ) ;
for ( int i = 0 ; i < n; i++ ) {
int num = sc. nextInt ( ) ;
a[ i] = num;
Integer preIndex = lastIndex. get ( num) ;
if ( preIndex == null)
{
ans[ i] = - num;
b[ i] = 1 ;
update ( root, i, 1 ) ;
} else {
ans[ i] = query ( root, preIndex + 1 , i - 1 ) ;
b[ preIndex] = 0 ;
b[ i] = 1 ;
update ( root, preIndex, - 1 ) ;
update ( root, i, 1 ) ;
}
lastIndex. put ( num, i) ;
}
for ( int i = 0 ; i < n; i++ ) {
System. out. print ( ans[ i] + " " ) ;
}
}
private static int query ( SegTree tree, int x, int y) {
int l = tree. l;
int r = tree. r;
if ( x <= l && y >= r)
return tree. sum;
int mid = ( l + r) / 2 ;
int ans = 0 ;
if ( x <= mid)
ans += query ( tree. lson, x, y) ;
if ( y > mid)
ans += query ( tree. rson, x, y) ;
return ans;
}
private static SegTree buildSegTree ( int l, int r) {
SegTree segTree = new SegTree ( l, r) ;
if ( l == r) {
segTree. sum = b[ l] ;
return segTree;
}
int mid = ( l + r) / 2 ;
SegTree lson = buildSegTree ( l, mid) ;
SegTree rson = buildSegTree ( mid + 1 , r) ;
segTree. lson = lson;
segTree. rson = rson;
segTree. sum = lson. sum + rson. sum;
return segTree;
}
static void update ( SegTree tree, int p, int i) {
if ( tree == null)
return ;
tree. sum += i;
int l = tree. l;
int r = tree. r;
int mid = ( l + r) >> 1 ;
if ( p <= mid) {
update ( tree. lson, p, i) ;
} else {
update ( tree. rson, p, i) ;
}
}
static class SegTree {
int l, r;
int sum;
SegTree lson;
SegTree rson;
public SegTree ( int l, int r) {
this . l = l;
this . r = r;
}
}