[置顶] 五场网络赛精选题(比简单题难一点的题)

网络赛结束了,最后一发合肥站不知道拿没拿到名额,看天命了,然而网络赛好题还是不少的,起码我这种模版流感到了很大的压力

简单的水题我还是会做的,我要记录一些比简单题难一点的,大概铜牌难度的题(银牌难度的暂时我还不行呢)

先从最后一场来吧

合肥站网络赛:

hdu5493

题意:给你n个人,每个人都有身高,然后他会告诉你他前面或者后面有多少个人比他高,这是随机的

题解:线段树维护,要求输出字典序最小,首先先给身高排序,然后从低开始插入,如果他前面比他高的人的个数大于等于区间里的空位,那么就是不可能的,这很显然啊

然后就是字典序最小,就是从前查询一下,从后查询一下,看哪个更靠前,唉我还是太弱了,其实这题还是很水的

AC代码: http://paste.ubuntu.net/12602449/


hdu 5491

题意:给你一个数d,然后他二进制格式下1的个数为L,然后给你个范围s1和s2,要求你找一个比d大的,二进制中1的个数满足在s1和s2之间的最小的数字
题解:构造题,先把d+1,然后判断d+1里面1的个数,如果在范围内,那么很好,如果不在,分为两种情况
1. 个数<s1,那么就需要增加1的个数,就是从右到左把0的位置变成1,就是加上(1<<i)
2.个数>s2,那么就需要减少1的个数,就是从右到左碰到1的位置,然后加上(1<<i)。
如果操作之后不满足,继续上面的操作,开头我相通了,但是写的太复杂,各种WA,后来怒了理清思路重写就过了
AC代码 :  http://paste.ubuntu.net/12608008/


hdu 5492
题意:给你一个矩阵,然后就从1,1走到n,m的路径的最小方差
题解:dp,然而我并没有想出来状态,感觉我DP想状态还是不行啊,这题居然状态是枚举走到这个点的权值和,然后记录最小权值平方和。最后枚举(n+m-1)*dp[n][m][k]-k*k的最小值即可了,我dp能力真是太弱了,而且手速也不行,这不科学啊

AC代码:  http://paste.ubuntu.net/12608918/

hdu 5489
题意:这题是给你一个数列,然后让你删除连续的L个数字,求剩余的LIS
题解:dp+线段树维护,先预处理出数列中的每一位i,以i为结尾的LIS的值,存在f[i]中,然后处理以i为开头的LIS的长度存在g[i]中,因为要删除长度为L的元素,所以考虑删除元素i前面的L个,就是删除[ i-L,i-1 ]这些,然后就是考虑i-L前面的元素中f[j]最大的j,然后加上g[i],寻找这个最大值
用线段树维护前面的f[j],当i>L+1的时候再开始插入f[i-L-1],因为i==L+1的时候,删除[ 1,L ]所以应该是没有值,就这样考虑从L+1到n的i
当然最后不能忘记整个L长度的在最后,这时就直接询问整个线段树就行了(少了这一点wa了好久)
线段树是个重要的数据结构,仍须努力

AC代码 : http://paste.ubuntu.net/12631215/


上海网络赛:
hdu 5478
  ak1n+b1  + bk2nk2+1  = 0 (mod C)(n = 1, 2, 3, ...).
就是给你这个式子让你就满足条件的a,b
n=1,a^(k1+b1)+b=0 (mod C)               -----------------(1)
n=2 ,   a^(2*k1+b1)+b^(k2+1)=0 (mod C)   --------------------(2)
(1)式乘以 a^k1得 a^(2*k1+b1)+b*a^k1=0 (mod C) ----------(3)
(2)-(3)得b^k2=a^k1
用1式枚举a,快速幂,求出b,然后验证下面这个等式,如满足就输出
数论需要好好搞了,提升数学修养,起

AC代码 : http://paste.ubuntu.net/12631238/



http://acm.hdu.edu.cn/showproblem.php?pid=5451
hdu 5451
It is known that   y=(5+26)1+2x .
For a given integer   x (0x<232)  and a given prime number   M (M46337) , print   [y]%M . ( [y]  means the integer part of   y )
 


就是求这个玩意的整数部分模M啊

但是指数太大,需要模掉

我开头不知道,就很愚蠢的用了欧拉定理

后来想想无理数怎么能用数论的知识呢,这题应该是找广义斐波那契数列的循环节,先推递推式

假设An=(5+2根6)^n  Bn=(5-2根6)^n;

5-2根6<1,所以Bn<1,然而An+Bn为整数,所以An的整数部分就是An+Bn-1=Cn

假设Dn=Cn+1=An+Bn

然后两边同乘(5+2根6)+(5-2根6)

得到10Dn=Dn+1+Dn-1

于是可以递推模M,找出循环节,因为模M的循环节都不会很大,可以暴力打

当然求循环节是有方法的,不过太难了,我不懂,附菊苣博客http://blog.csdn.net/ACdreamers/article/details/25616461

找到了循环节之后然后存下来然后就可以把指数模掉,然后再递推一遍就好了啊

AC代码 : http://paste.ubuntu.net/12710815/





你可能感兴趣的:([置顶] 五场网络赛精选题(比简单题难一点的题))