位运算
二进制中1的个数
给定一个长度为 n的数列,请你求出数列中每个数的二进制表示中 1的个数。
输入格式
第一行包含整数 n。
第二行包含 n个整数,表示整个数列。
输出格式
共一行,包含 n 个整数,其中的第 i个数表示数列中的第 i个数的二进制表示中 1 的个数。
数据范围
1≤n≤100000,
0≤数列中元素的值≤
1
0
9
10^9
109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
答案:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String[] str = bufferedReader.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int[] a = new int[n];
str = bufferedReader.readLine().split(" ");
for (int i = 0; i < n; i++)
a[i] = Integer.parseInt(str[i]);
int t = 0;
for (int i = 0; i < n; i++) {
t = 0;
for (int j = 0; j < 32; j++) {
if(((a[i]>>j)&1)==1)
t++;
}
System.out.print(t+" ");
}
}
}
离散化
区间和
假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。
现在,我们首先进行 n次操作,每次操作将某一位置 x上的数加 c。
接下来,进行 m次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。
输入格式
第一行包含两个整数 n 和 m。
接下来 n 行,每行包含两个整数 x和 c。
再接下来 m行,每行包含两个整数 l和 r。
输出格式
共 m行,每行输出一个询问中所求的区间内数字和。
数据范围
−
1
0
9
10^9
109≤x≤
1
0
9
10^9
109,
1≤n,m≤
1
0
5
10^5
105,
−
1
0
9
10^9
109≤l≤r≤
1
0
9
10^9
109,
−10000≤c≤10000
输入样例:
3 3
1 2
3 6
7 5
1 3
4 6
7 8
输出样例:
8
0
5
答案:
区间合并
给定 n 个区间 [li,ri] ,要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6] 。
输入格式
第一行包含整数 n。
接下来 n行,每行包含两个整数 l和 r。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
数据范围
1≤n≤100000,
−
1
0
9
10^9
109≤li≤ri≤
1
0
9
10^9
109
输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3
答案:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Interval implements Comparable<Interval> {
int start, end;
public Interval(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public int compareTo(Interval o) {
return Integer.compare(this.start, o.start);
}
}
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
List<Interval> intervals = new ArrayList<>();
String[] str = bufferedReader.readLine().split(" ");
int n = Integer.parseInt(str[0]);
for (int i = 0; i < n; i++) {
str = bufferedReader.readLine().split(" ");
intervals.add(new Interval(Integer.parseInt(str[0]), Integer.parseInt(str[1])));
}
Collections.sort(intervals);
int st = intervals.get(0).start;
int ed = intervals.get(0).end;
int t = 1;
for (int i = 1; i < intervals.size(); i++) {
Interval j = intervals.get(i);
if (j.start > ed) {
t++;
st = j.start;
ed = j.end;
} else {
ed = Math.max(ed, j.end);
}
}
System.out.println(t);
}
}