2018年8月13日训练日记

HDU 5413 CRB and Roads (bitset+拓扑排序) 题意:求一个有向无环图内有多少个冗余边。冗余边的定义为,对于一条边 (u,v) ,如果删去这条边,u依旧能到v,则此边是冗余边。考虑bitset+拓扑排序卡过。对于每个点记录一下有哪些点可以到达这个点,由于是有向无环图,所以可以进行一个拓扑排序来解决。求完之后,对于每个点,将其前驱按拓扑序排序。从前驱拓扑序大的开始处理,如果处理到一条边,发现其前驱在这条边之前已经可达此点,说明这是冗余边。然后就是n为2e4,用bitset的话,bitset的第 i位表示第 i个点是否能到达此点,这样一来,看似时间复杂度是 O(N^2),空间复杂度也是 O(N^2) ,但实际上 bitset把一个字节当作了8位,所以复杂度可以降一个级别,所以两个复杂度都是 1e7左右,刚好能卡过。题解参考这里

HDU 5414 CRB and String (思维) 题意:给你两个字符串s和t,你可以在字符串s中任意选一个字符c,在该字符c后插入一个字符d(d!=c),问经过多次此操作,能否将字符串s转化成字符串t。本题的关键就是红色标记的部分。如果没有红色标记的部分,我们只需要求s的每一个字母是否在t中依次出现即可,但是d!=c时,aa便无法转化成aaa,而baa可以转化为baaa(在b后面加a)。因此只要t串的前k个字符相同,s串的前k个字符也必须相同。否则就不可以。题解参考这里

HDU 5416 CRB and Tree (dfs+邻接表) 题意:有一棵n个结点(结点记为0~n),n-1条加权边的树,定义f(u,v)为结点u与结点v之间所有边权值的异或值,即若u与v之间有e1,e2,e3,e4,e5这么五条边的话,f(u,v)=e1⊕e2⊕e3⊕e4⊕e5,现给你一个异或值s,问满足f(u,v)=s的无序对(u,v)有多少对。(怎么感觉这题似曾相识呢)首先,可以证明f(u,v)=f(1,u)⊕f(1,v)。所以我们只需dfs一遍,算出所有的f(1,u)值,存下每个异或值出现的次数。又因为若a⊕b=c,则a⊕c=b,所以由f(u,v)=f(1,u)⊕f(1,v)=s可得f(1,v)=f(1,u)⊕s。对于每次询问,我们只需加上对于每个结点u,f(1,u)⊕s值出现的次数即可。另外,s=0的情况比较特殊,需另外考虑,因为u==v的情况下,f(u,v)=f(u,u)=0。题解参考这里

然后今天的杭电多校崩了。。。好几个题看起来都能做,但是都做不出来。。。1001dfs了三个小时算是出来了。然后矩阵快速幂那道队友写错一个字母最后也没找出来,赛后改了就过了。。。然后1012比赛一直T,赛后看了标程用的超神输入挂,然后粘了下来以后用。。。然后秒过了。1008这道题要是去了修改就是我做过的原题。。。但是有修改就要加个树状数组。。。然后就不会了。。。明天争取多补两道。。。

猜你喜欢

转载自blog.csdn.net/LSD20164388/article/details/81623816