非算法竞赛出生,只听说过线段树没用过,这里给一个力大砖飞的解法
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static TreeMap<Integer, Integer> mp = new TreeMap<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int ruleNum = in.nextInt();
for (int i = 0; i < ruleNum; i++) {
String str = in.next();
int status = 0;
if(str.contains("undo")){
status = 0;
in.next();
}
else{
status = 1;
}
String[] ranges = in.next().split(",");
for (String s : ranges) {
String[] startEnd = s.split("-");
if (startEnd.length == 1)updateTree(Integer.parseInt(startEnd[0]),Integer.parseInt(startEnd[0]), status);
else updateTree(Integer.parseInt(startEnd[0]), Integer.parseInt(startEnd[1]),status);
}
}
int lastbegin = -1;
int lastend = -2;
for (Map.Entry<Integer, Integer>entry : mp.entrySet()) {
if(lastend < entry.getKey() - 1){
if(lastend < 0){}
else{
//当区间无交集,即输出结果
if(lastend == lastbegin)System.out.print(lastbegin + ",");
else System.out.print(lastbegin + "-" + lastend + ",");
}
lastbegin = entry.getKey();
lastend = Math.max(entry.getValue(),lastend);
}
else{
//当区间有交集,合并区间,TreeMap保证了左端点单调严格递增
lastend = Math.max(entry.getValue(),lastend);
}
}
if(lastbegin == -1)return ;
else if(lastend == lastbegin)System.out.print(lastbegin);
else System.out.print(lastbegin + "-" + lastend);
}
public static void updateTree(int start, int end, int ops) {
if (ops == 1) {
//由于Hashmap键唯一,因此合并区间
if(mp.containsKey(start))mp.put(start,Math.max(mp.get(start),end));
else mp.put(start, end);
return;
}
TreeMap<Integer, Integer> mp1 = new TreeMap<>();
mp1.putAll(mp);
for (Map.Entry<Integer, Integer>entry : mp1.entrySet()) {
if(entry.getKey() >= start && entry.getValue() <= end){
//被禁用区间包围
mp.remove(entry.getKey());
}
else if(entry.getKey() < start && entry.getValue() > end){
//包围禁用区间
mp.put(entry.getKey(),start - 1);
//由于Hashmap键唯一,因此合并区间
if(mp.containsKey(end + 1))mp.put(end + 1,Math.max(mp.get(end + 1),entry.getValue()));
else mp.put(end + 1,entry.getValue());
}
else if(entry.getKey() < start && entry.getValue() >= start && entry.getValue() <= end){
//entry.start,start,entry.end,end
mp.put(entry.getKey(),start - 1);
}
else if(end >= entry.getKey() && end < entry.getValue() && start <= entry.getKey()){
//start, entry.start,end,entry.end
mp.remove(entry.getKey());
//由于Hashmap键唯一,因此合并区间
if(mp.containsKey(end + 1))mp.put(end + 1,Math.max(mp.get(end + 1),entry.getValue()));
else mp.put(end + 1,entry.getValue());
}
}
}
}



京公网安备 11010502036488号