区间选点
import java.io.*;
import java.util.*;
class Range implements Comparable<Range>{
int l;
int r;
public Range(int l,int r){
this.l=l;
this.r=r;
}
public int compareTo(Range o){
return Integer.compare(r,o.r);
}
}
public class Main{
static int N=100010;
static Range[] range=new Range[N];
public static void main(String[] args)throws IOException{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(in.readLine());
String[] strs;
for(int i=0;i<n;i++){
strs=in.readLine().split(" ");
int l=Integer.parseInt(strs[0]);
int r=Integer.parseInt(strs[1]);
range[i]=new Range(l,r);
}
Arrays.sort(range,0,n);
int res=1;
int rear=range[0].r;
for(int i=1;i<n;i++){
if(range[i].l>rear){
rear=range[i].r;
res++;
}
}
System.out.println(res);
}
}
最大不相交区间数量
import java.io.*;
import java.util.*;
class Range implements Comparable<Range>{
int l;
int r;
public Range(int l,int r){
this.l=l;
this.r=r;
}
public int compareTo(Range o){
return Integer.compare(r,o.r);
}
}
public class Main{
static int N=100010;
static Range[] range=new Range[N];
public static void main(String[] args)throws IOException{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(in.readLine());
String[] strs;
for(int i=0;i<n;i++){
strs=in.readLine().split(" ");
int l=Integer.parseInt(strs[0]);
int r=Integer.parseInt(strs[1]);
range[i]=new Range(l,r);
}
Arrays.sort(range,0,n);
int res=0;
int ed=(int)(-1e9);
for(int i=0;i<n;i++){
if(range[i].l>ed){
ed=range[i].r;
res++;
}
}
System.out.println(res);
}
}
区间分组
代码实现①(手写堆优化):
不了解手写堆的请看:https://blog.csdn.net/m0_54136420/article/details/117868795
import java.io.*;
import java.util.*;
class Range implements Comparable<Range>{
int l;
int r;
public Range(int l,int r){
this.l=l;
this.r=r;
}
public int compareTo(Range o){
return Integer.compare(l,o.l);
}
}
public class Main{
static int N=100010;
static Range[] range=new Range[N];
static int[] h=new int[N];
static int cnt;
public static void main(String[] args)throws IOException{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(in.readLine());
String[] strs;
for(int i=0;i<n;i++){
strs=in.readLine().split(" ");
int l=Integer.parseInt(strs[0]);
int r=Integer.parseInt(strs[1]);
range[i]=new Range(l,r);
}
Arrays.sort(range,0,n);
for(int i=0;i<n;i++){
if(i==0||range[i].l<=h[1]){
h[++cnt]=range[i].r;
up(cnt);
}
else{
h[1]=range[i].r;
down(1);
}
}
System.out.println(cnt);
}
static void up(int u){
while(u/2>0&&h[u]<h[u/2]){
int temp=h[u];
h[u]=h[u/2];
h[u/2]=temp;
u>>=1;
}
}
static void down(int u){
int t=u;
if(u*2<=cnt && h[u*2]<h[t])t=u*2;
if(u*2+1<=cnt&&h[u*2+1]<h[t])t=u*2+1;
if(u!=t){
int temp=h[u];
h[u]=h[t];
h[t]=temp;
down(t);
}
}
}
代码实现②(优先队列实现小根堆):
不了解的请看:https://blog.csdn.net/m0_54136420/article/details/126808856
import java.io.*;
import java.util.*;
class Range implements Comparable<Range>{
int l;
int r;
public Range(int l,int r){
this.l=l;
this.r=r;
}
public int compareTo(Range o){
return Integer.compare(l,o.l);
}
}
public class Main{
static int N=100010;
static Range[] range=new Range[N];
static int[] h=new int[N];
static int cnt;
public static void main(String[] args)throws IOException{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(in.readLine());
String[] strs;
for(int i=0;i<n;i++){
strs=in.readLine().split(" ");
int l=Integer.parseInt(strs[0]);
int r=Integer.parseInt(strs[1]);
range[i]=new Range(l,r);
}
Arrays.sort(range,0,n);
Queue<Integer> h=new PriorityQueue<>();
for(int i=0;i<n;i++){
if(i==0||range[i].l<=h.peek())
h.add(range[i].r);
else{
h.poll();
h.add(range[i].r);
}
}
System.out.println(h.size());
}
}
区间覆盖
import java.io.*;
import java.util.*;
class Range implements Comparable<Range>{
int l;
int r;
public Range(int l,int r){
this.l=l;
this.r=r;
}
public int compareTo(Range o){
return Integer.compare(l,o.l);
}
}
public class Main{
static int N=100010;
static Range[] range=new Range[N];
public static void main(String[] args)throws IOException{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
int s,t;
String[] strs=in.readLine().split(" ");
s=Integer.parseInt(strs[0]);
t=Integer.parseInt(strs[1]);
int n=Integer.parseInt(in.readLine());
for(int i=0;i<n;i++){
strs=in.readLine().split(" ");
int l=Integer.parseInt(strs[0]);
int r=Integer.parseInt(strs[1]);
range[i]=new Range(l,r);
}
Arrays.sort(range,0,n);
int cnt=0;
boolean flag=true;
int maxr=s;
for(int i=0;i<n;){
if(range[i].l>s){
flag=false;
break;
}
while(i<n&&range[i].l<=s){
if(range[i].r>=maxr)
maxr=range[i].r;
i++;
}
if(maxr!=s||s==t){
s=maxr;
cnt++;
}
if(s>=t)break;
}
if(flag&&range[n-1].r>=t)System.out.println(cnt);
else System.out.println("-1");
}
}