题意:

佳佳有一个n*m的带权矩阵,她想从(1,1)出发走到(n,m)且只能往右往下移动,她能得到的娱乐值为所经过的位置的权的总和。

有一天,她被下了恶毒的诅咒,这个诅咒的作用是将她的娱乐值变为对p取模后的值,这让佳佳十分的不开心,因为她无法找到一条能使她得到最大娱乐值的路径了!

她发现这个问题实在是太困难了,既然这样,那就只在3*n的矩阵内进行游戏吧!

现在的问题是,在一个3*n的带权矩阵中,从(1,1)走到(3,n),只能往右往下移动,问在模p意义下的移动过程中的权总和最大是多少。

实际上路径总是第一行1-i,第二行i-j,第三行j-n.

考虑问题的补,先求出矩阵的总和%p,不妨设为sum,那么减去没有走过的格子总和%p,不妨设为val。

而这个val可以表示为两个数列的前缀和和后缀和的值之和,需要动态调整找到最大的方案,使用set可以达到这个目标。

时间复杂度O(nlogn).

  1. # include <cstdio>
  2. # include <cstring>
  3. # include <cstdlib>
  4. # include <iostream>
  5. # include <vector>
  6. # include <queue>
  7. # include <stack>
  8. # include <map>
  9. # include <bitset>
  10. # include <set>
  11. # include <cmath>
  12. # include <algorithm>
  13. using namespace std;
  14. # define lowbit(x) ((x)&(-x))
  15. # define pi acos(-1.0)
  16. # define eps 1e-
  17. # define MOD
  18. # define INF
  19. # define mem(a,b) memset(a,b,sizeof(a))
  20. # define FOR(i,a,n) for(int i=a; i<=n; ++i)
  21. # define FDR(i,a,n) for(int i=a; i>=n; --i)
  22. # define bug puts("H");
  23. # define lch p<<,l,mid
  24. # define rch p<<|,mid+,r
  25. # define mp make_pair
  26. # define pb push_back
  27. typedef pair<int,int> PII;
  28. typedef vector<int> VI;
  29. # pragma comment(linker, "/STACK:1024000000,1024000000")
  30. typedef long long LL;
  31. inline int Scan() {
  32. int x=,f=; char ch=getchar();
  33. while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
  34. while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
  35. return x*f;
  36. }
  37. inline void Out(int a) {
  38. if(a<) {putchar('-'); a=-a;}
  39. if(a>=) Out(a/);
  40. putchar(a%+'');
  41. }
  42. const int N=;
  43. //Code begin...
  44.  
  45. int a[][N], inv1[N], inv2[N], sum1[N], sum2[N], n, p;
  46. set<int>vv;
  47. set<int>::iterator it;
  48.  
  49. void init(){
  50. FOR(i,,n) inv1[i]=(inv1[i-]+a[][i])%p, sum2[i]=(sum2[i-]+a[][i])%p;
  51. FDR(i,n,) inv2[i]=(inv2[i+]+a[][i])%p, sum1[i]=(sum1[i+]+a[][i])%p;
  52. FOR(i,,n-) inv1[i]=(inv1[i]+sum1[i+])%p;
  53. FDR(i,n+,) inv2[i]=(inv2[i]+sum2[i-])%p;
  54. }
  55. int main ()
  56. {
  57. int sum=, ans=;
  58. n=Scan(); p=Scan();
  59. FOR(i,,) FOR(j,,n) a[i][j]=Scan(), sum=(sum+a[i][j])%p;
  60. init();
  61. FDR(i,n-,) {
  62. vv.insert(inv2[i+]);
  63. int val=(sum-inv1[i]+p+)%p;
  64. it=vv.lower_bound(val);
  65. if (it==vv.end()) it=vv.begin();
  66. ans=max(ans,((sum-inv1[i]-*it)%p+p)%p);
  67. }
  68. printf("%d\n",ans);
  69. return ;
  70. }

51nod 1624 取余最短路(set)的更多相关文章

  1. 51nod 1624 取余最长路

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1624 题意: 思路:因为一共只有3行,所以只需要确定第一行和第二行的转折 ...

  2. 1624 取余最长路(set)

    1624 取余最长路 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 佳佳有一个n*m的带权矩阵,她想从(1,1)出发走到(n,m)且只能往右往下移动,她能得到的娱 ...

  3. 51 nod 1624 取余最长路 思路:前缀和 + STL(set)二分查找

    题目: 写这题花了我一上午时间. 下面是本人(zhangjiuding)的思考过程: 首先想到的是三行,每一行一定要走到. 大概是这样一张图 每一行长度最少为1.即第一行(i -1) >= 1, ...

  4. POJ 3070 + 51Nod 1242 大斐波那契数取余

    POJ 3070 #include "iostream" #include "cstdio" using namespace std; class matrix ...

  5. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  6. BZOJ 2118 墨墨的等式 (同余最短路)

    题目大意:已知B的范围,求a1x1+a2x2+...+anxn==B存在非负正整数解的B的数量,N<=12,ai<=1e5,B<=1e12 同余最短路裸题 思想大概是这样的,我们选定 ...

  7. 【CodeChef】LECOINS(同余最短路,背包DP)

    题意:给定n个物品,每个物品可以取无限次,每个物品有两种属性:价值v和颜色c 现在有q个询问,每次询问是否能取出价值和为S的方案,如有多解输出不同颜色种数的最大值 题意:看到BZOJ评论区有好心人说C ...

  8. 【同余最短路】洛谷 P2662 牛场围栏

    关于同余最短路的部分 [同余最短路]P3403跳楼机/P2371墨墨的等式 [P2662牛场围栏] 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕 ...

  9. 【同余最短路】【例题集合】洛谷P3403 跳楼机/P2371 墨墨的等式

    接触到的新内容,[同余最短路]. 代码很好写,但思路不好理解. 同余最短路,并不是用同余来跑最短路,而是通过同余来构造某些状态,从而达到优化时间空间复杂度的目的.往往这些状态就是最短路中的点,可以类比 ...

随机推荐

  1. 20155320 2016-2017-2 《Java程序设计》第的四周学习总结

    20155320 2016-2017-2 <Java程序设计>第的四周学习总结 教材学习内容总结 继承与多态 继承就是子承父类,避免重复定义共同行为,会使用extends关键词,表示会扩展 ...

  2. Android开发——你真的了解Dialog、Toast和Snackbar吗

    0. 前言 今天给大家带来一篇简单易懂的关于Android提醒小功能的文章.Dialog和Toast我们都不陌生,而Snackbar是Design Support库中提供的新控件,有些朋友可能还不了解 ...

  3. JDK核心源码

    一.核心包有哪些? Jdk的包中,除开了lang包下面的类,用得最多的应该要属于util包下面的类了, 本篇文章主要针对Jdk的util包下面的类(util目录下面的类,暂时不包括util 包下面的子 ...

  4. 优步uber司机不能绑定银行卡问题

    很多新加入的优步车主都发现现在不能绑定银行卡,不能绑定就收不到车费呀!现在优步公司给出的绑定地址是:http://ubercd.sojump.com/jq/4853671.aspx 但是提交后没有反映 ...

  5. 【BZOJ4698】[SDOI2008]Sandy的卡片

    [BZOJ4698][SDOI2008]Sandy的卡片 题面 flag倒了. bzoj 洛谷 题解 首先题目的区间加很丑对吧, 将每个串差分一下,就可以转化为 求: 给定\(N\)个串,求他们的最长 ...

  6. 1563: [NOI2009]诗人小G

    1563: [NOI2009]诗人小G https://lydsy.com/JudgeOnline/problem.php?id=1563 分析: 直接转移f[i]=f[j]+cost(i,j),co ...

  7. LVS入门篇(二)之LVS基础

    1. LVS介绍 LVS是Linux虚拟服务器(LinuxVirtualServers),使用负载均衡技术将多台服务器组成一个虚拟服务器.它为适应快速增长的网络访问需求提供了一个负载能力易于扩展,而价 ...

  8. eclipse中编译出现错误undefined reference to `_sbrk'

    1. 在eclipse中使用gcc-arm-none-eabi-7-2017-q4-major-win32编译代码的时候出现了undefined reference to `_sbrk' e:/pro ...

  9. jsp命名规则

    jsp也用驼峰规则命名即可,不要使用下划线,否则在tomcat中容易出现解析错误

  10. iOS 小技巧

    投影效果 scanBtn.layer.shadowColor = [UIColorblackColor].CGColor;//shadowColor阴影颜色     scanBtn.layer.sha ...