2012年11月2日

摘要: 传送门:http://www.rqnoj.cn/Problem_350.html题目中的数据范围据说可以用快排+统计可以过。方法是:快排一下并记录原始位置,然后每次O(n)的时间查找如果Ai在所求区间就把计数器cnt++一直到计数器等于k就可以输出解了。。。下面是真正的做法划分树。查了点资料终于搞出来了。。划分树是一种基于线段树的数据结构。建树它的每个借点保存区间[l,r]所有元素,设元素个数为s,s=r-l+1。元素的顺序和原始出入相同,然后区间中前s/2大的成为左子树另外的成为右子树。在构造过程中再更新一个数组num[][],num[node][i]表示node层子树中区间[l,i]进入左 阅读全文
posted @ 2012-11-02 13:25 AlphaX 阅读(750) 评论(0) 推荐(0) 编辑

2012年10月29日

摘要: 传送门:http://new.tyvj.cn/Problem_Show.aspx?id=1288一道小技巧的图论先Floyed预处理出每两点的最短路径然后DP。方程:f[i][k]表示 从1到达i经过k集合中的点后到达n最小费用这里的k集合指的是一串二进制。例如:1001表示经过第一个点和第四个点。当然这里要把离散的各个放着能量的点重新标号。因为最多有十个能量点,所以是可行的转移方程:f[i][k]=min( f[j][get(k-j)] + g[j][i])这里get()的意思是原先k集合拿掉j这个点后新的集合,j就是拿掉的点在图中的标号答案就是 f[n][(1<<p)-1]【C 阅读全文
posted @ 2012-10-29 16:34 AlphaX 阅读(241) 评论(0) 推荐(0) 编辑

2012年10月28日

摘要: 【卢卡斯(Lucas)定理】Lucas定理用来求C(a,b)modp的值,其中p为素数。数学表达式为:Lucas(a,b,q)=C(a%q,b%q)*Lucas(a/p,b/p,p);Lucas(a,0,q)=0;通过这个定理就可以很方便的把大数的组合转化成小数。但其中还是要求C(a%q,b%q)%p,所以这里引入逆元来求。【定义】若整数a,b,p,满足a·b≡1(modp).则称a为b模p的乘法逆元,即a=b-1modp.其中,p是模数。应用到组合数中来就是:a!/[b!*(a-b)!]%p==a!* [b!*(a-b)!]-1%p【逆元求法】:应用费马小定理,ap-1=1modp 阅读全文
posted @ 2012-10-28 11:02 AlphaX 阅读(1307) 评论(0) 推荐(1) 编辑

2012年10月25日

摘要: 传送门:http://new.tyvj.cn/Problem_Show.aspx?id=1505比较强大的转化了下题目切入点好题啊看样例转化成直角三角形接下来就要发生神奇的事情了我们以红线当作DP阶段划分。先给出状态和转移方程f[i][j][k]表示第i阶段废掉j个砖头总过程废掉k个砖头的最大收获值f[i][j][k]=max( f[i-1][j-1][k-j]+sum(i,j) )其中sum[i][j]的含义是 第i 阶段 上往下j个的价值总和可能你已经发现这个方法的巧妙之处了。如果第i阶段第j个砖块拿掉,那一定要拿掉第i阶段j-1个方块和第i-1阶段的第j-1个方块,然后如果要拿掉第i阶段 阅读全文
posted @ 2012-10-25 13:44 AlphaX 阅读(181) 评论(0) 推荐(0) 编辑

2012年10月23日

摘要: 传送门:http://www.rqnoj.cn/Problem_165.htmlf[i]表示前i个有多少个FBIg[i]表示前i个有多少个FBt[i]表示前i个有多少个F假设现在到第i位如果ch[i]=='F'f[i]=f[i-1],g[i]=g[i-1],t[i]=t[i-1]+1;如果ch[i]=='B'f[i]=f[i-1],g[i]=g[i-1]+t[i-1],t[i]=t[i-1]如果ch[i]=='I'f[i]=f[i-1]+g[i-1],g[i]=g[i-1],t[i]=t[i-1]时间复杂度:O(n)CodeView Code 1 阅读全文
posted @ 2012-10-23 12:47 AlphaX 阅读(212) 评论(0) 推荐(0) 编辑

2012年10月22日

摘要: 传送门:http://new.tyvj.cn/Problem_Show.aspx?id=1075有点小转弯。sum[i]表示下至上i个的总价值f[i][j]表示剩下i个硬币上一轮对方取j个转移方程f[i][j]=max( sum[i]-f[i-k][k] ) 1<=k<=j*2时间复杂度n^3显然不行观察转移方程发现f[i][j] 与 f[i][j-1] 均枚举了 k=1,2……2*j-1,2*j-2所以上面方程中 枚举的k 其实枚举 j*2-1和j*2 就包含了所有情况了。貌似还有一种方法是单调队列,暂不懂 阅读全文
posted @ 2012-10-22 21:38 AlphaX 阅读(116) 评论(0) 推荐(0) 编辑
摘要: 传送门:http://new.tyvj.cn/Problem_Show.aspx?id=1309能把方程和一点优化写出来~。但是还是不够细心哪方程:f[i]=min(f[k]+t[k+1,i]*i)+(n-i)*s;预处理出 t[] 和 (n-i)*k 存好然后就是斜率优化如果k决策比j觉得更优化成等式就是f[k]+t[k+1,i]*i<f[j]+t[j+1,i]*i;( f[k]-f[j] ) / ( t[j+1,i]-t[k+1,i] ) < i满足上面这个等式我们知道 如果存在一个决策k比j更优 那么以后的寻找min就没必要再遍历j决策了那么我们在循环时候 维护一个最优解k就 阅读全文
posted @ 2012-10-22 21:37 AlphaX 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 传送门:http://new.tyvj.cn/Problem_Show.aspx?id=1314有点小坑。感觉有点小问题。但题解是这样 - - 先理理再说f[i][j]表示red球i个,blue球j个 达到最大分数g[i][j]表示red球i个,blue球j个 剩下的钱last[i][j]表示red球i个,blue球j个 已经取了前几个奖励f[i][j]=max(f[i-1][j]*red,f[i][j-1]+blue)DP同时更新g[][]个last[][] 阅读全文
posted @ 2012-10-22 21:35 AlphaX 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 传送门:http://new.tyvj.cn/Problem_Show.aspx?id=1333啊。大有收获啊。好吧是我太弱。。第一个,最多邀请人数我方程写出来了。但是怪怪的我就把他给否定了。因为时间会爆啊??但是题解说做些优化就可以了,但是一些极端数据不是一样会爆?方程f[i][j]表示小A花i时间小B花j时间邀请到的最多大牛假设当前循环到第k位大牛f[i][j]=max( f[i-timea[k]][j],f[i][j-timeb[k]] ) 其中要保证时间连续性第二个,最少时间f[i][j][k]表示前i个大牛小A邀请j个花了k时间时 小B最少花的时间f[i][j][k]=min( f[ 阅读全文
posted @ 2012-10-22 21:34 AlphaX 阅读(287) 评论(0) 推荐(0) 编辑

导航