题意:

佳佳有一个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. 第四篇 前端学习之JQuery基础

    一 jQuery是什么? jQuery就是一个JavaScript的库. <1> jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入 ...

  2. 7个Node.js的Web框架

    NodeJS也就是Node,是众所周知的使用javascript构建Web应用框架,它启动一个服务器非常简单,如下: var http = require('http'); http.createSe ...

  3. 常用JDBC数据库驱动包和类名

    MySQL数据库: 1)驱动包:https://mvnrepository.com/artifact/mysql/mysql-connector-java(下载路径) 2)驱动类名:com.mysql ...

  4. ArcFace Demo [Android]

    Free SDK demo 工程如何使用? 1.下载代码:git clone https://github.com/asdfqwrasdf/ArcFaceDemo.git 或者直接下载压缩包 2.前往 ...

  5. Fedora 26/27/28网易云音乐安装

    信息从 https://www.southcity-oldboy.com/1474.html获取,感谢站长南城旧少年! 以下为前辈网页上的内容 1.安装 RPM Fusion 源 (free): ht ...

  6. 亚马逊6月18日发布惊世之作 或为3D智能手机

    亚马逊将在 6 月 18 日举行一个产品发布会. 其内容可能是关于传闻已久的亚马逊智能手机.该公司在 YouTube 上公布了一段炫耀这款设备的视频.这段视频展示了很多人在这款产品前摇头晃脑,并且表现 ...

  7. 初试Gevent – 高性能的Python并发框架

    Gevent是一个基于greenlet的Python的并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效. 于greenlet.eventlet相比,性能 ...

  8. mysqldb下载地址

    mysqldb x64    https://pan.baidu.com/s/1dFJ3G0T x32及源码 https://pypi.python.org/pypi/MySQL-python/1.2 ...

  9. 3D打印产业链全景图

  10. 【算法设计与数据结构】为何程序员喜欢将INF设置为0x3f3f3f3f?(转)

    摘自https://blog.csdn.net/jiange_zh/article/details/50198097 在算法竞赛中,我们常常需要用到一个“无穷大”的值,对于我来说,大多数时间我会根据具 ...