此题的万能门卡能够打开所有的门,其实就是每一扇门对应门卡区间都包含了某一张门卡,那么该卡就叫做万能门卡,由于所有门对应的门卡区间是连续的,所以我们可以直接使用差分来计数每一张门卡对应了多少扇门,对应的门数如果为m那么这张门卡即为万能门卡,对于每一扇门的区间,将该区间内的所有门卡计数加一
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,m;
int d[N];//门卡计数
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
int l,r;
cin>>l>>r;
d[l]++,d[r+1]--;//差分区间加1
}
for(int i=1;i<=n;i++)
d[i]+=d[i-1];//计算前缀和
int ans=0;
for(int i=1;i<=n;i++)
if(d[i]==m)ans++;
cout<<ans<<endl;
}
n, m = map(int, input().split())
d = [0] * (n + 1)
for _ in range(m):
l, r = map(int, input().split())
d[l] += 1
if r + 1 <= n:
d[r + 1] -= 1
for i in range(1, n + 1):
d[i] += d[i - 1]
ans = sum(1 for i in range(1, n + 1) if d[i] == m)
print(ans)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = 100010; // Assuming the maximum value of N
int n = scanner.nextInt();
int m = scanner.nextInt();
int[] d = new int[N];
for (int i = 0; i < m; i++) {
int l = scanner.nextInt();
int r = scanner.nextInt();
d[l]++;
if (r + 1 <= n) {
d[r + 1]--;
}
}
for (int i = 1; i <= n; i++) {
d[i] += d[i - 1];
}
int ans = 0;
for (int i = 1; i <= n; i++) {
if (d[i] == m) {
ans++;
}
}
System.out.println(ans);
}
}
小红有n张门卡,编号为1~n。有m扇门,第i扇门需要一张编号在li~ri区间内的卡才能打开。
如果一张门卡可以打开所有的门,我们定义这张门卡叫做万能门卡,现在请你计算这n张卡里有多少张万能门卡。
第一行给出两个正整数n,m
接下来m行每行两个正整数li,ri
1≤n,m≤105
1≤li≤ri≤n
输出一个正整数代表万能门卡的张树。
输入
4 2
1 3
2 4
输出
2