刷题记录20160527

Posted on 2016-05-27 16:03  wcwswswws  阅读(182)  评论(0)    收藏  举报

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

题解:

任取两对,情况可能有三种:AABBABBAABAB

任取两对的总方案数为sigma(C(c[x], 2), C(c[y], 2)),设为V1AABBABBAS1S2ABABS3

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

题解:

对于每个同时属于英语和法语的词,必然存在一条路径,从原始英语词->原始英语词所在句的英语词->…->原始英语词所在句的英语词->原始法语词所在句的法语词->…->原始法语词所在句的法语词->原始法语词。这样的路的最小的数量就是同时属于英法语的词数。构图,对于每个词拆点EwFw,权值1;对于每个句子S分为英法语句,分别与词相连相连。然后求最大流即为最小割。

 

Hdu4468

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4468

题解:

类似于kmp,每次查找下一位。记录下可以作为答案的起始位。

如果失配,分为三种情况:

1、如果还在当前答案的串内,则使用kmp的跳转函数对匹配位进行跳转,假设前面是正常的前缀;

2、如果始终无法匹配,则扩展答案串为从答案其实位至当前位;

3、如果已经到了最后一位,已当前位和答案串长度更新答案位。

如果超时,注意减少strlen的调用次数。