ITMO金牌训练营题目总结

day1

【A】留着坑。

【B√】
  学到了一个有趣的姿势。
  我记得求出拓扑图上每个点能到的点数只能暴力bitset,现场做的时候就束手无策;
  但本题是有性质的,它只是判断是否是全集。缩点后,我们先对图做一遍拓扑排序。显然,对于拓扑序上的一个点x,判断其合法性等价于:它前面的点都能到它且它都能到它后面的点。现在只考虑前面部分的判定(后面是对称的)。
  给出简单的判定结论:如果在图中删掉x拓扑序之后的点,那么“x前面的点都能x”等价于“x前面的点出度都大于0”。
  证明很显然。如果有一个出度=0,它显然不能到x;如果每一个都大于0,至少能转移到一个它后面的点,归纳一下肯定能到x。

【C】留着坑。

【D√】
  这个经典拓展姿势以前见到过:每次删除选的最大的数并加上它后面的那个;或者不删除它直接加上它后面的那个。
  今天画了画发现这样也不会重复统计(以前总记得要哈希一样的)。维护字典序的时候,不需要暴力开主席树的哈希;思考一下,答案的位数不会超过20,所以直接暴力存下长度为20的选择方案即可。

【E√】
  先缩点双。对于一个点双连通分量,容易(?)发现,符合要求的图案只能是:(1)恰好一个环。(2)存在度数大于2的点对(u,v),然后全是u->...->...->...->v的路径(它们长度当然要相同)。直接根据这个性质判定即可,细节处理略烦。注意割点可以同时存在于多个点双之中,所以一些不当的操作会让复杂度退化;但是每一条边只可能在一个点双中,所以在tarjan的时候,可以顺便维护一个当前边集,每次找到割点后,就可以弹出这个边集(即为一个点双)。

【F√】
  考验智商的坑题……直接暴力DP看似是\(N*max(a_i)\)的,但只要我们将\(a_i\)先从小到大排序,那么复杂度就是\(\sum a_i=10^7\)……

【G√】签到。

【H√】
  直接转移更新是\(O(N^2*M*K)\)的。正好被卡掉。
  需要设一些辅助DP数组,借容斥来降低复杂度。设\(f_{i,j,k}\)表示\(i\)\(k\)步走到\(j\),且中间不经过\(i\)\(j\)的方案数(这就是要求的);再设\(s_{i,j,k}\)表示可以经过\(i\),\(j\)的方案数(这个可以直接转移预处理出来)。为了转移f,我们很自然地要增设一个\(w_{i,j,k}\)表示从\(i\)\(k\)步走到\(i\),且中途不经过\(i\)\(j\)的方案数。
  考虑转移f。先f=s,然后枚举第一次不合法的位置(走到了\(i\)或者\(j\))减掉。即:
  \(f_{i,j,k}=s_{i,j,k}- \sum_p f_{i,j,p}*s_{j,j,k-p}-\sum_p w_{i,j,k}*s_{i,j,k-p}\)
  比较玄妙的是,w也可以类似于这种方式地进行转移。同样枚举第一次走到的不合法位置减掉。即:
  \(w_{i,j,k}=s_{i,j,k}- \sum_p w_{i,j,p}*s_{i,i,k-p}-\sum_p f_{i,j,k}*s_{j,i,k-p}\)

【I√】可做题。

【J】
  特别烧脑的博弈。有空请教一下lzw学长再来补。

【K√】可做题。

day2

【A】
  一道积分题?想补,留着坑。

【B】留着坑。

【C√】
  注意到最后一步一定是我们选。对方只会从我方这里拿巧克力,一个自然的想法是:先把一块大的留在它那儿,最后一步再拿\(\frac{2}{3}\)回来。如果开头拿\(\frac{1}{3}\),那么最后一步能获得\(\frac{4}{9}\)。中间的决策比较随意,可以每次选一个巧克力的1/2拿过来。

【D√】
  在每一层,我们想要晋级的关键是:对手所在的那棵子树的最强者要弱于我们。所以枚举每一层,每次组合数算一下概率即可。

【E√】
  稍微推一推式子,发现要求log个双阶乘,即求 \(N!! \mod 2^{64}\)(N是奇数)。已知两种做法。
  ①有空再更。
  ①还没学会,有空学一学。

【F】
  又是玄学线代?先用插头DP跑出转移矩阵,大概2000+的状态数。直接矩乘显然不行,然后打表发现有递推式?据说递推式是900项左右的,但依然不能用高斯消元求系数>_<。据说,每次shift一位解未知数是可以做到\(O(N^2)\)的……解出系数后,还要用线性递推那套理论,在特征多项式里把\(\Lambda\)换成矩阵A,然后反复套用搞一搞。哎……需要好久才能补完呢……

【G√】
  枚举每一种颜色,发现每次要对一个区间执行公差为1的等差数列加。因为只有一个最后的询问,直接维护一个二阶差分数组即可。

【H√】
  比较有趣的一道题呀……先考虑求最小的值。对于每一对\((i,j)\)(假设j是i点的最优解),连一条j->i,边权是\(a_i\)^\(b_j\)的边;特别地,\(i=j\)是一定可以做到的,我们可以新开一个root点,然后连一条root->i的边。容易证明,一种以root为根的树形图,一一对应于一种方案!
  至于原题要求排列字典序最小的,我们可以套一个逐位确定,每次把后面未确定的点拿出来跑一个最小树形图即可。

【I√】
  依旧是比较有趣的一道题呀……好像是不能直接维护的,要用到一些哈希的手段。比如对于一个匹配串,其中有一个置换是\((a_1,a_2,……,a_k)\),其充要于\(s_{a_i}-s_{a_{i+1}}=0\)。我们生成一些随机数\(F_i\),所以其也充要于\(F_k*(s_{a_i}-s_{a_{i+1}})=0\)。将原来的置换的下标看成一个多项式的次数,写成\(F_1*(x^{a_1}-x^{a_2})+F_2*(x^{a_2}-x^{a_3})+……\)。稍有经验就会发现,如果把s串倒序,与这个多项式卷积后某个固定位置上的值,即为某一段目标串(*)式的总和。显然它合法的必要条件是总和为0。我们可以多做几遍,每次为0的即可以视为合法。

【J√】
  分析一下即可知道,用\(f_{i,j}\)表示到第i个点,之前的步长是j的方案数,这样暴力DP效率是\(O(N * \sqrt N)\)的。但是需要一些申请空间和卡内存的技巧。
  其实有一种更加简单的做法。直接设\(F_i\)为到第i个点的方案数。做完i后,\(F_{i+a_i*k}+=F_i\),直到\(a[i+a_i*k]=a_i\)时停止更新。容易知道这样做是正确的。考虑复杂度证明:对于>\(\sqrt N\)的步长,暴力复杂度不会超过\(\sqrt N\);对于小于\(\sqrt N\)的步长,个数不会超过\(\sqrt N\),每一种效率均摊最坏是\(O(N)\)。所以这样做就是 \(O(N * \sqrt N)\)的。

【K】
  完美消除序列+点分?留着填坑。

【L√】
  打表发现(??),随着天数的增加,给第一天分配的值是单调递减的。
  设\(F_n\)表示n天的答案。计算\(F_n\)的时候,我们考虑给第一天分配了\(p\),那么它的期望是\(p*p\),没通过的概率是\(1-p\)。注意到\(F_{n-1}\)的第一天的值q肯定是大于p的,所以如果没通过,我们可以直接调用\(F_{n-1}\)(重新设q=p+delta)。即\(F_n=p^2+(1-p)*F_{n-1}\)。这个递推式在模域下是有循环节的……

day3

【A√】
  设整个集合的异或和为sum,即要选出某个异或和k,使\(|k-k\)$sum|$最小。考虑sum中所有1的位置$pos_i$(0的位置,k和ksum相同,不影响它们的差值)。不妨设k再sum最高位(\(pos_1\))是1。那么我们肯定想优先让\(pos_2=0\),然后按顺序贪心地想让\(pos_i=0\)。类似于逐位确定地过去,每次可以用线性基判断。

【B√】
  注意到\(a_1=S1\)。对于剩下\(2^n-2\)个数,必然可以划成等长的两列,一列是\(p_1,p_2,\dots,p_{2^{n-1}-1}\),一列是\(p_1+a_1,p_2+a_1,\dots,p_{2^{n-1}-1}+a_1\)。注意到这里必然是\(p_1\)最小,所以我们可以每次找到最小的数x,然后把\(x+a_1\)删掉,并继续这个流程;得到新的S后可以继续迭代,把所有的a都求出来。

【C√】
  经典数据结构?一维下标,然后在线从左下角转移。直接二维数据结构内存可能会开不下,套一个cdq之后就只要树状数组了。

【D】留着坑。

【E√】
  先根据题意写一个暴力DP。设\(F_S\)表示桌上还剩下S二进制集合的这些卡片时的最优解,那么显然\(F_S=\min_k \{ max(F_X+F_Y) \}+1\)。其中\(F_X\)\(F_Y\)表示根据k位0/1划分后,分成的两个部分。注意到,\(n\)很大,但是位数\(k\)只有13。所以我们可以用巧妙地方式来表达这个S。对于每一位,分配三进制状态。0/1表示这一位强制要是0/1,2表示这一位无限制。
  这样对于一个三进制集合G,它代表所有符合要求的卡片的S。
  这个\(F_G\)当然也可以直接转移,每次把一个2拆成0和1取max;当表示的串大小只有1的时候设为0。

【F√】签到题。

【G√】
  考虑prim式的最小生成树。我们暴力维护当前已选点集S到每一个状态的最小值dist数组,每次从优先队列里挑一个小的加进来。那么怎么维护dist呢?注意到,dist的值不会超过20——如果我们每次严格修改了dist的值,均摊复杂度是\(N*20\)的。那么做法就是,每次新加入一个点x后,我们设\(dist_x=0\);然后从x开始,每次拓展一步,一层一层去更新dist。每次如果能更新到就加入下一层队列里。每一步复杂度都是\(N*20\)的。注意,由于我们会更新\(N*20\)次,所以不能直接用优先队列去求下一个较小的dist。其实我们可以直接开20个队列,dist更新时就往新的距离的队列里插入这个点。prim每次加点时,再花20的代价扫描这些数组,取出最优的即可。

【H√】
  把两条路视为两个人一起从左上角走到右下角。通过画图模拟,会发现我们可以交替考虑行和列的值,唯一确定这两条路经过的路径。每当这两条路产生交点后,我们可以停下来,化成一个子问题。如果产生了k个交点,那么答案就是\(2^k\)。因为每次两条路径可以交换。

【I√】签到题。

【J√】
  没想到……其实组合数这种连乘的式子,可以用对数快速判断。我们枚举k,因为\(\frac{n!}{(n-k)!}\)是递增的,我们可以二分n,然后用对数验证。注意对数可能会有精度问题,我们可以在二分结果左右扩展一些。这里验证的时候,可以给阶乘直接预处理模大模数的结果,然后在模域下判断。

【K√】
  向nightfall膜拜了做法,感觉特别帅气;同时通过看lbn的代码,对这一类问题(每次最长链继承的DP),学到了一种简单的用长链剖分实现的方法。
  设\(f_{i,j}\)为i点子树下深度为j的点的个数。设\(g_{i,j}\)为i点子树下的点对个数,满足:这两个点深度相同,且如果添一个从i开始往外走j步的点,这个三个点是符合要求的三元组。转移时,每次拷贝最长的儿子的信息,然后每次和另一棵子树暴力合并。f转移比较简单。考虑\(g_x\)的转移:儿子\(y\)有两种贡献:①本来\(g_y\)的信息,下标位移一下加过来。②\(f_x\)\(f_y\)相乘转移。
  考虑统计答案。对于一个三元组\((a,b,c)\),我们在\(x=lca(a,b,c)\)处统计答案。每次一个一个枚举儿子\(y\),枚举三元组里有一个/两个在y子树里,转移一下。
  有关继承的方便写法:开一个很长的内存池。对于每一段长链,在内存池里分配一个空间。实际的\(f\)\(g\)都是指针数组,指向内存池里的空间。这样就可以方便地位移转移了。
  

【L√】
  预处理\(diff[i][j]\)表示从第一个串i,第二个串j位置开始的两个串的差距。这样给出两个串的开始位置和一段距离,我们可以\(O(1)\)判断出这个解是否合法。\(N^2\)枚举了两个开头后,如果套个二分,应该是过不了的。注意到答案ans的变化只有N。而且每次对于一组开头,如果它在ans+1的长度下不合法,就可以直接退出。否则,我们可以直接每次ans++,然后继续判断ans+1在此处是否合法。显然这个效率是\(O(N^2+N)\)的。

day4

【A√】
  第一次先问对面的两个人,根据是否相同可以缩小到左右某一侧。之后每次是对一条链“二分”,观察中间那个点和左右的点的关系再继续迭代其中一半。

【B】留着坑。

【C√】
  感觉是皮克定理的弱化版?我们选一个点当做原点,然后关注一条边向量V。然后我们在三角形那一侧找一个与这条边距离最近的点P(这个可以转化为两个向量的叉积最小;由叉积式子和扩展欧几里得,必然存在最小的面积\(\frac{1}{2}\),所以我们必然能找到对应的点)。结论是:过P作平行于V的向量V'。三角形里有整点充要于V'上有在三角形内的整点(证明还没想过>_<)。这样直接判一下就好了。

【D√】
  十分巧妙的题!转化的问题就是:实时维护一个长度为\(V=500\)的模域下的背包,每次从最后面加一个物品,或者从最前面删一个物品,然后询问当前这个区间的物品能拼出的模域下\((l,r)\)之间某个体积\(X\)的最大价值是多少。
  背包的性质十分经典:可以\(O(V)\)加入一个物品;只能删除最后加的物品,效率是\(O(1)\);必须\(O(V^2)\)合并两个背包。
  由操作数有10W,所有和合并有关的我们都不能考虑。我们发现,如果用栈来操作物品,是可以维护的;可惜题目里是队列。
  黑科技:可以用两个栈A和B来模拟逐渐向右移的队列。加入队尾Y后,直接放入A栈的栈顶;删除队首X时,如果B栈非空,就删除B栈栈顶(能保证此栈顶必然是队首),否则暴力把A栈顶一个一个移动到B栈顶,直到找到了X,弹出它后结束。可以归纳证明,B栈标号严格小于A栈,且B栈从栈顶开始是顺序,A栈是逆序。
  最后询问时不能暴力合并,可以用一个单调队列来线性求max。

【E】
  队友们比赛时搞出了……不太明白……之后去请教一下……。

【F√】
  假设根是关键点。我们去考虑每一个点x,考虑如何identify它的所有孩子y。注意到,如果它有\(X\)个儿子,那么至少需要有\(X-1\)个儿子里放关键点。所以我们可以进行一个树形DP,每次返回子树里必须放几个。每次考虑x的时候,还需要额外增加“子树里没放过的儿子y的个数”-1个关键点。
  如果根不是关键点,我们可以在原来那棵树上再从祖先开始DP一边,求出以每一个点为根时的答案。

【G】放弃了。

【H】
  队友赛后补了,以后去请教。

【I√】
  多校原题,吉利课件也有……
  考虑标记合并的问题。设一组标记\((a,b)\)的意义是\(\lfloor \frac{x+a}{b} \rfloor\),我们考虑增加了一组\((c,d)\)标记后会如何变化。依据整除的性质,我们可以得到\(\lfloor \frac{\lfloor \frac{x+a}{b} \rfloor + c}{d} \rfloor=\lfloor \frac {\frac{x+a}{b} + c}{d} \rfloor=\lfloor \frac {x+a + bc}{bd} \rfloor\)。虽然又可以变成原来的形式,但是每次分母会乘1000,显然几次之后就无法存下……。
  我们改进这个标记。设一组标记为\((a,b,c)\),意义是\(\lfloor \frac{x+a}{b}+c \rfloor (a < b)\),相当于把b整除a的部分移出来了。由最终每一个点的值\(\leq 3*10^8\),所以当\(b>3*10^8\)时,无论x是何值,此时只有两种取值(而且我们可以求出x的分界线);在这种状态下,加一个标记时,必然仍然只有两种取值,且x的分界线依旧不变。
  所以我们可以直接分块(这个标记性质我还应用不到线段树上去,感觉down和up比较混乱)。对于每一个块维护三个点的标记:如果\(b \leq 3*10^8\),就开LL存下实际的标记;一旦超过,直接维护两种取值即可。每次重构块时,如果已经超过,可以拿本来\(a_i\)的值和x分界线比较,确定新的\(a_i\)的值。
  以上做法也可以看出,每次超过的时候,整段区间里最大值和最小值只相差1了。所以吉利的套路应声而出。每次整除一个区间的时候,如果最大值和最小值为1了,就快速维护并退出;否则暴力递归子树去整除。

【J】留着坑。

【K√】
  我们无需考虑具体是怎么连边的。我们知道一共有\(2*(E-1)\)个点参与连边,所以只要在保证所有连通块选的点数 \(\leq E-1\)的情况下,每次选取最少的点加入答案。

day5

【A√】签到题。

【B√】
  调整法或打表可发现,=n的情况和<=n的情况是一样的。
  显然,如果出现了数字i和数字i+1,\(c_i \leq c_{i+1}\)。所以可以直接用堆去暴力。每次要不把当前的数字加上二进制的一位的次数去拓展,要不放入一个新的数字;这些都是使答案+1的增量。然而这儿速度显然是不够快的。
  我们可以先二分出堆的最后一步的增量mid。那么可以先求出增量\(\leq mid-1\)的答案,再一点一点暴力添加\(=mid\)的答案即可。细节略烦。

【C√】
  超级超级有趣的构造题——构造\(N\)个点,恰好有\(K\)条对角线严格在内侧的不自交多边形。\(4 \leq N \leq 100\)
  首先由三角剖分的性质,当\(K<N-3\)时无解。现给出一种在其余情况下都能构造出来的方法。
  基本模型是,将\(N\)放在中心极远处,然后1~N-1排列成一个上凸的圆弧。显然这样在内侧的点数是\(N-3\)。当\(K\)增大时,我们考虑把前t(\(t \geq 3\))个点“掰成”下凸的(即第t个点不变,1~t-1“翻过来”)。易得此时内侧点数为\(N-3+\frac{t*(t-3)}{2}+1\)(+1是因为1和t的连线也合法了)。
  我们找到一个最小的t,使得内侧点数\(\geq K\)。现在我们还要减少若干个合法对角线。由不等式可得,我们要减少的对角戏数量\(p\)满足\(0 \leq p \leq t-3\)。此时,我们可以把极远处的1号点慢慢移回来。在往下移动的过程中,其到点t+1~N-1的对角线依然合法,但是它会逐渐看不到\(t-1,t-2,……1\)这些点——所以我们可以做到减少最多\(t-2\)条合法对角线。
  具体构造的时候,我设点t坐标\((0,0)\),点n坐标\((1,y)\)
  点\(i(i<t)\)坐标\((-(1+2+……+(t-i)),-1000000*(t-i))\)
  点\(i(i>t)\)坐标\((1000000*(i-t),-(1+2+……+(i-t)))\)
  在这样的条件下,\(x=1\)直线上点n逐渐看不到左侧点的那些区间会很大,y可以直接对某个点斜率下取整计算得到。
  
【D√】
  见识到了什么叫做神奇……有一个不涉及FFT的公式解……
  首先观察到一个性质:如果一种局面存在集合k的方案,那么只存在唯一的一种方案(这样我们可以对合法集合k进行计数)。
  设\(F_{n,k}\)为答案,尝试去构造递推式。假设我们最后加入了点n,枚举其是否作为k个点里的一个,得到式子:
  \(F_{n,k}=F(n-1,k-1)*(1-p)^{n-k}+F(n-1,k)*p^k\)——但是这个递推式是\(O(N^2)\)的。
  脑补一下,假设我们每次考虑最前面加入了点1,可以得到一个对称的式子。即
  \(F_{n,k}=F(n-1,k-1)*p^{n-k}+F(n-1,k)*(1-p)^k\)
  这样求出的\(F_{n,k}\)当然是相同的。联立上下两个式子即可得到:
  \(F_{n,k}*(p^k-(1-p)^k)=F_{n,k-1}*(p^{N+1-k}-(1-p)^{N+1-k})\)
  这样N就是定值了,变成了关于K的一维递推!直接\(O(N \log N)\)求一下即可。
  注意到,当\(p=0.5\)时分母会变成0。此时由p的特殊性,可以直接用组合数式子求答案。

【E】
  是一道很有趣的题呢。emmmm补完再更。

【F√】
  构造题。被lsmll学长秒杀了……有空去研究一下。

【G√】
  考虑直接枚举直线的斜率d,它的贡献是\(\min\{r_1,r_2+d,\dots,r_n+(n-1)d \}-max \{l_1,l_2+d,\dots,l_n+(n-1)d \}+1\)。发现当d变化的时候,实际是一堆直线问某个x的max或min。只要建立一个上凸壳和一个下凸壳询问一下即可。注意d可能会很大,所以不能暴力枚举所有的x。其实只要一段段枚举x,每次一起算即可。

【H】
  很迷的特判+随机/爆搜(?)题。

【I】溜了溜了。

【J】溜了溜了。

【K】
  首先将N分解成\(p_i^{k_i}\)的形式。最后的答案就是\(min{a_i}=0\)\(max{a_i}=k_i\)的方案数。很容易想到容斥的形式,枚举每一个质数无限制/min/max/都限制。注意到在计算贡献的时候,min和max的贡献是等价的,把他们并在一起考虑即可。效率为\(3^{15}*O(1)\)
  注意不必用rho分解,因为我们只关心\(k_i\)。只需判到\(10^6\),然后要不是\(p1*p2\),要不是\(p^2\)。单独判一下后者即可。
  

day6

【A√】
  DP一下即可。lzw学长一下就过了呢。

【B】
  给出一棵N个点的树,每条边边权是[0,1]的随机实数。求树的期望直径。溜了溜了。

【C√】
  每次只需暴力枚举boss是谁,然后匈牙利判一下即可。一个点成为boss的必要条件是:度数至少是\(\lfloor \frac{N}{2} \rfloor\)。按边考虑可以证明复杂度。

【D】
  N个二元组\((p,q)\)按顺序插入。要求插在尽量前面,但是插入点下标必须满足\(\geq q\),且插入后左右两个点中至少有一个的p与它相同。如果没有合法位置,就插在最后。求结束时的序列模样。

  显然我们主要的任务是求出每个元素插入时的位置。
  脑补了一个平衡树维护、线段树查标号的方法。
  其实可以只用线段树和vector来完成这个task。首先,连续颜色(p)合在一起不影响结果。我们把连续颜色都看做一段,然后给他们按先后顺序编个号;同时对每一种颜色维护一个vector,按顺序记录这种颜色的所有编号。每次插入一个二元组时,我们查询一下下标为\(q-1\)的点所在颜色段的编号id;然后在该二元组颜色的vector里二分一下(因为所有编号\(\geq id\)的段都合法,找最靠前的一个即可)。当然查不到的话就新建一个段。现在唯一的问题是,我们要实时维护好下标。其实只要开一个以编号为下标的线段树,维护编号区间里的点数和。每次在线段树里“二分地”走下去即可。
  算出每次的插入位置后,我们倒着循环一遍,用树状数组就能维护出最后的答案。效率\(O(NlogN)\)
  

【E】
  给出一个长度为\(N\)的随机十进制数S。求$\lfloor \frac{S}{1} \rfloor+ \lfloor \frac{S}{11} \rfloor +…… $的准确值。想补。

【F√】
  感觉这种置换环有关的题很经典呀。首先显然每一个环可以独立考虑,最后把答案并起来即可。
  对于每一组置换,其实有\(S\)\(T\)两个环。S最终变换到T,可以分成两部:S第一次变成T,T某次有变回了T。其中第一部分可以最快步数,第二部分则是一个循环。也就是说,最后每一个环对答案ans的要求是:\(ans \mod A_i=B_i\)。CRT合并起来即可。
  这两个部分的求法类似。以第一部分为例。我们先枚举某一种字符,关注它们在分别在S和T中的分布(显然个数要相同)。一种暴力的想法是,对于S中的一个位置,我们枚举它对应T中的哪个位置,暴力验证一下是否可以,然后把步数取个min即可。仔细分析验证过程,发现只要两两的间距相同即可。所以一开始我们可以求出S和T的两两间距集合S‘和T’,将T'倍长后,用kmp求出S'和T‘所有匹配位置,把步数取个min即可。

【G√】
  差分一下考虑起来就比较简单。但是会卡精度。注意可以用模数来验证小数操作的判相等。

【H√】
  容易发现,把-1都换成前面最靠近它的不是-1的数,n能尽可能得长。
  然后可以依次对数字\(1,2,\dots,m\)考虑,每次判断能在开头加几个(每次加在开头肯定不劣)。

【I√】
  神奇的交互题。
  本质是要找一个在N+(1~10)上的单调函数来估价。本来我以为是简单的\(f(x)=x\)\(f(x)=x^2\),没想到lsmll试了\(f(x)=2^x\)过了。

【J】
  甚至不知道题意。

【K√】
  异或=0的条件其实比较宽。耐心特判有一个可修改的、两个可修改的即可。多个可修改的话,每次随机规定一下判一下就行了。

posted @ 2018-01-30 22:55  了491  阅读(529)  评论(1编辑  收藏  举报