Problem A: CZ Loves BracketSequence
题意:给你括号序列,问你最多的连续匹配是多少,只有小括号
题意:用栈存,栈里的是还没匹配的,匹配的就出栈
然后每次匹配成功之后,就把当前的位置减去栈里还未匹配的栈首元素的序号,注意边界
AC代码:http://paste.ubuntu.net/13883463/
Problem B: CZ loves String I
题意:把字符串重新排列,输出前k个最小的字母
题解:直接字符数组排序。
Problem C: Dark elf and Light elf
题意:给你2n个两种不同的精灵,n个n个分开关,然后两个房间,每次可以打开一个房间,就会放走一个精灵,当有一天打开房间发现里面没有精灵的时候,求另外个房间的精灵的个数的期望,给你打开第一种精灵房间的概率
题解:概率题,推公式,首先考虑第二个房间有n个精灵,期望是nC(n,0)*p^(n+1),有n-1个精灵,期望是(n-1)*C(n+1,1)*p^(n+1)*(1-p)
公式就是∑(n-i)*C(n+i,i)*p^(n+1)*(1-p)^i+∑(n-i)*C(n+i,i)*(1-p)^(n+1)*p^i;
但是这个组合数C(n+i,i)特别大,会爆炸
这里用到个不错的技巧,是log对数优化,C(n,m)=n!/(m!*(n-m)!)
取logC(n,m)=logn!/(m!*(n-m)!)=logn!-logm!-log(n-m)!
于是可以打表求logn!,logn!=log(n-1)!+logn
这样就不怕爆炸了啊,就能很容易的解决这个问题了,p^n也能用log解决,然后算完之后取个exp就OK了
AC代码:http://paste.ubuntu.net/13883696/
Problem D: Monkey and Flag
大模拟,好烦,不想写QAQ
Problem E: Destroy or Rebirth
题意:m次闪电,扣n点血,每次扣血0-n
题解:不定方程x1+x2+。。。+xm=n
C(n+m-1,m-1),快速幂搞一下
如果n==0,m==0,就是输出1,坑了一次
需要敏锐的看出这题是个不定方程,就好做了
AC代码:http://paste.ubuntu.net/13883818/
Problem F: the Route to Legend
题意:给你一些牌,然后有3个属性,法力消耗,攻击,防御,如果一张牌比另外张牌,法力消耗大于等于,攻击防御小于等于的话,就要扔掉,问最多可以留下多少牌
题解:这题一开始以为是瞎排序瞎搞,但是仔细一想,先给他们按照法力值消耗升序排序,攻击,防御降序,这样前面的肯定不会被后面的剔除,然后怎么考虑呢,后面的牌法力消耗都是大于等于前面的,那么如果他攻击防御都小于前面的里面最大的,那么他就被剔除了,所以要在攻击比他大的里面找防御最大的,线段树可以不错的解决这个问题,按照攻击值域插入线段树,每次考察一个随从的时候,先从他的攻击-10W的区间内,找最大值,如果这个最大值(就是比他攻击高的随从里面防御最高的)大于等于他的防御,那么就continue,否则ans++并且update
AC代码:http://paste.ubuntu.net/13883965/
Problem G: CZ loves Candies
题意:给你很多糖果和总容量,然后给你每个糖果所占的空间和甜度,要求甜度最大
题解:这个就是01背包,但是20W的空间10W的数量,这药丸啊,但是后来发现每个糖果的空间都只有1和2,所以可以直接按照糖果甜度的平均值排序,然后一个个取,取到最后如果最后的空间正好没了,就最优,如果最后多1个空间,但是下一个糖果的空间是2,那么就要看看前面有没有取过1的糖果,后面有没有1的糖果,然后分4种情况讨论。
AC代码:http://paste.ubuntu.net/13884015/
Problem H: CZ loves Math
题意:给你很多数,然后把倍数在1-v里面筛掉
题解:直接筛就行了,开头虚了以为会T,其实只要特判1的情况,然后标记重复出现,复杂度就是n*(1/1+1/2+1/3+.......+1/n)的复杂度了
Problem I: The second blood
题解:打表,数组记录水题
Problem J: CZ loves GCD
题意:给你10W个数字,然后10W次询问,区间内和v互质的数的个数
题解:一般这种题目都是容斥,但是这题要离线搞,我由于没怎么写过离线的导致比较虚,我的锅
离线后区间排序,这题的区间给的比较人性,然后就是每个数字进队出队的过程,考虑每个区间,然后没进去的数字进去,不用进去的数字就出来,然后开个数组,存每个数字他的素因子,然后容斥,记录他是哪些因子的倍数,各种++--,然后考虑当前数组的v,容斥分解之后,++--搞定
因为考虑一个数字吧,如果他是2,3的倍数,就在f[2]++,f[3]++,然后f[6]++,然后v如果是2的话就-f[2],如果是3就-f[3],如果是6就-f[2]-f[3]+f[6],所以这样搞是可以的,不要用vector,会跑的比较慢然后T了
AC代码:http://paste.ubuntu.net/13884166/
Problem K: CZ loves String II
题意:给你两个串,并列放,然后你可以删除几列,是两个字符串同时删除那列,然后让字典序最大
题解:这题贪心比较复杂,反正是WA了好久,然后感觉用dp瞎搞吧,答案字典序最大的情况下,dp1[i][j]表示前一个字符串的第i位放进去,然后长度为j的时候的字符串,dp2[i][j]表示后一个字符串第i位放进去长度为j的字符串,然后ans=max(ans,dp1[i][j]+dp2[i][j]);
这种题目贪心特别复杂,但是dp完全就瞎搞很容易就出来了,哎以后比赛的时候如果贪不出,得要注意变换方法
AC代码:http://paste.ubuntu.net/13884241/
Problem L: CZ loves DAG
题意:给你一个DAG图,然后考虑图里面任何两个节点u,v,需要两者之间所有路径距离都相等
题解:标程是带权并查集,确实这题带权并查集貌似轻松秒杀
但是比赛时候没想到,就想了DFS,就是如何建图的问题了,想要让搜的次数尽可能少
如果是有向图,那么难免要从每个入度0的点开始搜,就复杂度比较大,所以可以建反向边,搞成无向图,但是权值要变成负,这样的话,如果从u-v,权值为a,但是从另外条u-f权值为b,v-f权值为b-a,反向边的话f-v权值a-b,这样的话就算有两条到v的边,距离也是相等,所以可以让每条边只搜一次,就能很快的解决了
AC代码:http://paste.ubuntu.net/13884347/