1.19 :138 - ZOJ Monthly, January 2015
题目挺难的,只会做三个。。
B.
题意:给你一副52张牌的牌,然后给你一个序列(由一些牌组成),求剩下的牌组成的比这个序列字典序小的个数,mod 1e+7
题解:这就是个数学题吧,不是太难,先处理剩下哪些牌,然后搜索,如果当前序列比给的序列已经字典序小了,那么后面就是重复元素的全排列啊,n!/(n1! n2! n3! ....nn!)
然后要mod 1e9+7,所以需要用逆元。
如果字典序相同就继续往下搜,加一位继续搜
如果字典序大,就不搜了
但是我还是wa了很久,因为如果字典序相同的时候,这会已经考虑到最后一张牌了,如果这会的序列长度小于给的序列长度,那么也是可以得,所以这会应该也算一种情况,但是我并没有算进去,所以wa,仅仅相差1的错误,却让我wa了一两个小时,看来仍需细心啊
http://paste.ubuntu.net/14575550/
E.
题意:把最大的a和最小的b都变为a-b,然后问最后所有数字都变成了同一个数字,这个数字是啥,如果不能,那么输出nooo(但是并不可能不能啊)
题解:n只有10,所以开个set模拟一下就好了,水题
http://paste.ubuntu.net/14575547/
G.
题意:一个序列里任选两个数字,然后把他们赋值为他们的gcd,然后让你构造这样的操作,使得所有的数字都变为1
题解:这个题一开始觉得很难,不知道怎么构造,后来想想只要所有数字的gcd是1,那么肯定能做到,然后他只要求不大于5n次,所以只需要瞎搞就行了。
至于我为啥wa啊TLE啊OLE啊我也不明白
我就是先把第一个数字和后面的都分别操作,然后如果第一个数字变为1了,就把后面不是1的都和第一个数字操作一下,这样是肯定不可能超过5n的,想上去就是了
http://paste.ubuntu.net/14575545/
1.20 : The 36th ACM/ICPC Asia Regional Shanghai Site —— Online Contest
B
题意:给你一些基地的坐标,然后给你一些炸弹的坐标,问你每个炸弹分别能炸掉多少个基地
题解:这题就是个简单题,除了数据有点大,那就离散化一下,然后二分查找就行了,中间用到set维护每个横坐标或者纵坐标上的点,其中有可能多个基地在一起,所以要用multiset,另外每次炸了不要忘记清空set,这里没注意错了好久
http://paste.ubuntu.net/14581498/
G
题意:给你一个序列,然后对区间里的数字做开根操作,然后求区间和
题解:开根操作不能一个区间一起做,必须一个数字一个数字的做,所以感觉不能很好的发挥线段树的优势,求和可以用线段树实现,但是发现一个很大的数,其实开根六七次就变成1了,所以其实可以暴力实现,因为10W个数字每个开根六七次,也不大,然后每次判断区间里的和是不是等于个数,(区间里都是1),如果是的话,这个区间就不操作了,所以这样不会多余操作,就能解决问题了
有个坑点就是输入的区间不一定l<r,需要换一下,又错了好久,坑= =
http://paste.ubuntu.net/14581513/
H
题意:给你n个钟的指针,第i个要i秒转1圈,当所有针都回到起始位置的时候,算一天,求一天时间大于等于M秒的方法有多少
题解:一些针都回到初始,就是他们的lcm,然后这题n是40,一开始觉得是折半搜索,但是lcm用折半搜索并不行啊,然后就不会做了
其实这题是dp,而且是离散dp,因为lcm的情况不多,虽然可能很大,但是他们是离散的,一共也就几万个,所以可以用map来实现离散的数字的dp
dp[i][j]表示考虑第i个指针的时候,周期为j的有多少种方法,然后转移就是dp[i][lcm(i,j)]+=dp[i-1][j];
初始化需要dp[0][1]=1.dp[i]=dp[i-1];
如果m为1,最后的答案需要减掉1,因为全部不选也是1,但是不能不选指针
http://paste.ubuntu.net/14581530/