【题意】现在有几个球排成一排,编号从1开始,开始时所有球为黑色,现在有n(<=2000)次操作,每次操作将l[i]至r[i](均在int范围)的球凃成颜色c[i](黑色'b'或白色'w'),然后找到最长的连续白色球,输出左右端点符号
【离散化】因为l[i]和r[i]都在int范围,显然不不可以开一个2^31-1那么大的数组。将l[i]和r[i]+1离散化,再模拟染色即可。
如果你不知道离散化:
将l[i]数组所有数与r[i]+1数组所有数取出来从小到大排序,做一个映射。
如样例
3
1 4 w
8 11 w
3 5 b
把1、5、8、12、3、6取出来,排序为1、3、5、6、8、12,离散化后
原数 | 1 | 3 | 5 | 6 | 8 | 12 |
离散化后 | 0 | 1 | 2 | 3 | 4 | 5 |
用mp[]做映射,类型为mp<int,int>。rev_mp[int]做逆向映射。
比如mp[4]=8,离散化后的4就可以看成数8,9,10,11的集合。如果离散化后的4被染成白色,那么相当于原数8,9,10,11均被染成白色。
再取样例中的一行: 1 4 w作为例子,这里1,4是原数,要从把球1,2,3,4均涂色,显然是凃离散化后0(1,2)和1(3,4)即可。
如果当初把r[i]做离散化而不是r[i]+1做离散化的话,r[i]就表示从它开始几个数的集合都被涂色,而不是从它结束涂色。
做好映射后,2^31-1个数就可以看成最多2*n个数,然后模拟染色即可。
这道题写的好晕啊,WA了5发后发现是多Case输入。。。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include