CodeForces 236d
链接: http://codeforces.com/contest/403/problem/D
题解:
把原问题中 ai<=bi 和 bi<ai+1 分开考虑,那么原问题就可以拆成两个子问题:
1、把数i拆成j份,每份数字不相同的方案数;
2、在n个数间插入k个板的方案数;
然后把他们乘起来再乘上排列数就可以了。
CodeForces 250d
链接:http://codeforces.com/contest/438/problem/D
题解:
简单的说,就是线段树,每次取模都是强行更新区间内大于模的值。时间复杂度是
O(nlognlogai)。
因为每次取模,如果减小,则被除数至少减少一半(易证,关键结论)。这样单个
数ai最多除log(2,ai)次才为0,故总次数上限为nlog(2,ai)。每次增加最多增log(2,ai)
次,所以数量级没变。每次线段树操作logn,故满足条件。
CodeForces zeptolab2014 e
链接:http://codeforces.com/contest/436/problem/E
题解:
按b从小到大进行排序后,假设L是最后一个放2颗星的,那在它之前所有位置至少
放一颗星(不然把当前位置前移,结果更小)。
这样就至少放了L颗星。建立一个集合,对于I <= L,取b[i] - a[i];对于I > L,取a[i];
取集合前w-L小,则构成当前L的答案。这个可以用堆维护。剩下的都好办了
Codechef 14june seaarc
链接:https://www.codechef.com/problems/SEAARC
题解:
任取两对,情况可能有三种:AABB,ABBA和ABAB。
任取两对的总方案数为sigma(C(c[x], 2), C(c[y], 2)),设为V1。AABB和ABBA为S1和S2,ABAB为S3。
S3 = V1 - S1 - S2。
S1计算方法比较简单,假设位i左边同色有L个,右边不同色为R对,那么以改位为首对右边界
的值是L*R。扫一遍,动态修改即可。
S2比较复杂,分成以下三种情况,时间复杂度O(n*sqrt(n)):
设color[A] > sqrt(n),则A的可选情况小于sqrt(n)种。对每一种A,从左往右扫一遍,按每一节
(相邻两位)更新;
设color[A] <= sqrt(n)且color[B] > sqrt(n),对于每种B统计其前缀和,然后再枚举A,扫一遍,也是
维护每一节的情况,类似第一种方法;
设color[A],color[B]均小于sqrt(n),首先把所有对当成线段并用右端点建树,然后扫描,对于点I,
计算以i为左端点每一个同色线段内的异色线段数,然后把以i为左端点的线段删除。
Srm562(500):
题解:
时间复杂度O(WWBB)并没有什么难度,用位操作可以把其中一维优化成log级。卡常数也能过。
Hihochoder chanllege16 C:
链接:http://hihocoder.com/problemset/problem/1247
题解:
每条边,如果是轻边,其花费是左右两边个数的积;
剩下的就是正常的树形DP,将父节点当成一棵子树即可。
Codechef 14july seaeq
链接: https://www.codechef.com/problems/SEAEQ
题解:
先求解出(l,r)在不同长度排列中不同逆序对数。记f[i][j] = sigma(f[i-1][j-k]) (0 <= k < i)为长度 I 的有 J 个逆序对的方案数。对于长度为n的排列,其值为 sigma(sigma(F[i][j])(1 <= j <= i) * C[n][i]^2 * F[n - i]^2)(1 <= i <= n)
Tco14r2b500
题解:
那两句话,第一句话的意思是x+y-1不是质数,因为质数可以直接猜出来;
第二句话的意思是x*y的除了(1, x*y)的分解的和减一都不是质数,不然就猜不出来。
然后枚举即可。
Google Codejam 2015 Round2 B
题解:
二分最大时间,算出最小和最大温度。因为温度变化函数是连续的,所以只要区间包含x即可。
唯一需要注意的是精度问题。需要提前处理温度与x相等的情况。
Google Codejam 2015 Round2 C
题解:
对于每个同时属于英语和法语的词,必然存在一条路径,从原始英语词->原始英语词所在句的英语词->…->原始英语词所在句的英语词->原始法语词所在句的法语词->…->原始法语词所在句的法语词->原始法语词。这样的路的最小的数量就是同时属于英法语的词数。构图,对于每个词拆点Ew和Fw,权值1;对于每个句子S分为英法语句,分别与词相连相连。然后求最大流即为最小割。
Hdu4468
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4468
题解:
类似于kmp,每次查找下一位。记录下可以作为答案的起始位。
如果失配,分为三种情况:
1、如果还在当前答案的串内,则使用kmp的跳转函数对匹配位进行跳转,假设前面是正常的前缀;
2、如果始终无法匹配,则扩展答案串为从答案其实位至当前位;
3、如果已经到了最后一位,已当前位和答案串长度更新答案位。
如果超时,注意减少strlen的调用次数。