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