之前写了个退役文章记录想记录下,但是没有干货,还是给删了,所以前面的是退役小记,后面是我个人写近2年所有区域赛场次记录的题型
目录
退役小记(没兴趣可以不看)
这里简单记下我的acm生涯
省赛和三场区域赛
为什么能有点成绩
近年区域赛总结
总:
经验:
突破口:
错的经验:
以后:
题型:
思维题:
构造题:
概率题:
退役小记(没兴趣可以不看)
本人大学是接近一本线的二本大学,目前能打的区域赛场基本打完了,桂林rank105和沈阳rank140是有两个区域赛铜。
这里简单记下我的acm生涯
其实我一直觉得对于我们这种弱校,虽然打acm,但是不一定算是合格的acm选手,因为如果每场每个学校多1个名额,对我们弱校就是灭顶之灾。21年的icpc就是我校学长基本全军覆没,我们也是在22年icpc名额大减的背景下勉强2铜
我本人打acm挺晚的,是大一下4月开始正式学算法,开始去学第一个算法前缀和,当然这不代表我校acm经验和训练强度不够,相反这些都是很不错的。当时有军训,身体也好,又有暑假集训,还没有学长0收货的消息,所以我到暑假假期结束时,基本学的算法就跟上了
然后大二上开学,学长说要打10场看总成绩去踢人,我们这届最强的2个只参加了一半的场(也就是后面我俩队友),我勉强比第二高一点。后面是昆明选拔组队名额,应该是我开翻译的原因,两场成绩是第一,那之后再也没有单人周赛了。当年给我来acm机会学长说的是,超过我的一个队友才允许我加入,虽然应该是希望我更有追求,但是至今我也不知道算不算超过
后面就是我们三个组队暑假集训,生活过的挺惬意,但是牛客多校越打越烂,来了后也是有点勉强超过我们这边的二队,算我们这边的一队,打区域赛的机会才多些。
省赛和三场区域赛
省赛我们是正式第4名,前面我们做的挺顺的,只是最后的时候有一个线段树的题,还有一个大模拟。我们做的是大模拟,虽然那个线段树是我们有大概的思路,但就那题的难度来说也不过是冰山一角。
桂林场是我比较快的A第四题,实际这题应该没多难,然后队友A了第三题,时间比较快,算是有了一个铜,这个可能是最简单的场了
沈阳第二题过的慢,第三题发现就是类似于模拟的东西,这题出了后,实际上到最后还是没有。于是有大量的时间去看第4题,一屏幕放的都是暴力出来的规律,最后出了思路变成了求一个公式,队友会O(n)的写法,WA了几发,调到最后7分钟过了
第三场绵阳,以为会是简单的,结果难度和广州差不多。第3题那个构造开始想的是简单图形,横着的直线也想了,后面想的很麻烦,然后浪费了巨多时间,结果答案是可以斜着直线就行。第4题出了时间也不行了。其实第3题哪怕想一下斜线,这场50%的概率还是有的,没有我们也没有太难受,2个已经是很难得了
为什么能有点成绩
其实最重要的原因是一个队友解中等难度题的能力暴增,使得桂林和沈阳都是中等题翻身,绵阳也是他是主力,其次就是今年acm的icpc名额缩减,ccpc扎堆严重(我们分别打了简单和难的场)
我之前的时候很喜欢看别人退役文章或者自己的acm故事,希望有天和那些学长一样强。那时候最崇拜的就是计科大佬和acm大佬,后面我转专业和打acm,也算是有了这两个身份
近年区域赛总结
主要就是2020年,2021年icpc和ccpc大多场次的银之前的题的题型,可以自己看下区域赛常考的的题的类型,当然自己也可以总结下22年的题型。
一、22年昆明(牛客,ICPC)
https://ac.nowcoder.com/acm/contest/32708
K: 第一题是精度的问题,完成速度0.4,long long和double应该就行了,尽量先乘后除
类型:精度
D: 构造题,几乎不会有不行的情况,往往是2幂数的和或者多乘数的和。
类型:构造(*)
F: 公式化简就是(a*a)/4,a是树链最大的平均值,树链长度最小为2。所以树链的长度一定<=3,树形DP求最大值最小值即可
类型:思维+树形DP(*)
---
G:在最前的概率是f[i],无限次移动后一次的移动期望。两两比较,
类型:概率期望(银)
二、22年澳门(牛客,ICPC)
https://ac.nowcoder.com/acm/contest/31454
A: 思维题,不难想到一条路或者反过来一定可以的,但是细节怎么就那么差呢?一直WA,1是没有初始化,2是没有严格按照题意
类型:思维题
L: dfs搜索题,能想到前面的优先,样例又是看不懂,明白后通过并查集和dfs实现了这个功能,有段错误
类型:dfs+并查集(但毕竟是签到题)
F: 数学题,需要想到一定的结果,然后去用优先队列找最大的处理,也就是只需要动n次,多的无效
类型:数学题(*)
三、2020南京(牛客,ICPC)(这场*)
https://ac.nowcoder.com/acm/contest/10272
K: 构造题,也是签到的,大概能想到,多写一定没错的
类型:构造
L: 思维题,坐标多点取中间值。要想到只是中间的就是答案,实现起来麻烦点,回头看下题解,一定有更好的办法,细枝末节什么的
类型:思维题
E: 构造题,想全情况很重要,慢点也是死。别把思维惯性化,有点东西是错的还是直接用。
类型: 构造题
F: 三分概率最优点前n项和,尽量别单独优化,WAT3发,就想方法吧,等比等差前n项和能不能记住?double long什么的还是别了
类型:概率题(*)
M: 树形背包DP,难度算练后的0.7,卡时间这个太难了,也许是之前没了解过这个枚举的模板,至少是纯的算法题目,有的话尽量不浪费队友时间去手推。
类型:树形背包DP(银)
四、20年上海(牛客,ICPC)(这场学长*)
https://ac.nowcoder.com/acm/contest/9925
F: 计数题思维题,毕竟是签到的
类型:思维
M: 思维,类似字典树,实际可以通过前缀下标标记,太难了
类型:思维,字典树思想(可能用不上)
B: 思维题,扫雷那题,核心是反过来数值和是不变的,然后就是一半,正着不行反着行的思路。
类型:思维
D: 0-n的一维坐标,两点公共走完所有要的最少时间。一是思路,其实还行,二是返回max(a的时间,b的时间),精度不一定是类型,公式,还有过程运算。三是很多符号,名字尽量别搞一样的。
类型:思维题(*)
---
C:好像是一个二维的数位DP,加上公式的小化简,log2(a)(下取整)+1就是二进制最前后一个1的位置(依对数位DP说)
类型:数位DP(金)
五、19年南京(vj,ICPC)
https://vjudge.d0j1a1701.cc/contest/478696#problem/K
A: 规律题,所有字串有一个因数对,答案是(n+1)/2+1,还是浪费了一点时间。
类型:规律题
C: 动态规划,二维数组,求递增长路径数量。答案不是pow(2,n),dfs过于麻烦,只能是动态规划了,依据特别的题意来分析代码细节。
类型:二维数组动态规划
H: 思维题,a个支持,b个反对,c个中立。看起来很不好的一题,如果题意能再确定下,最后的答案一定是很合理的,想到的尽量都用上。可以试着记录一些答案
这题如果真有,肯定能过,主要还是K题。两个算法题才是关键。
类型:思维题
K: 计算几何,一个三角形分为面试相同两部分,大致能写出来,就是WA,应该是细节或者某些情况。
类型:计算几何(*)
J: 一个用的不多的算法,KM算法,记录下好了
类型:KM算法(银,图论二分图匹配中的)
六、20年澳门(vj,ICPC)
https://vjudge.d0j1a1701.cc/contest/500784#rank
L: 概率的题,a数组随机1/n,p数组全排列,pi<ai的数学期望。题意似乎是最难的,答案不难,**打印为那个<1e-9是前9位一样即可**
类型:概率题
D: 模拟题,ATK,ATK暴击率....,公式计算结果。最重要的是题意要看懂,细节的问题,然后就是非常**简单的模拟公式**。
类型:简单模拟
F: 构造题,n点连接d点c个联通块的构造。思路还是比较简单的,实现起来是不是太奇怪了,也算模拟题了
类型:构造+模拟
A: 概率题,分治+NTT。an(an-1*(....(a1v+a1)+a2...)+an-1)+an。公式无法继续化简。是用算法分治+NTT。
类型:分治+FFT。(*)
G: 难的的正常点的题,博弈+思维。只能向后面二进制位数相差不超过1的数走。**只记录最后数的位置,前面的一定是可以赢**,后面的255次博弈判断。每次可以用sort排出q数组。
类型:博弈+思维(*)
八、21年威海(CCPC)(rank86软件*)
https://vjudge.d0j1a1701.cc/contest/501844#overview
A: 给一个树问多少顶点为树根,他是个二叉树。输入不低于2e6用read输入。
类型:简单树题
J: 边角型的题,在一个圆中反弹多次,最少多少次回到原点。核心是相对于原点是不停+a/b度的。
类型:图形度数计算
D: 简单哈希匹配,第i个变成#,求前缀中和后缀中相等的数量,和字符串的循环没有关系。
类型: 字符串哈希(二分哈希可能卡时间)
G: read也许重要,会有卡时间的,模板也要时间好点。n个数分给k个有多少分法。限制是sum(a[i])<1e5,那么不一样的数量最多就是sqrt(1e5),是这题的核心。
类型:组合数+思维(*)
H: 一个树选n点使用一定权值,每个点最近得到p个都选了可以得到v[p]。图论的题还是要学的。
类型:网络流->最小割(*)
M: 长度为n的01串m个1,1的最大连续是k。求出大于等于k的种类数,剪去大于等于k-1的种类数就是答案。具体求是利用插空法,将n+1(m+(n-m+1))个1摆放在一起,让n-m个挡板去插空,最后利用容斥减去多出的情况。
**特殊判断错了**,res要+1错了
类型:容斥+组合数
九、21年桂林站(CCPC)(rank187学长)
https://vjudge.d0j1a1701.cc/contest/502492#overview
A: 打比赛第x天前输,后赢,赢n+1可以赢。结果就是2*x-1,注意long long,确实注意了但没看到2*1e9。
类型:简单签到
I: 01串,1可以匹配前面一个0或者1,权值+上1的位置最大。从后往前遍历,有的+起来,有1就用了。
类型:简单签到
G: 01串中的1一个个蔓延,花费的最少时间。可以二分的,状态有点多,dp也是可以,有点麻烦和浪费时间,区域赛是有二分题的。
类型:二分(主)、动态规划
E: 一个买边,一个卖边,每轮卖的不能成环,卖完最少的轮数。有边就是1,有环就是2,没边是0。用堆优化的dijkstra算法找出最小环。
类型:图论:堆优化的dijkstra算法求最小环(*)
D: 一个1-n数组可以再前大后小的时候交换,能不能到的另一个b数组。cf的思维题,思路就是从最小的开始往前走,挨个判断比当前数大的位置是否合适,合适就交换。
类型:cf思维题(*)
21年沈阳(ICPC)
https://ac.nowcoder.com/acm/contest/36975#description
E: 简单签到。看一个字符串中有多少“edgnb”。注意后面的访问下标别超
类型:简单签到
F: 给一个字符串,字母映射为最后的该字符后的不同字母数量,找最大前缀。注意数据范围,可sort排序暴力,一是题意,二是实现要快点。
类型:简单字符串
B:**这题也许卡了很多,最重要的是1-n的图不一定都是连接的**。给一些边表示两顶点权的异或,求最小的和。利用异或的性质,求出所有点对于联通图某点的异或值,再利用每位1和0的数量来选择该点的答案,最后加起来。
类型:**理解题意**(二进制异或+思维,带权并查集(*))
J: 4位锁翻转到另一个锁。首先要会将差数组转为全0最少步骤数,就是洛谷把题,实际自己搞单调栈应该也可以。然后2^4或者3^4枚举数组判断结果
类型:**理解题意**(数组单调栈(局部),bfs(*))
H: 给定一个无向带权图,将其所有的 边看作点,点看作边 构建出新图也是一个无向带权图(两点之间的边权为这两点的权值(原边权)相加),求这个新图上的最大独立边集 —— 选取所有 不相邻 的边构成的集合保证权值累加 Max。
类型:并查集(*)
L: 一个完全图,给一个树让完全图减去,有多少种最大匹配。图论问题。
类型:树形DP+容斥(题意涉及二分图最大匹配)(银)
M:求后缀最大的字典序
类型:后缀树(字符串算法)(银)
21年哈尔滨(CCPC)(软件两队rank230+差不少)
https://vjudge.d0j1a1701.cc/contest/502821#overview
J: 二维数组预处理最小行和最小列,找<=该行该列的元素个数。
类型:简单签到
B: 一个数组,两个数和等于某个数可以组一队,问租多少队。
类型:简单枚举判断
E: 2^(i-1)对一个数取余,能不能是某个数组。这个数一定是不是1,2,3,8,16...第一个数和后面的数中的一个,注意细节,过程尽量按照过程来写。
类型:思维
I: 每次可以删除1,2,4,8...,下标可以是同一个数。将所有数分为1,2,4,8,16,32....的数量,后者可以换成2个前者,那么可以while(1)不停的换,也可以二分来换,同样有(a-b-1)/3的细节问题。
类型:**理解题意**(二进制)(*)
D: 两个正整数同时删除一些相同的数,问能不能之间的比不变,且变化后最小。纯暴力搜索题目,枚举2^18种情况,根据题意进行判断,利用x/gcd(x,y)和y/gcd(x,y)两个数大大降低时间复杂度。题意是删除一些同样的数位,还有顺序要考虑
类型:纯暴力判断(*)
---
G: n点m边,有的点有自行车,自行车有损坏的概率,从1到n最小时间。
类型:状态DP、最短路(银)
21年广州站(CCPC)
https://vjudge.d0j1a1701.cc/contest/494718#overview
**这场不是正常场,北大出题**
I: 1-n的全排列,前i项和都要被i整除,问多少种排列
答案是3*qpow(2,n-2),这样以后也可以试试最后的答案
类型:排列数量
H: 给a,b,c,找x%y==a,y%z==b,z%x==c的x,y,z。对的思路大概是x=w*a...找一个合适的W,会接近1e18,也就是进一步理解这个式子
类型:思维题
C: 给一个圆形的项链点,分成m块,每块一个项链点。首先二分答案,思路就是往右边为最优,然后计算左边最多能省出多少个,这个很难实现,题解不多。
类型:二分(*)(不简单)
21年上海(牛客,ICPC)(学长rank229差一点)
https://ac.nowcoder.com/acm/contest/24872#description(牛客)
https://vjudge.d0j1a1701.cc/contest/503555#overview(vj)
E: 给一个数组和,选一些数要求所有的数差<=k。贪心从小到大选,只是第一个一定是最小的,减1e9的话可能会超定义的值
类型:简单贪心
D: 给p,q,找出a,b使得a/b+b/a=p/q。使k=a/b,变数变为一个,a和b为整数,那么k不能有根号,最后输出k的比值即可
类型:数学
G: 一个树,每队拥有两个同顶点的边,多少种组队方法。首先考虑两层的树,得出同根树数量的数组。如果子树数量为奇,那么一定往上面借一个,下面是(a+1)/2。
类型:思维
I: 点数和权值,点数可以乘2,后找出两队点数和相等,使总权值和最大。
类型:背包DP
H: 给双边图,1e5次询问某点某权值开始,权值大于边可走,每走一点加权值,能走多少权值。首先考虑最小生成树,图则将完全变为树,然后是这个重构树。
类型:图论的重构树(*)(但是有点偏模板)
偏的算法总是不难,却有点偏
21年济南(ICPC,牛客,应该是这场,290+)
K: 树中等概率有一点,到达该点花费时间期望。自己做法好像有点麻烦了,好像是欧拉序。只要是深搜答案都是一样的
类型:DFS,欧拉遍历
C: 数组两人选数,多少种全排列选法使最后结果仍是最优。答案是数组转化统计数组,累成q[i]!*C(q[i]/2+sum,q[i]/2),sum是从大到小取,前面小的数量。
类型:组合数学(*)
D: 对一个数组拟合等差数列,求最小的绝对值差和。三分枚举等差d,然后利用货仓选址模型O(n)时间求出中位数,总时间复杂度O(2*log3(n)*n)。然后还卡了__int128。
类型:三分(银)
21年南京站,收尾的那场(ICPC)(靳300)
https://vjudge.d0j1a1701.cc/contest/494747#problem/H
A: 矩形每个点都有,整体移动使全部在指定点,需要找到最近角点。
类型:简单构造
M: 一个数组,可以前点-后点,结果插入该相邻的前点位置(1和n也算相邻)。可以直接算答案的,确实不好整,思维+样例+答案,最好一思维为主
类型:cf思维、数组
C: 给一个数组,区间加上指定值,求同种的最多多少个。问题拆分
比如:0 1 0 1 0 1 1,翻转一个区间,使1最多,需要找出0数量比1最多的区间,sum1+**结果**就是最多种类数
**怎么找这个结果呢**,1 -1 1 -1 1 -1 -1,动态规划最大和区间,或者前缀和最大减最小。
后者有点麻烦,需要储存遍历+很多优化,但是可以过
前者只需记录最大的前缀和即可,每次直接+sum1进行更新
还有一个核心就是:2只影响了2和2+k两个数
类型:数组(问题拆分->简单动态规划最大区域和)
H: 以后可做
类型:树形DP(*)
七、20年秦皇岛(一)(vj,CCPC)(344)(题号有误)
https://vjudge.d0j1a1701.cc/contest/467417#rank
A: 简单签到题。a白b黑选2全白。利用**组合数C**的运算,化简即可。
类型:简单数学
F: 正整数x是好的当且仅当可以整除(int)pow(x,1/m)。还是很正常的题,最重要的是**理解过程**,考虑到时间复杂度。
类型:统计题+局部前缀和(一个区间中被x整除的数量)
E: 思维题吧。n点m边选若干个点,按规律算最大权值。一个连通块肯定全选,if+max(0,(res/2-ans))
类型:思维+dfs搜索
K: 树形DP。可以从1出发多个,问走完最少花费时间。树形DP解法。dp[d][0]表示不返回,dp[d][1]表示返回的
```
if(dp[son][0]+h[d]+1<dp[son][1]+2){
dp[d][0]=max(dp[d][0],h[d]);
}else{
dp[d][0]=max(dp[d][0],dp[son][1]-dp[son][0]+1);
}
dp[d][1]+=min(dp[son][0]+h[d]+1,dp[son][1]+2);
dp[d][0]=(dp[d][1]-dp[d][0]);
```
类型:树形DP(*)
D: 思维题,每个人高分或者低分,不低于最高分*(m/100)的人数最多。最高为最高分时,其他都要最高,排序查找答案即可,细节很容易错。
类型:思维(*)
20威海(二)(CCPC)(勉强有**)(南京大学)(384)
https://vjudge.d0j1a1701.cc/contest/511210#problem/C
A: 两边背老人过桥。考虑在左边和在右边开始第二次。确实不好想,但可以出
类型:思维(不好想)
H: 群聊发消息查询接受数量。利用vector数组,思维删除是添加一个删除点。或者直接逆着跑
类型:思维
D: 一个数和的形式分为两个数,判断有无三个数最大公因数<该数。打表可以发现是整除平方数,前1e12%判断,后1e6相除判断。(错在判断平方数用了下标)
类型:思维
L: 一个数按和拆为若干个个非0数,求最大公倍数最大。一个是思维来,但是不行,还有就是背包。将问题转为选2的幂数,3的幂数,4的幂数....求最大,然后01背包,时间是可以的,只是空间必须优化为一维。
类型:背包(*,出了就有)
C: 给三堆点,求三堆点的距离的期望。按贡献思维,树形DP找到每个边共享的距离(数量*边权),而且最终距离=(dis(a,b)+dis(a,c)+dis(b,c))/2;,应该是按边算,所以重点不会计算其中,但是最后除的时候好像没有
类型:树形DP(银)
20年长春(CCPC)(上海交通大学)(321)
https://vjudge.d0j1a1701.cc/contest/511432
A: 若干个商品,买后可以有一定的返还。
类型:01背包
D: 0-i-1和i进行^的最大值为dp[i],求前n项和。先打表看规律,后思维判断多少,二进制中1的个数
类型: 打表+思维(快的话*)
F: 求一个树中两结点^等于lca的时,编号的^和。按照异或和=多位按位异或后的和
101 ^ 011=100 ^ 000+00 ^ 10+1 ^ 1=100+10+0=110
类型: 思维+二进制+启发式合并(银)
A、D需要再快40分钟,这个启发式算偏算法。
20年绵阳(CCPC)(电子科技大学)(309)
https://vjudge.d0j1a1701.cc/contest/512685#overview
D: 一个数组,让一个加1,然后全部减1,求执行次数。二分答案,想到二分后挺简单的。
类型:二分
K:一个数分为多个不互质的数字,使最大和最小的差最小。
类型:打表找规律
J: 多个周期填表,找出这些点中最大的值。从大到小,然后使用next[i]的优化,加上重复的跳过的优化。1400/2000的时间过
类型:思维+优化(不少人是线段树做法)
G: 博弈,暴力答案找规律。暴力代码和最终代码进行拟合可以找出细节。
类型:博弈打表+规律
J题过了基本就有,时间还是比较充足的。
19年CCPC哈尔滨
https://vjudge.net/contest/520664#problem/I
J:找两个质数和为指定的数,没有输出-1。一个为2或者3
类型: 简单思维
K:每次加1,越多给的越多,求最后有多少的数学期望。总*(开始的权值)
类型: 简答思维
F: 6个字符串中,每个字符串出一个字符,能不能组成“harbin”。暴力搜索所有情况。
类型: 暴力
I: 给一个前缀高度差数组,找出有多少种排列满足。思考底端相加。
类型: 计数DP(*)
I题的时间
20年济南(ICPC)、
https://ac.nowcoder.com/acm/contest/10662
前面四题不是很难,只是读题意还是不太好
类型:思维题(*)
A:给两个矩阵a,b,求a*c=b.c的c的种类数
类型:高斯消元(银)
总:
经验:
ICPC按沈阳(只能是快A靠时间),上海(偏算法没学过真没办法),南京(前3的很容易被卡,第4是树形DP)准备
CCPC按桂林(图论解决后时间,Acf思维题),威海(读题,<1e5,A二分图),哈尔滨(场次简单没有特殊算法)准备
突破口:
1.二分答案,特别是对于max
2.答案很仅有,0,1,2不多
3.莫队,多区间查询
4.也许所有情况
5.进行排序,用多样例找合适的排序方式,或者2,3个属性去看。(特别是DP)
错的经验:
1.如果输入和输出的数据>5*105,直接用scanf,printf,某处时间多了也要节省,超过2e6的数据最好用read(n)。
2.输出的格式
3.某处的细节,三分概率的float,初始化的v,+m加上的n
4.如果n为2000左右,数组可能会有2000*2000的长度,平时就开1e6
5.打印多了可以试试cout<<'\n';
6.遍历1-n的图,很多点可能没有连接到,不要从1开始遍历。
7.memset不能用给double数组
8._ _int128还是要注意
9.#define double long double,当数大且需要double时,尽量必须加上
10.T的时候换换编译器,也许有用
**11、图论可能有重边和自环(6->6)**
12. if((ans^x[j])>ans) ans^=x[j],dp[now][j]=x[j]; 该遍历的和if放在了一起
以后:
CCPC:
图论的经典题直接思路+代码打印*(dij堆优化最小环)
ICPC:
构造题
题型:
思维题:
1.正着不行反着就行(二维数组走上升,扫雷数和的题)
2.题意也许不清,但最后一定是所有情况考虑上的
3.动态维护最后出现的位置(cf交互二分那题,向后面二进制位数相差不超过1的数的题)
构造题:
一类是能不能找到一种方法,数量是没有限制或者不重要的,UDRL两点到达那题,n点连接d点c个联通块的构造。
二类是数量有限制,之中限制的是不是基本没什么用,每块的数量是直接被确定的了,red那题和上升和下降数组。
1.分解为若干小的数相乘,类似于进制分解,很重要,可以说是必须的。
概率题:
期望核心:概率乘以期望,类似动态规划
期望也可看期望贡献
1.三分二分
2.累加和公式
3.设结果为x,求解方程
4.根据题意写过程(精度细节)