2035B - Everyone Loves Tres:开始直接暴搜直接超时,后面看题解觉得太离谱了根本想不出来。以后碰
到这种就找规律吧…当n=1和3时为-1,当n为偶数时前n-2个都是3后面有两个6,而当n为奇数时前n-5个为
3,后面为36366.
2000C - Numeric String Template:开始只用一个哈希没过用两个哈希超时…看完题解发现得用unoredered_map的find函数,find(键值),可以找寻表示值,如果没有表示值则返回end迭代器,找到了就返回对于的迭代器时间复杂度是o(1)。在检测时检查如果键值未被使用(即find==end())就创建一个对应关系,如果find使用过且不等于这个值就直接break掉。
1998B - Minimize Equal Sum Subarrays:神奇的构造…题目简直太难懂了,题目要给出一个新排列使得
pi+p(i+1)+…+pj=qi+q(i+1)+…+qj这样的数对(i,j)数量最小,通过观察可以发现如果把最后一项提到前面剩下的保持不变则必定可以生成一个只有(1,n)一个数对的排序。
1985C - Хорошие префиксы:交了前两遍一直在超时…看了题解发现思路巧妙,不过题解没用前缀和优
化我用了然后依据题解思路也是ac,还是比较简单。
2009D:2e5的数据差不多只有o(n)的时间复杂度才能过想了半天没想出来…直角三角形有两种情况:1
.两边垂直于坐标系,2.45度等腰直角三角形,可以开一个v[2e5][2]用来存储每个点上是否有点,v[x][y]++
然后满足v[i][0]&&v[i][1]符合条件,满足v[i][1]&&v[i-1][0]&&v[i+1][0]符合条件还有一种和第二种
一样。
2009E:看完题解才知道这是一道二分的题目,1e9的数据注定不可能用数组,用一个PLLsum来计算前缀和
后缀和(用等差公式),然后利用二分当后缀大于前缀时要l=mid+1,因为要让前缀和大一些后缀和小一
些。同时Cur=mid,cur=mid不能放在后缀小于前缀里,此时的正差值正在逐渐变小,这个mid值有可能就是我们要找的满足条件的最大索引值(因为再增大一点索引,可能就不满足后缀和大于前缀和这个趋势了),所以此时将 curr 更新为当前的 mid 值是合理的,然后通过移动左边界lomid+1,继续在右半区 去寻找是否还有更大的mid值也能满足后缀和大于前缀和这个条件,以此来找到最大的那个符合条件的索引。最后比较cur和cur+1的最小差值,要cur+1是因为cur+1正好就是前缀大于后缀的情况。
2309B Shohag Loves Strings:从最短开始考虑一个a一定是奇数为-1,长度为2的两种情况:ab,aa看出两
个相同为偶数,不同为奇数。长度为3:aba,abc.abc为偶数前者不是。而bba和abb则输出长度为2相同的
剩下就是考虑即没有两个连续相同又没有三个连续不同的。例如abababab。分析可得长度为1-n-1的长度
的子串分别有两个而n有1个所以总字串为2n-1为奇数。
所以两个长度相同或三个连续不同的直接输出剩下的就输出-1.
2041E:比较容易想到只要三个数就可表示出来。n1+n3=3*a-b,然后分情况讨论。当b>=0时先算出n3=b+1,n1也可以得到不过。当出现a=100,b=10时这种情况会导致n1>n3,因此当3a-2b-1>=b+1需要改变策略令n1=b-1同样当b<0时先算出n1=b-1,不过当出现a=-100,b=-10时会导致n3<n1,所以当3a-2b-1<=b+1时候需首先让n3=b+1
2029B Replacement:没想出思路…如果s中1或0任何一个数量为0说明无法改变了就直接返回No,开一个for循环依次遍历r中的数字(开始我以为替换的这个ri可以是r中任意数…),如果r[i]为0,s1减一反之则s1-1如果有一个率先变成0了就直接no。
2024B Buying Lemonade:直接模拟会超时。最优策略是先将所有按钮按最少个数个。然后一定有一个或者多个按钮为0,最坏情况就是每个为0的按钮都多按一下,以此类推即可。思路:先将数组进行排序,每次就是按(al-a(l-1))*(n-l+1),同时获得的数量也是这个,将它和k比较,如果大于等于k,操作次数就是cs-(k2-k)。如果小于就找找下一个大于a[l]的最小值,注意遇到等于a[l]的需要再按依次即cs++。
1997C Even Positions:奇妙的贪心,发现如果可以填入右括号就一定要填右括号,否则一定不是最优解,可以用栈来维护,遇到空格如果栈为空就直接放入栈中,如果非空就直接运算,为(时一定压入栈,如果为)一定是提出栈。
1997B Make Three Regions:想出了一半了…考虑最简单情况即第一行:x.x,第二行:…这种情况下就满足。因此遍历整个a,b查看有多少个这种形式即可。
467B:1100的构造题给我整破防了特地挑了道简单的1100构造:用到位运算知识:^异或于:二进制中如果相同则变成0不同则变成1.lowbit{returnx&-x}返回这个数的最低位1.a[i]-=lowbit(a[i])表示减去二进制中的这个1.基础课上都有。
1993B:思路基本想到了但还是有一个易错点没想到:用vector分别存奇数和偶数,如果有任何一个size等于0就直接返回0。通过观察可以发现:如果存在奇偶不等时最后的结果一定全是奇数,所以先找到最大的奇数。按从小到大的顺序遍历偶数vector,如果发现这个数小于最大奇数,令最大奇数+=这个数,也就是更新最大奇数。如果遇到大于目前这个最大奇数就直接break并返回偶数数量+1,否则遍历完就直接返回偶数数量。易错点:我之前以为如果遇到大于目前最大奇数的偶数时,ans++,i–,目的是先改变最大奇数再退回到这个偶数再进行比较。但是忘了一点:如果遇到第一个大于的偶数这么干,再遇到第二个大于目前最大奇数的偶数又这么干,但是可以直接+=最大的偶数,这样还少了1次…
2042C Competitive Fishing:利用到了后缀和。即s[i]表示从ai到an中1,0的差值,如果ai为1则s就+1,否则就-1。设ai表示第i个分割段的第一个数的下标。由后缀和和差分可知总的值=0(s[a1]-s[a2])+1(s[a2]-s[a3])+2(s[a3]-s[a4])+....+(m-2)(s[am-1]-s[am])+(m-1)*(s[am])=s2+s3+…+sm。
因此从大到小遍历s,相加,如果结果>=k,返回ans+1,如果s[i]<=0了,还没有>=k就返回-1.
1977B Binary Colouring:到目前为止见过最傻冒的题目…首先思路根本就没想出来:先算出x的二进制
数(我想到了可能要求二进制但没往这个方向下去)其次这么求二进制我也忘了…x&1表示取x的最低位。x>>=1表示将x向右移一位这样就可以求x的二进制。然后就是更新了:题目要求不能是11,1-1这种必须中间有个0(题目说的真绕不能讲明白点?)观察可发现11可更新为-101这种形式,但是如果111这种的就会出现-102,不要紧出现2就往前进一位就行,说了这么多虽然这题傻冒但是归根还是位运算这种的知识点不熟悉…
2050C Uninteresting Number:能被9整除的数它各个位的和一定能整除9,因为1除9余1,10除9余1,100除9余1…然后就是数字翻倍:0,1,2,3只有这几个数字的平方小于10,而0,1平方后和不改变所以只考虑2,3情况:2平方-2等于2,3的平方-3等于6,而且2,3平方个数分别不应该超过8,因为任何数除9余数都是0-8之间。知道这些就很好办了可惜我比赛时一个都不知道…
2050D Digital string maximization:一个数字向左移动不超过a[i]次,因为在移动a[i]次后就变为0。因此利用while循环枚举每个a[i],然后暴力枚举从a[i]到a[i+8]不难发现a[j]移到i位置变成的数就是a[j]-(j-i)。注意枚举还要满足小于a.szie()。随后利用string的erase(pos,num)出去a中的这个字符。
2050E Three Strings:算是cf上第一道真正的dp题(还神奇)f[i][j]表示a中前i个字母,b中前j个字母组成的c(i+j),考虑c(i+j)可能来自a和b,a两种情况:a[i]和c[i+j]相同:f[i][j]=f[i-1][j]。
不同:f[i-1][j]+1。b的两种情况也类似。唯一需要注意的是a,b,c前面都加一个空格这样可以防止越界
不过注意加空格后就是1 1开始循环,i=0,j=0的情况被忽略了需要先进行考虑。
492B Vanya and Lanterns:属于是1200的简单题了…但第一遍还是有一个细节没考虑到,后面重新写了一下:多加两个点a[0]=0,a[n+1]=l,当遍历所有点时枚举到他们俩特殊讨论一下其他点都是这个点减去上一个点的一半,这两个点不用除以2就可以。
706B Interesting drink:看完题目就知道可以用二分这题用upper_bound,但是忘了怎么用…特地复习了好久,不过官方题解用的是前缀和也是不错的启发点。
2003C Turtle and Good Pairs:开始猜结论以为把重复的放一坨,显然1200的构造没这么简单,后面看完题解显然AABBC和ABCAB是后者的好对多。至于证明我是证不出来…还要注意一点:for(auto t:v1)
如果要改变v1中的变量需要加&号不熟悉范围遍历导致忘记了这个点。
1957B A BIT of a Construction:按位或看成了异或与,题解死活看不懂…按位或:只要两个二进制数其中一个数上是1那么这位就是1.由这个性质可知:k=2^(a)-1时按位或一定全是1。我们可以按照最简单的来构造:只构造两个数,其他全是0,第一个就应该是2^(x-1)-1这个形式,x为k的二进制最高位数,第二个数就拿k减去这个数即可。可真是难想…注意:使用pow时返回的是double,因此需要转为int,否则就会有错误。
2030C - A TRUE Battle:题目描述的太bug了有两处地方都没搞懂....题目描述的可不可以清楚点:弄懂题目还是挺简单的。因为与级别大于或。当第一个或最后1个是1时就可以保证胜利,或者当出现两个连续的1时也可以保证胜利。
2031C - Penchick and BBQ Buns:只想到了偶数的情况…当n为奇数时可以发现至少有1个数的次数大于等于3,因此可以构造只有3个数的情况,设x,y,z分别是三个相同数的位置。要求z-x=(z-y)+(y-x)。且这三个数为平方数,勾股定理可知z-x最小为25.所以z最小为26,且n为奇数,所以n<=25时为-1。因此x=1,y=10,z=26。我们想要构造成偶数类似情况:11 22 33…。发现1-10除了1和10正好8个数正好可以相互配对。而10-26中17个数,所以在11-25中找一个数和27配对,发现有好几个数满足相减为平方数题解中选的是11但例如23,13应该都是可以的。
1990B Array Craft:应该是自己写出的第一道1200的构造题。题目中的x>y非常关键决定了本题:让x到y这一段中所有数字都为1。这样至少会有2个1.然后在x的右侧和y的左侧应该尽量分别让这两侧的和接近0,因此接替出现1,-1。这样就能发现满足题目的要求了(虽然不会证明…).
2046A Swap Columns and Find a Path:其实很简单但是我想的太复杂了不过总归是想出来了。可以发现从第一行走到第二行就无法再走回第一行因此很重要的一点就是找到从第一行走到第二行的那一列。花了半个多小时在想这一列应该满足什么条件,首先肯定是上下之和最大,不过如果上下和相等的怎么办?显然这个很玄乎,但是因为只有5000的数据,显然可以枚举每一列,于是就轻松解决了:除了枚举的这列加的是上下两行,其余都一定是加的大的那一行。
1988C Increasing Sequence with Fixed OR:构造差不多能构造但是代码不会写…首先很容易观察当x为1时最长长度是1,否则就是二进制中1的个数n+1.不过注意当为2^k次方时也是只有1个数就是他本身。观察23(10111),从大到小去考虑,因为要最长序列,所以要让数尽可能大。那么第一个数就是他本身,接下来就是10110,10101,10011,00111。可以发现各个位的1分别减少就应该是正确答案。所以要用到lowbit:求出最低位1。到此就可以了。
2036C - Anya and 1100:没想到正确思路....正确思路就是先统计所有1100个数,在每个改变前先统计这个改变的字符的4个字符串是否是1100,有的话就减去。然后再计算改变后的4个。然后就可以得出答案,很弱智的一道题但我就是不会....
2026B - Black Cells:又是一道shi题…n为偶数那么k一定是max((a1,a2),(a3,a4)…(an-1,an))。
奇数的情况我的想法是找到最大的差输出第二大的差但不知道为什么是错的…正确思路是奇数点时
必定会增加一个点,假设是对于ai增加这个点,那么最优情况就是在这个点的左右即+-1,因为n只有5000所以可以枚举每个点对每个点分别+-1利用偶数的方法即可,不过注意的点就是会出现重复情况,如果遇到a[i]==a[i-1]那么直接退出。
1979C-Earning on Bets:算是蒟蒻独立做出的第一个div2的第三题?(虽然花了将近1小时www),这种分数较低的构造题其实就是找切入角度,角度找好了很快就可以解决,前40分钟花了大量时间在想如何构造而忽略了题目给的样例,后面看了一眼第五个样例发现答案是最大公倍数于是很顺利就想到可以用公倍数去构造,数据范围n<=50,k<=20,发现是在long long的范围里面。至于-1的情况只需要把答案和公倍数比大小大于等于就输出-1.这题算是告诫我要仔细看样例啊以后!!!
1948C Arrow Path:又是一道自己独立想出的c!!!,题解说可以用bfs,dfs不懂为什么不会超时,回头再试试,可以观察到第一行的3,5,7…等奇数格永远没有作用,第二行的2,4,6…偶数格永远没有作用,因为n一定是偶数,那么一直走第一行一定会停在奇数格,那么需要第二行最后一个奇数一定是>否则不可能到达目的地。再通过仔细观察可以发现第一行偶数位置i出现<时那么第二行i-1,i+1的位置必须是>相当于要消除这个<的影响。第二行同理,因此只需遍历第一第二行是否是上面的情况就可以了。
1966B - Rectangle Filling:果然构造题角度切入不对根本想不出来1100的构造题对我有种魔咒…正常情况下这个矩形的任何一对对角是颜色相同的那么就是yes,现给出一个不符的情况:左上角W,右上角W,左下角B,右下角B。其他的三种情况都可以由这种情况推导而来,这种情况下只有第一行有一个B那么就能涂成完整的,同理最后一行有白色的也是。那么还有一种特殊情况:第一行全白。第二行全黑,这时候一定不可以涂。再考虑翻转的情况就可以得到:如果第一行全是一个颜色最后一行全是一个颜色且两行颜色不一样就是No,第二种就是第一列和最后一列。
1983B Corner Twist:又是没有找到合适的切入点..先考虑行:设被改变的行的和为x,取模就是xmod3经过+3取模余数就是0,也就是+3取模后改变量为0,但是因为那两个点的和因为取模被改变了,根据取模运算律;(a+b)mod c=(a mod c)+(b mod c),那么就只要比较每行的取模于3的和,如果有不相等的行就不可能划出来,列也是同理。
1991B AND Reconstruction:做了一个小时才做出来…所幸思路和官方题解差不多,利用ai=b(i-1)|bi可构造出来,a1和an还是b1和bn即可。但是如果出现前一个数比后一个数小且是在前一个数的最高位内改变的,那么应该就构造不出来,不过显然这样一个一个判断太复杂,就直接在构造时判断&后是否等于ai即可,说起来挺容易但是想的时候真不容易…
1944B - Equal XOR:这题也是花了差不多1小时…但是这题跟上题明显区别就是这题结论很好找出来:恶心的代码贼多:从1-n有多少个为两个的数字,如果没有说明1-n和n+1-2n是一模一样的排序后直接输出2*k就行。如果有j个这样的数,那么n+1-2n也有j个相同的。剩下的两方都是一样的,由于异或于的性质,优先输出一样的数(可以变成0),再输出双方都有的数。注意:异或于具有结合律:a^b^c=a^c^b,我开始都以为没有…
1980C - Sofia and the Lost Operations:题目思路很好想,唯一注意的这题不能用unordered_map即哈希表不然有恶意数据会导致时间复杂度达到o(n^2),以后的题目就使用map了,这是基于红黑树的有序容器,用法和哈希基本相同。
1935B Informatics in MAC :题目是让我们想办法把数组分成k段使得每段的mex相同。没想到如果多段mex相等那么一定可以合并剩余到最后两段也相等的这个性质…所以可以利用前缀mex,后缀mex维护,枚举每一个可能的点如果前缀mex和后缀mex相等那么就返回即可。前缀mex求法:利用map容器分别统计前后缀先后出现的数。如果m1[mex1[i]]为非0,即目前已经有了mex1[i]这个数字就++,知道m1为0,mex2同理。最后枚举mex1[i]与mex2[i+1]是否相同即可。
1916C - Training Before the Olympiad:想了半天终于想出来了,M想要结果尽可能大,O希望结果尽可能小。我们发现无论如何每次合并的结果都是一个偶数,偶数和奇数合并要剪掉1.那么o应该要让尽可能多的奇数和偶数合并,而m尽可能消去奇数。那么就要对奇数进行操作,如果奇数数0,2那么sum不变,如果为1就减去1.如果为3显然也为1,3是一个分界点,因此3为1组,计算出多少组。然后取模求余数K=0,1,2和前面奇数012是相同的,由于要求每个位置的结果用前缀和维护就可以了。
2051D -Counting Pairs:感觉这种难度刚好适合我,能想到一点思路完整的却想不到…在处理区间问题时[l,r]数值时常用[0,r]-[0,l-1]。这题可以化为Sum-y<=ai+aj<=sum-x。观察可得数对的数量和序列没有关系,那么就可以先进行排序,先枚举每个i值,利用二分求第一个大于等于sum-x-ai的aj值,再求第一个大于sum-y-ai的值,两个相减就是这个i值的情况,最后累加即可。都忘了lower_bound,upper_bound是怎么用的了…