您的位置:首页 > 其它

FOJ有奖月赛-2010年12月

2011-01-19 17:03 253 查看
去做这套比赛完全是为了去膜拜福大核武,京润后人,这套题几乎都是他的神题,我表示压力很大

题目地址http://acm.fzu.edu.cn/contest/index.php?cid=111

A:

题目描述:给定一个长为N的序列,求数组中有多少最长递增子序列

分析:首先我们利用树状数组可以在nlogn时间内(注意起始要离散化)

求得以i为结束的最长长度,记为dp[i]=max(dp[j])+1 (j<i&&a[j]<a[i])

那么有多少个怎么算呢,直观的一个想法就是设w[i]表示

w[i]=sigma(w[j])(dp[j]==dp[i]-1&&a[j]<a[i]) 起始他们是一层层来传递的

故存在一个自底向上的拓扑序,这里的层是用长度来划分的

于是这里可以用一个非常猥琐的办法,这里假定共有m层

我就用m颗平衡树来维护,我们依次将数据加入,依次查询即可

总的复杂度还是nlogn,额这题其实还可以有很多暴力的水法,比如强行构造拓扑序,用vector数组存关系

(话说做完这个题,心里萌生了想要自己编写一套STL的想法,把一些常用数据结构都封装起来

如果可能的话,这个计划会从二月份开始实施)

B:

题目描述:给定A mod B=C 其中A C已知,求满足条件的B的个数

分析:问题等价成求|A-C|%B==0那么就是|A-C|的约数个数

Yn=X1^a1*X2^a2*…*Xn^an;Yn的约数个数等于(a1+1)(a2+1)…(an+1)利用组合数学可以解释

复杂度O(sqrt(10^9))

C:

几何神题,我是几何盲,研究中。。。

D:

题目描述给定一个串,问有多少个'314'的子序列

定义L[i]表示[0,i]有多少个3,R[i]表示[i,n-1]有多少个4

然后线性扫描一遍即可

E:

又是几何题,烦死啦

F:

题目描述:给定一个N 按照如下操作

(1)如果N=1,游戏结束

(2)如果N为偶数,那么N=N/2

(3)否则N=N-1

PH and XiaoBo轮流玩,谁不能玩谁输

分析:数据规模也不是很大,模拟即可

G:

题目描述:给定一个无向图,求有多少个最小生成树

分析:由于边比较少,故采用暴力枚举选取边的办法

判断并统计MST的个数,总的复杂度20*2^20

H:

题目描述:若国王位置为(x,y)则周围八格都是不安全的

给定n*m矩阵,要求摆放k个国王,求合法的方案数

分析:由于max(min(n,m))最多为10,我们可以利用这个信息来描述状态

那么接下来就是方程的设计,这里我把较大的设定成行,方程也是很直观的设计

dp[i][j][k]表示前i行,放了j个国王,上一行的列状态为k的方案数

在这里预处理两个东西w[i]表示i状态包含的1的个数

v[i]容器保存所有i后继的合法状态

之后暴力转移即可 我的复杂度是O(max(1024*1024),n*m*2^m*ave)

(ave表示每个状态的平均合法后继状态数)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: