本以为E题不可做,结果一看答案代码倒是不难写,思路很巧妙。
A. In Search of an Easy Problem
题意
对于一道题,每个人进行评分,如果认为困难就给111分,认为简单就给000分。只要有人觉得这道题困难就是难题,问这道题是不是难题。
思路
记录评分1的数量,若大于0则为难题,否则为简单。
B. Vasya and Cornfield
题意
一个平面上有一个矩形和很多个点,矩形的四个顶点为(0,d),(d,0),(n,n−d),(n−d,n)(0, d), (d, 0), (n, n-d),(n-d, n)(0,d),(d,0),(n,n−d),(n−d,n),问每一个点是否在矩形外。
思路
矩形的四条边分别为x+y=d,x+y=n+n−d,y−x=d,y−x=−dx+y = d, x+y = n+n-d, y-x = d, y-x = -dx+y=d,x+y=n+n−d,y−x=d,y−x=−d,逐一判断每个点位于每一条边的哪一侧。
C. Vasya and Golden Ticket
题意
有一个数字序列,问能否将其分成两段以上,使得每一段的数字之和相等。数字个数为nnn,不超过100100100。
思路
枚举前111个数到前n−1n-1n−1个数作为第111段,计算数字之和,然后每次扫一遍序列,判断是否刚好能按这个和来分割数字序列。
D. Vasya and Triangle
题意
有三个数n,m,kn, m, kn,m,k,问能否在一个矩形中构造一个顶点坐标为整数并且面积为nmk\frac {nm}{k}knm的三角形,矩形的顶点为(0,0),(n,0),(0,m),(n,m)(0, 0), (n, 0), (0, m), (n, m)(0,0),(n,0),(0,m),(n,m)。
思路
待构造的三角形可以由一个能将其容纳的最小矩形切除若干个直角三角形得到,因此面积必然为12\frac {1} {2}21的倍数。首先化简nmk\frac {nm}{k}knm,若分母大于222,则不可能构造出这样的三角形;否则可以按以下方法构造:取三角形的顶点为(0,0),(x,0),(y,0)(0, 0), (x, 0), (y, 0)(0,0),(x,0),(y,0),使得xy2=nmk\frac {xy} {2} = \frac {nm}{k}2xy=knm。化简分数相当于nnn或mmm与kkk同时约去公约数,因此可以取nnn和mmm约分的结果作为xxx和yyy,若化简后分母为222,则直接构造三角形;若化简后分母为111,则取xxx或yyy的222倍,另一个保持不变,如果超出nnn或mmm,那么无法构造三角形。
E. Vasya and Good Sequences
题意
有一个整数序列,取一段连续的整数,如果对每个整数二进制表示任意调整000和111的位置之后,可以使得这些整数的异或和为000,那么这一段为好段,问这个整数序列有多少好段。整数范围为[1,1018][1, 10^{18}][1,1018]。
思路
由于整数二进制表示000和111的位置可以任意调整,所以只需要考虑整数中111的数量。要使一段为好段,必须满足两个条件:这一段中111的总数为偶数;每个整数111的数量不能超过这一段中111的总数的一半。若满足这两个条件,可以调整使得异或和在每一位上111的数量为偶数,得到异或和为000。然后因为整数不超过101810^{18}1018并且至少为111,即二进制表示不超过646464位并且至少为111位,所以只要一段整数的个数超过646464,每个整数111的数量就不可能超过这一段中111的总数的一半。因此对于整数个数不超过646464的段,直接计算111的总数以及整数中最大111的数量,判断是否满足条件;而对于整数个数超过646464的段,预处理前缀和判断111的总数为偶数的段的数量。具体计算如下:对于i=1,…,ni=1,\dots,ni=1,…,n,先预处理区间[1,i][1,i][1,i]中111的总数S1iS_{1i}S1i,然后预处理奇数S1iS_{1i}S1i的个数∑j=1i(S1imod  2)\sum_{j=1}^i (S_{1i} \mod 2)∑j=1i(S1imod2);对于区间[l,r][l, r][l,r],其中r=i+64,…,nr = i+64,\dots,nr=i+64,…,n,111的总数Slr=S1r−S1(l−1)S_{lr} = S_{1r} - S_{1(l-1)}Slr=S1r−S1(l−1),因此当S1(l−1)S_{1(l-1)}S1(l−1)为奇数时,取奇数S1rS_{1r}S1r的个数;当S1(l−1)S_{1(l-1)}S1(l−1)为偶数时,取偶数S1rS_{1r}S1r的个数。预处理时间复杂度为O(n)O(n)O(n),处理整数不超过646464个的段时间复杂度为O(64n)O(64n)O(64n),处理整数超过646464个的段时间复杂度为O(n)O(n)O(n)。