\(A,B\) 题太水了,不说了(A题还错了一次)
C题 Calendar Validator
有一张行数无限大,列数为 \(7\) 的矩阵,第 \(i\) 行第 \(j\) 列的值为 \((i-1)*7+j\) ,给出一个 \(n*m\) 新矩阵,判断新矩阵是不是这个矩阵的一个完整的部分。
\(n,m\le 1000\)
其实也挺水的,判断下一行是不是上一行对应列的数字 \(+7\) 得到,判断当前列是不是每次递增 \(1\) ,判断同一行的数减去 \(1\) 后除以 \(7\) 是不是相同即可。
复杂度 \(O(nm)\)
D题 Play Train
有编号为 \([1,n]\) 的 \(n\) 列火车,有三种操作,共 \(q\) 个。
\(1\) \(x\) \(y\) :在编号为 \(x\) 的火车后接上 \(y\)
\(2\) \(x\) \(y\) :在编号为 \(x\) 的火车后断开 \(y\)
\(3\) \(x\) :求和 \(x\) 连在一起的火车数量 \(k_i\)(还要求出具体是哪些火车)
其中 \(2\le n,q \le10^5\) ,第三种操作输出的总量在 \(10^6\) 以内。
\(ABC\) 最水的一道 \(D\) 题,\(pre_i\) 和 \(next_i\) 维护火车 \(i\) 前一个,后一个是什么编号,初值都是 \(i\) 。
维护方法显然,而对于询问,每次只需要从 \(x\) 开始找到最前面的火车,即满足 \(pre_i=i\) 的,然后向后走,知道 \(next_i=i\)
复杂度 \(O(\sum k_i+q)\)
E题 7
定义,以线段 \((x-1,y),(x,y)\) 和线段 \((x,y),(x,y-1)\) 形成的这个形状叫做一个 “ \(7\) ”,其中 \((x,y)\) 成为中心
平面直角坐标系内有 \(n\) 个这样的形状,以 \((x_i,y_i)\) 为中心,求至少删去多少个,可以使得在剩下的每个 "\(7\)" 中,以该形状的三个端点和原点形成的四边形不与其他四边形有交点。
\(n \le 10^5\)
这题评分 \(1600+\) ,但是其实虚高,其实是一个经典贪心题,当时翻译其实也出了很多锅,估计让很多选手没能通过这题。
对于一个 \((x,y)\) ,考虑 \((x-1,y),(x,y-1)\) ,这个图形占据的区域,就是以 \((x-1,y),(x,y-1)\) 和原点形成的两条直线中间夹住的这一部分,那也就是说,如果某条直线的斜率介于这两条直线的斜率之间,那么必然存在交点,转化一下,设两条直线斜率是 \(k1,k2\),那么就是 \([k1,k2]\) 被占领了,可以看作在一维数轴上这段区间被覆盖了,那就是求最大的不相交线段数目,按照右端点排序直接贪心求就行了,另外注意此题求斜率要开 \(long\) \(double\)
F题 String Cards
给定 \(n\) 个字符串,从中选取 \(k\) 个,可以按任意顺序排列后相接,求字典序最小的形成的字符串。
\(1\le k\le n\le50\)
\(F,H,G\) 三题暂时不会。