优质奶牛 差分数组实现多次修改数组
[编程题]优质奶牛
时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 64M,其他语言128M
牛牛管理这一片牧场,在这片牧场中,一共有 头奶牛,为方便统计,它们排成了一排,编号为 1~n 。
现在质检员牛妹在检测这些奶牛的质量,她列出了 条特性,只有满足所有特性的奶牛才可称之为优质奶牛。
但是,牛牛现在只知道对于某条特性,某几段连续区间内的奶牛是满足条件的,如果这样依次排查,会浪费很多时间。由于牛妹时间很急,马上要赶往下一个牧场,所以,牛牛请你帮助他筛选优质奶牛。
输入描述: 本题为多组测试数据,第一行输入一个正整数 ,代表测试数据组数。 对于每组测试数据,在第一行输入两个正整数 ,代表奶牛数量以及需要满足的特性数量。 接下去对于每个特性,一行输入一个正整数,代表这个特性在奶牛中满足的区间数量,接着 行,每行输入两个正整数 ,代表闭区间 内的奶牛满足这一特性,题目给出的区间有可能重叠。 输出描述: 对于每组测试数据,在第一行输出优质奶牛的数量,第二行按照字典序输出优质奶牛的编号。
输入例子1: 1 10 2 3 1 2 4 5 8 8 2 1 4 6 8
输出例子1: 4 1 2 4 8
差分数组实现多次修改数组,
很变态,必须用流输入输出才符合运行时间,其实这道题出的有点问题
import java.io.*;
import java.util.*;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(System.out);
static int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
public static void main(String[] args) throws IOException {
int t = nextInt();
while(t-->0){
int n = nextInt(), m = nextInt();
//每头牛符合的条件数量
int[] count = new int[n+1];
boolean[][] matrix = new boolean[m][n];
for (int j = 0; j < m; j++) {
int[] now = new int[n+2];
int k = nextInt();
while(k-->0){
int l = nextInt(), r = nextInt();
now[l]++;
now[r+1]--;
}
//还原
for(int i=1; i<=n; i++){
now[i]+=now[i-1];
}
//判断达标
for(int i=1; i<=n; i++){
if(now[i]>=1)
count[i]++;
}
}
List<Integer> list = new ArrayList<>();
for (int i=1; i<=n; i++) {
if(count[i]==m){
list.add(i);
}
}
out.println(list.size());
for (int cow : list) {
out.print(cow+" ");
}
out.println();
}
out.flush();
}
}
下一篇:
代码随想录代码小记-hash表
