Team ***** 训练记录

Team members

BiuBiuBiu
Walker
Forever_Cloud

To Do List


Team 每天一场模拟赛,下午补题写题解
BiuBiuBiu 刷题刷题刷题刷更多的题数据结构字符串DP还有不需要什么算法的思维题以及代码比较难实现的模拟题,31号之前刷15个线段树不裸的题。
Walker 31号以前连通图,生成树,最小生成树都完成,然后9月10号前,dfs序,lca,树上dp完成,后边待续。
Forever_Cloud 数学、博弈该弄明白的都弄明白 公式多推多见


Caution


博弈题或者数学题遇事不决上来先打表
输出字符大小写检验
题意必须完全读懂再上去写代码
其他人有思路的代码ffx完成代码后应该让有思路的那个人检查


Contest




20162017-acmicpc-neerc-central-subregional-contest
A Fried Fish (签到) 84 / 304
B Hanoi tower (推公式) 12 / 48(赛后过掉)
C Desktop (构造) 16 / 71 (赛后过掉)
D Weather Station (签到) 66 / 104
E Cupcakes (推公式) 24 / 99
F Vitamins (并查集暴力) 12 / 47(赛后过掉)
G Sphenic numbers(签到) 82 / 270
H Non-random numbers(脑洞题) 69 / 100
I Land Division 4 / 19
J Architect of Your Own Fortune(二分图) 31 / 67
K Polymorphic code 0/0

过程:开局由于ffx不知道cf需要文件读入wa1很久,后来发现了交了A,又wa了,有个小细节没改改了就过了
这个时候ffx也码完了DG,G交上去1A了,Dwa3,wk看代码发现少个细节,加了就过了,这个时候sbw说了一下h的题意,ffx发现大于10直接加0,于是写了个暴力0-9就1A了,这个时候sbw推出了B的公式(但是后来发现是错的),由于需要高精度,ffx掏出java写完发现不会文件读入,这个时候wk发现J是个很sb的二分图,于是ffx建图,wk写了个二分图就合力把J过了,之后全体看E,ffx猜了一下需要分成两股力量去讨论,然后wk和sbw分别推出做法,由于ffx数学sb就去看c了,wk上机敲了一下wa1,后来发现是(yes大小写的问题,不然是wa12),最后ffx敲了sbw的思路,wa3了,后来发现是有个小地方着急写错了,改了就过了,于是这场就结束了。
题解
ADGH:sb题
B:需要理解题意是要在完整的汉诺塔移动过程中寻找3柱数目相等的第一个状态,然后理解一下汉诺塔移动的规则,分奇偶看一下发现在偶数的时候第一个相等的状态是先移动(2/3)*n-1片到一个柱子B上,然后移动第2/3*n片到C柱,接着把B柱上面的1/3*n-1片移动过去就可以了,奇数的时候第一个相等的状态是先移动(2/3)*n-1片到B柱子上,然后移动第2/3*n片到C柱,然后将B柱最上方的(1/3)n片移动到C柱上(这里需要都多移动一个棋子,因为所求是在移动整个汉诺塔的过程中出现各柱相同的情况。举例子总共有9片,当移动完前5片在b柱上之后,将第六片移动到c柱,此时移动b柱上的片,正常情况下不会出现1,2片出现在c柱的情况,而是1,2片在a柱上,3在c柱上,所以必须移动b柱上的1,2,3个片才会出现2,3片在c柱上,1片在b柱上,此时各个柱子都是有3个)
https://paste.ubuntu.com/p/f2fdqZNQRP/
C:分奇偶情况讨论,将奇数情况转化为偶数情况,这类题都要想出一个肯定正确的状态,然后把不确定的状态转换为这个肯定正确的状态
https://paste.ubuntu.com/p/SXqVdhTZKT/
E:一个类似博弈的推公式,分别计算每一段必胜态存在区间的最小值和最大值,然后判断给定的蛋糕数是不是在段必胜态之间即可
https://paste.ubuntu.com/p/ctqxgFbB5M/
F:并查集加暴力枚举;因为只有1000个点可以用n^2的算法过题。因为会有=号的存在,所以会有一种情况1>2,3>4,2=3.这种情况下,必须要将2,3合并在一起才能知道所有点的关系。而将所有同层次的点连接在一起的一个方法就是并查集,所以首先扫描所有的边将=号相连的两个点放入并查集中,然后再扫描一遍所有边,将此边连接在两个端点的祖先节点上,这样就能将分散的边集中在一起。然后扫描一遍所有点,将有父节点,且有根节点的点的祖先节点的等级标记为1,然后将儿子节点的祖先节点等级标记为2,同理父亲为0.最后再扫描一边所有点,看本店的祖先节点的等级是什么,然后由等级输出wrs,0对应w。
https://paste.ubuntu.com/p/mpqW59jMkR/
J:一个裸的二分图,首先将所有车票记录下来,然后A车票的前三位记录为num1[i][0],后三位为num1[i][1],T车票同样记录下来,然后n^2扫点,如果a车票的前三位等于t车票的后三位,t车票的前三位等于a车票的后三位,这样就将i向j连边,这样图建好后,跑一边匈牙利算法,就能得到最大匹配,然后根据linker[v](t车票跟哪个a车票相连),输出相应的两个车票序号。
https://paste.ubuntu.com/p/ZShYwk7zSC/




ICPC2016大连
A UVALive 7723 Wrestling Match(带权并查集) 325 / 1045
B UVALive 7724 Regular Number(shift-and算法) 34 / 296(赛后过掉)
C UVALive 7725 Game of Taking Stones(java二分) 65 / 328(赛后过掉)
D UVALive 7726 A Simple Math Problem(推公式) 363 / 1339
E UVALive 7727 Aninteresting game(树状数组原理考察) 51 / 196(赛后过掉)
F UVALive 7728 Detachment (推公式) * 242 / 878 *
G UVALive 7729 Garden of Eden(点分治) * 82 / 304*(赛后过掉)
H UVALive 7730 To begin or not to begin(签到) 487 / 739
I UVALive 7731 Convex(签到)**483 / 653**
J UVALive 7732 Find Small A(签到) 479 / 952
K UVALive 7733 Guess the number 31 / 117
过程:这场打的很坎坷,因为前期A了HI之后一直卡在J题,由于想投机取巧导致位运算出错,卡了特别久之后才过掉,过一会wk和ffx推出了D的正解,但是一直wa,后来试了一下交换两个数的输出顺序,就过了,感觉现场赛应该会说明这点,题面真的没有说!之后wk发现A是一个并查集,于是上机敲,ffx和sbw搞F,sbw发现可以转换为一段一段的操作来做,于是两个人分别推出了公式,这时候wk由于有个题意没太读懂wa了一发A,在wk找bug的过程中,ffx上去敲了F,1A了,下来之后又读了一遍A,发现有一个地方可以理解成两种题意,于是wk按照第二种题意加了特判,就把A过掉了,之后开G,由于两个人都没怎么写过两边树形dp的这种题,GG了
题解:
HIJ:sb题(J题注意2^8=256 =_=||)
A:带权并查集
因为本题目只有两种状态,不是好就是坏。所以总的状态就只有0,1两种。
find函数回溯的时候sum[x]=(sum[x]+sum[t])%2,t是x的初始祖先节点;
在加入并查集时,fx=find_(x),fy=find_(y),当fx!=fy时sum[fy]=(sum[x]-sum[y]+1+2)%2;
当相同时需要判断是否符合sum[x]!=sum[y],不符合说明有阵营不明确的人
另外本题还有一个注意点,有些并查集只有自己一个节点,这种情况下也是
不明确的人,所以需要用cnt数组记录每个并查集中节点数目。
最后一个注意点,有可能是加入并查集没有错误,但是最后可能一个并查集中
有些点在好的阵营中,另外在坏的阵营中,需要将这种情况排除掉
https://paste.ubuntu.com/p/rBtqr2JWD7/
G:点分治算法
问你有多少对(u,v),使得在此路径上的种类数有k个
点分治就是基于树上的节点进行分治。
点分治的本质其实是将一棵树拆分成许多棵子树处理,并不断进行。
这其中有两个部分是不变的,一个是计算重心,一个是对子树进行路径的计算或者记录状态
剩下的就是在总的dfs下,计算通过当前根节点的路径上的信息(一般计数题目是总体计算然后剪去合并的冲突项,有些问满足条件的最长路径是遍历过程中不断寻找最大值)
本题目一个注意点就是在计算当前子树的满足条件的路径数时,为了降低复杂度
用下面这种方式,其实s0=(s0-1)&sta[i],这个操作可以实现对sta[i]的1的遍历
比如与10010或等于11111的最小的数时1101,然后是1111,之后是11101,最后是11111
实际模拟一遍就知道怎么回事了
https://paste.ubuntu.com/p/2dxdYph2zX/

for(int s0=sta[i];s0;s0=(s0-1)&sta[i])  res+=cou[((1<<k)-1)^s0];

D:推公式
题目给出两个等式:
X + Y = A
L C M ( X , Y ) = B
我们可以看出A,B的GCD也就是X,Y的GCD
我们首先让两个等式同时除以 G C D ( A , B )
便得到:
X 1 + Y 1 = A / G C D ( A , B )
X 1 Y 1 = B / G C D ( A , B )
X 1 G C D ( A , B ) = X , Y 1 G C D ( A , B ) = Y
解方程求出X1,Y1,乘以GCD(A,B)即可
https://paste.ubuntu.com/p/3CJP22CBt8/
C.高精度
威佐夫博弈只要满足

( 5 + 1 ) 2 ( M a x M i n ) = M i n

所以只要大数+java二分高精度求出 5 就可以了。
https://paste.ubuntu.com/p/twsbyFXPJT/
E.树状数组
首先我们要深刻理解树状数组的内部原理
我们先来看一下每个数的二进制码和它们对应的lowbit
树状数组原理
1.lowbit(i)表示i能整除的最大的2的幂次
2.i-lowbit(i)表示跳到前一个整幂次的二进制区间
3.i+lowbit(i)表示跳到下一个包含当前区间的区间
如果知道这三个性质,
我们先来看第一问,求某两段之间的lowbit之和,
我们首先求出 s u m ( 1 , i 1 ) 再求出 s u m ( 1 , j ) ,前缀和相减就可以了
现在问题变为如何求出 s u m ( 1 n ) ,我们来看性质1,我们发现我们只要知道
有多少恰好只能整除1的
有多少恰好只能整除2的
有多少恰好只能整除4的….
我们可以发现恰好整除1个数为 [ n / 1 n / 2 ] 向下取整
因为能够整除1的只包含恰好整除1的和能够整除2的
以此类推,我们就可以o(1)的计算出所有2的幂次的贡献,之后就扫一遍算贡献就可以了
单次复杂度是log的
再来看第二问,问某个数被加过几次,想想树状数组的add函数,这个问题就不难想了,每个数字只会在包含他的区间被重新添加,我们只要观察性质三,就很容易算出第二问了!于是整个题就解决了。
https://paste.ubuntu.com/p/dTQsG8mfNh/
F.推公式
本题题意就是让一个数拆成多个数之和,而且这些数的乘积最大,我们知道当我们拆的数越多,乘积就越大,然题意要求每个数不重复,所以我们要让这些数尽量靠近,分下面两种情况
1. X = Σ i = 2 n i X = 9 = 2 + 3 + 4. 2 i ,

2. X = Σ i = 2 n i + k ( k <= n ) K n 2 + 1

根据以上两种情况我们列出等式
X = ( 2 + n ) ( n 1 ) 2 n n k ( n + 1 ) ( n + 0 ) . . . ( n k + 2 ) ( n k ) ( n k 1 ) . . . 1

https://paste.ubuntu.com/p/PbSbmttPMK/
B.Shift-And算法
l如果你学过这个算法的话,那么就是模板题。
Shift-And算法解决的就是每个位置可以放很多种字符时的字符串匹配问题
ans数组表示的是有哪些长度即是目标串后缀又是模式串前缀
求模式串在目标串中出现次数的时候
例如11001就代表当前串有长度为1,4,5的串既是目标串后缀又是模式串前缀
所以如果我们想统计模式串出现次数,就是ans[len]=1时答案++;
所以这道题就可以用Shift-And算法结束了!
https://paste.ubuntu.com/p/5S6RNvSvYG/




ICPC2016沈阳
A HDU 5948 Thickest Burger(签到) 196 / 206
B HDU 5949 Relative atomic mass(签到) 195 / 197
C HDU 5950 Recursive sequence(矩阵快速幂) 138 / 376
D HDU 5951 Winning an Auction 0 / 33
E HDU 5952 Counting Cliques(DFS) 118 / 602(赛后过掉)
F HDU 5953 Similar Rotations 0 / 1
G HDU 5954 Do not pour out 19 / 216
H HDU 5955 Guessing the Dice Roll(AC自动机+高斯消元+概率DP) 46 / 227(待补)
I HDU 5956 The Elder 29 / 191
J HDU 5957 Query on a graph 8 / 36
K HDU 5958 New Signal Decomposition 0 / 2
L HDU 5959 A Random Turn Connection Game 0 / 1
M HDU 5960 Subsequence 1 / 5
过程
这场算是队伍训练挂机时间最长的场,开场由于AB都是c语言题ffx就直接1A了,然后wk推出了B的转移公式,ffx开始敲矩阵快速幂,由于板子错了!!!导致卡了将近半个小时,过了C之后ffx想写一发E的dfs暴力,wk感觉E可以bitset搞一下,由于ffx觉得自己的dfs跑的肯定很慢所以就放弃,让wk上去敲,敲好之后发现bitset的做法处理不了某些情况是错的,那时候时间已经剩的不多了,ffx上去敲自己的dfs也TLE了,于是这场就GG了,感觉以后还是要做法确定再上去敲,不然可能导致时间浪费过多。
题解
AB:SB题
C.矩阵快速幂
根据提议我们知道转移矩阵为

f [ i ] = 2 f [ i 2 ] + f [ i 1 ] + i 4

前两项很容易通过矩阵快速幂转移,而后面就很麻烦,所以我们要看$i^4是否可以转移

i 4 = ( i 1 ) 4 + 4 ( i 1 ) 3 + 6 ( i 1 ) 2 + 4 ( i 1 ) 1 + 1

i 3 = ( i 1 ) 3 + 3 ( i 1 ) 2 + 3 ( i 1 ) 1 + 1

i 2 = ( i 1 ) 2 + 2 ( i 1 ) 1 + 1

所以我们只要在转移矩阵中将 i 4 , i 3 , i 2 , i , 1 也一起转移就可以了
具体转移矩阵如下 这里写图片描述
https://paste.ubuntu.com/p/ybcmW4kDPn/
D.dfs
这道题由于数据量只有100,所以可以大力爆搜,对每个点去搜一下这个点能构成的完全图数量,搜索的时侯有一个当前点集,如果这个点能到达的点与当前点集内部的点都有边,那么就将下个点放入点集从下个点继续搜下去,当点集内的点数量等于k,则更新答案,但是这样搜索我们发现每种完全图都被重复搜索了k!次,为了避免这种情况,我们可以将无向图建为有向图,这样只要沿着有向图跑,每种完全图最多被统计一次,这就是无向图统计某种图时建立单向边从而减少多次统计一个图的情况。
https://paste.ubuntu.com/p/ngQGzygRMC/




CCPC2016杭州
A HDU 5933 ArcSoft's Office Rearrangement(模拟题) 163 / 509
B HDU 5934 Bomb(tarjan) 112 / 375
C HDU 5935 Car(贪心) 156 / 660
D HDU 5936 Difference(折半暴力) 37 / 304 (赛后过掉)
E HDU 5937 Equation(dfs) 25 / 64 (赛后过掉)
F HDU 5938 Four Operations(贪心) 171 / 513
G HDU 5939 Game of Eliminate 4 / 62
H HDU 5940 Hazy String 0 / 3
I HDU 5941 Inequality 3 / 39
J HDU 5942 Just a Math Problem 7 / 23
K HDU 5943 Kingdom of Obsession(二分图) 72 / 776
过程
这场是第一次打这种前期爆炸后期翻盘的场,心情真的很好,开局由于A的模拟ffx一上来有个特判写错了,找了好久的bug也找不到,于是换了wk上来找bug,电脑分两块ffx在右面敲F,这时候wk找到了一个bug改了一下提交,又wa,时间已经一个多小时,全队心情爆炸,之后ffx随便想了一组A的样例,发现有错误,原来wk找到bug之后特判的位置改错了,又改了一下就过了,这时候ffx也敲完了F,submit,wrong anwser,返回查看代码,怎么算怎么对,后来发现字符串长度要判一下,不然可能会非法访问,改了之后ffx加了个初始化的ans,如果不满足条件就不走第二种,但是由于当时没想到答案会出现负数,又wa了,下来之后发现了这个问题,改了就过了,这时候已经rank107了,在ffx敲F的时候wk发现C是个贪心,于是F过了就上机开始敲,然后就1A了,交了之后rank变成了102,wk敲C的时候ffx和sbw推出了K的一些东西,ffx上机敲了K题,又是1A,rank75,ffx敲k的时候wk发现B是个做过的tarjan,改改就能过,于是ffx交了K之后wk上机开始抄板子,但是敲完之后发现样例怎么也过不去,开始了将近半小时的找bug之旅,找了半小时之后,ffx决定换个板子敲一下,ffx拿出自己以前的板子对比一下发现,wk的板子有个cnt写错了(由于wk将栈改为手写,之后忘记测试,导致板子出现问题,以后还是要注意一下),之后改掉了模板的错误,B也1A了,rank变为52,已经滚到银牌区了,由于三个人过于兴奋,导致一个差不多做过同类型的D最后没开出来,又滚回了铜首,不过也算是翻盘了,很是开心。
题解
A.F 细节模拟题
A.要注意之前都用光的时候是不需要消耗次数去合并的
F.要注意可能出现负数,可能串长不够
A题代码 https://paste.ubuntu.com/p/mnVMkYD9TV/
F题代码 https://paste.ubuntu.com/p/jzXBfHkZt4/
B题tarjan
题意建模之后就是对一个有向图并且每个点有权值的图进行选点,要求最终的点集要能到达每个点而且点集的权值和最小,当弄懂题意之后就是一个裸的tarjan了,缩点之后在每个入度为0的联通块里面选一个最小的加入贡献就可以了。
https://paste.ubuntu.com/p/Kxtdy86tFC/
C题贪心
从后往前贪心,由于要求每一段都是整数秒跑完,每一段都尽量保持一个很大的速度,如果这个速度大于当前区间长度,就把速度变为当前区间长度/s,否则就看当前速度需要几秒,如果是整数秒就直接取,如果不是整数秒就让当前秒数+1,速度调成相应的速度。
https://paste.ubuntu.com/p/pWRbJJF7jh/
D题二分枚举
我们能够证出最终的长度是小于10的,这位时候我们发现情况太多,大概有10!种,当遇到这种去全排列会超时而分成两半去排列不会超时的时候,就把原题分成两半,分别存入数组,排序,遍历第一个数组,然后查找第二个数组中满足条件的结果数,(注意不要用map)。
https://paste.ubuntu.com/p/s2QBRFrKkY/
E.dfs
题意就是给你带有1-9数字的块,每个块有a[i]个,给你无数个+无数个=,问最多用已有的块凑出多少等式。1+2=3,2+1=3算两种。
我们推一下发现只有32种等式,但是这样枚举每种等式是否选择的时候2^32会超时,然后我们发现1+2=3,2+1=3,这两种等式可以在一起向下递归,只不过一个是所有块-2,另一个是-1,我们就把复杂度从Z 2 32 变成了 3 20 ,但是这样还有可能不会AC,我们再将答案最大值优化加上,也就是就算后面全选都不会超过当前最大值,这样的话我们就AC了,202ms。
https://paste.ubuntu.com/p/rJYnZyhsgk/
K题二分图
我们可以知道当s数组中存在两个质数的时候,肯定是不可以的,于是我们先本地打个表发现1e8之内两个素数最大的差是200多,猜想一下1e9最多也就600,于是先将两个数组相交的部分去掉,当s数组长度超过600是就是NO,否则对每个s数组能整除a数组的元素建立边,跑一下二分图看是否可以完全匹配就可以了。
https://paste.ubuntu.com/p/pd6zC9N6yY/




猜你喜欢

转载自blog.csdn.net/qq_38891827/article/details/82084661