2019寒假训练留坑

会把所有寒假做的题的大致思路写在这上面,看情况上传代码。

 

 

第一周div2普通场:

直接放链接:https://vjudge.net/contest/278635#overview

A:很水,开始看错了题,更正后奇偶分别做一下就行了

B:其实是很明显的bfs,但是直接做肯定超时,所以要剪枝。能想到的并且足够的剪枝就是在遍历走1-k步的时候,如果后面已经有更好的走法,直接break。剩下的就是普通的bfs了

C:原题&&水题,不谈(还是WA了两发。。太粗心了)

D:还是想了一会才做出来。其实做法也是类似的,0标成-1,1就是1,求前缀和,如果两个点的数值相等,那么他们之间的就是平衡串。用map方便标记并且自动排序,写起来还是很好写的。

E:这题也挺水的,直接做就可以了。求出最少需要的改变次数自然很简单,几个没出现过(或者几个出现的多了&&多了多少)就是需要改变几次。剩下的直接贪心就可以了,好久没写代码代码能力下降很多。。写了比较久。

F:开始以为是个规律题,想了一会好像直接一遍dfs就解决了,思路很好想,不过要找一个概率的规律才能把dfs写出来。(其实就是变形一下古典概型的公式)

G:这个题没想出来怎么做。。。看别的的博客写出来的。居然是个dp,我还是太菜了。dp还是那句,想到了就变得特别简单。

首先二维数组ans[i][j]就是表示答案的。当字符是i最多改j个时候的答案。

更新如下,还是挺好理解的

	rep(k, 0, 25){
		rep(i, 0, n - 1){
			int cnt = 0;
			rep(j, i, n - 1){
				if(s[j] - 'a' != k) cnt++;
				ans[k][cnt] = max(ans[k][cnt], j - i + 1);
			}
		}
	}
	rep(j, 0, 25){
		rep(i, 1, n){
			ans[j][i] = max(ans[j][i], ans[j][i-1]);
		}
	}

第一周div2算法场

链接:https://vjudge.net/contest/278653#overview

A:原题&&裸的RMQ,套个板子就过了

B:原题&&一点思维难度的RMQ,加了个数组就过了

C:原题&&单调栈,转换思路成求每个牛被看多少次,就是个模拟题了

D:原题&&稍微巧妙的树状数组的用法,

主要就是回忆一下吧。。没啥训练作用

 

第二周由于参加Camp, 咕了

 

第三周div2:https://vjudge.net/contest/281519#overview

A:一个代码题,贪心很容易想到,主要就是模拟的过程不是那么好写

B:找一下规律就很好做了。求出子树大小,就能知道一条边会被计算多少次,加起来,询问的时候再减就可以了

C:不会,待补

D:以前做过一个类似的,是个用优先队列模拟算最大时间的题(ZOJ1200)。这个题开三个队列(是不是优先队列没关系,因为一定会按照从小到大的顺序来往里面放),分别维护三种工具元素进去的时间,因为在一个工具里面做完了要立马传到下一个,所以要保证能一直做下去(就是出来了之后下一个工具有空位)才能往里面加。当然,元素个数不能大于工具的个数,然后就是个模拟题了。

E:据tw说是个后缀自动机,还白瞎我想了一个小时。

F:两个人加起来被p个人怀疑,要求可能的对数。推了一会推出个式子。对于一对u, v来说,cnt[u] +cnt[v] - mp[(u, v)]就是他们加起来的被怀疑的次数,但是直接做是n^2logn的,其实很容易想到排个序,然后双指针可以O(n)得到未去重的答案。(未去重也就是没有减mp[(u, v)])。那么如何去重呢?其实也很简单,直接遍历map,如果两个加起来大于p并且加起来减去mp[(u, v)]之后又小于p了,说明他对后面的答案产生了多余的贡献,ans--即可。

G:WA了三发之后找到了程序的弱点,但是没有新的思路了,待补。

 

第四周div2普通场:

A:错排公式裸题;

B:算是个思维题吧,相当于进制转换;

C:把距离压进去,排个序,是个水题;

D:把思路顺序捋清楚了就是个代码题了,因为一个沙雕操作MLE了几发;

E:判一下方向瞎搞一下就行了

F:枚举是n^2的肯定不行,百度了题解看到dp两个字就明白了:从下往上dp,维护最大值就直接推出来了(太菜了没想到DP)

G:这应该算是个贪心的代码题吧。先看加减号的个数,那么不可能的情况就很好判了,可能的情况下就贪心做,先把较多的那一种设为1,然后用较小的来填,使他们相等,再在较多的加上n就行了。(这样写好像有点挫?)

 

第五周div2普通场:

A:字符串构造题,找规律+一些特判就行了;

B:首先先找出从s[1][1]延伸最大的x,记录下来为ans。如果check成功就直接输出了。否则check这个ans和n的所有公约数,找个最大的check成功的输出。

加一点经验:加了关闭同步的情况下,getchar()也不能用了,上次是发现puts()不能用。现在积累下来的经验就是加了关闭同步之后,最好所有的东西都用c++里面的。

 

 

2018 CCPC-Wannafly Winter Camp(随机补题,不分先后)

Day4 G 置置置换:用dp[i][j]表示1-i的排列在1-i的位置中填好了,最后一个数是j,那么答案就是sigma(dp[n][i]) i : 1->n。考虑转移,转移的时候枚举第i+1个位置放k,显然除非这放i+1否则都会冲突,解决方法是把前面所有的大于k的数都加一,大小关系也不会改变。

所以转移方程是:if(i & 1) dp[i][j] = sigma(dp[i-1][k]) k:1 ->j-1

else dp[i][j] = sigma(dp[i-1][k]) k: j->i-1

然而n^3是做不了的,其实枚举k的这一段可以简化,变成:

rep(i, 2, n){
	if(i & 1){
		rep(j, 1, i) dp[i][j] = (dp[i][j-1] + dp[i-1][j-1]) % mod;
	}
	else {
		Rep(j, i, 1) dp[i][j] = (dp[i][j+1] + dp[i-1][j]) % mod;
	}
}

 

//+DP专题https://blog.csdn.net/swunHJ/article/details/86708277

 

CF CodeCraft-19 and Codeforces Round #537 (Div. 2) :

B:开始觉得是贪心,能删就删,删到一个就开始加。后来发现错了。然后直接排序后枚举删的位置,其他的加上就好了(因为删肯定删小的,这样枚举肯定包含所有情况,里面的道理懒得想了)

update:贪心错误的原因:感觉贪的有点蠢了。。比如3 3 3 这种全是一样的,肯定不能“能删就删”啊。。

C:开始觉得是个DP?想了一会还是个dfs,也没啥好说的。

 

 

CF Codeforces Round #539 (Div. 2)

A:水题

B:直接暴力枚举就行了,因为沙雕WA了一发。

C:小记录一下心路历程:开始搞错了VP的div1...这是个div1的A题,思路倒是出来的很快,求个异或前缀搞一下,但是我开始看standing jxf6min就出了A,当时我都敲了20+min了,于是陷入了深深的自我怀疑。准备重新看题看是不是理解错了题意,发现了我VP的是div1。后来VPdiv2的时候重新看了一遍题傻逼了几发就过了。其实这题是老套路了,对于一个l, r(奇偶性相同,因为要保证区间长度为偶数),如果异或前缀和相同,说明l+1到r肯定是满足条件的。贡献为1。然后就简单了。

D:这题做的时候是猜的,要么1步或者2步完成,要么完成不了。1步和完成不了很好做,一个枚举,一个判断一半的子串是不是都相等,那剩下的就是两步的了。

后来证明一下这个东西: 先说显然有一种情况不可以:半边的子串都是一样的。

那么除开这种情况,对于一个回文串肯定能组合成另一个回文串(先不管多少次),所以上面那种情况是唯一一种不可能的情况。

长度为奇数的情况:一次肯定不行,2次肯定可以

偶数的情况:一次可能可以,枚举即可。两次肯定可以,不太好证明,但是是比较容易想出来的。

over(好像说了一堆废话)

这场比赛还是挺顺利的,但是太晚了要打到3点就没打。还有两场div2一场div3能不能涨到1700呢呜呜呜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值