51nod 1624取余最长路
来源:互联网 发布:淘宝搜血滴子 编辑:程序博客网 时间:2024/05/06 17:06
题意:3*n(n<1e5)的方格,每个方格内有一个数字,从(1,1)走到(3,n)(只能向下或向右),走过格子的和,膜p后的最大值是多少
题解:如果是普通的不需要膜的话,就是普通的dp,但是有膜以后,会产生后效性,因此,就不会dp了
如果暴力的话,复杂度n^2
换个角度,也就是找两个拐点,使得sum[1][x]+sum[2][y]-sum[2][x-1]+sum[3][n]-sum[3][y-1]最大就可以
考虑优化,对于sum[2][y]-sum[3][y-1]+sum[3][n],只要找到前面的“最大”的sum[1][x]-sum[2][x-1]就可以
可以把前面所有的sum[1][i]-sum[2][i-1]保存起来,然后二分找就可以
int a[10][100010];LL sum[10][100010];int main(){ mem(a,0); mem(sum,0); int n; LL p; cin>>n>>p; for(int i=1;i<=3;i++){ for(int j=1;j<=n;j++){ scanf("%d",&a[i][j]); sum[i][j]=(sum[i][j-1]+a[i][j])%p; } } set <int> s; s.clear(); LL ans=(sum[1][n]+a[2][n]+a[3][n])%p; for(int i=1;i<=n;i++){ LL temp=(sum[1][i]-sum[2][i-1]+p)%p; s.insert(temp); temp=(sum[2][i]-sum[3][i-1]+sum[3][n]+p)%p; ///不超过p,且能达到的最大值 set <int>::iterator it = s.lower_bound(p-temp); if(it!=s.begin()) ans=max(ans,(temp+*(--it))%p); } cout<<ans<<endl; return 0;}
0 0
- 51nod 1624 取余最长路
- 51nod 1624 取余最长路
- 51nod-1624 取余最长路
- 51nod 1624取余最长路
- 51nod 1624 取余最长路
- 51nod 1624-取余最长路(set+二分)
- 51nod 1624 取余最长路(二分)
- 51nod 1624 取余最长路(枚举+二分)
- 51nod 1624 取余最长路[set]
- 51 nod 1624 取余最长路 思路:前缀和 + STL(set)二分查找
- 51nod 1624 取余最长路 (set+二分查找) 真.好题
- 1624 取余最长路
- 51Nod-算法马拉松13-A-取余最长路
- 51 Nod1624 取余最长路
- 1624 取余最长路 (前缀和+set二分)
- 【51Nod 1472&&CF 549F】取余最大值
- "%"取余
- 取余
- 配置ssh免密登录
- Codevs 1501 二叉树最大宽度和高度 dfs
- Space在Android里的应用
- JVM高级特性整理
- 【数据结构】算法7.10-7.11 DFS求无向图关节点
- 51nod 1624取余最长路
- 基于android的Socket通信
- Fragment碎片
- CodeForces--Platforms
- Netty精粹之TCP粘包拆包问题
- DataBinding快速入门(还在用findViewById?)
- springMVC----controller配置总结
- POJ 3393 Lucky and Good Months by Gregorian Calendar(模拟题)
- 在ubantu上下载Android源码