sol:第一题就DP?!然后写了O(n^2) dp再考虑优化!!!(尽量部分分带上!!!)

我写了正确的dp然后优化错了,具体的dp方法是考虑到对于右侧到左侧他是没有后效性的

所以定义f[i]为i及以后最大的代价和,对于合法的j,转移f[i]=max{f[j]+P[i]},j需要满足a[i]+x[i]<a[j],j>=i

由于给出的a[i]递增然后我只要往i的右侧找到第一个合法的j然后转移就行了,复杂度O(n log n)

我错在了用堆来优化,然后把后面的删掉了,其实可以再前面的从被误删的东西转移而来。

code:

  1. # include <bits/stdc++.h>
  2. # ifdef O_2
  3. # pragma GCC optimze()
  4. # endif
  5. # define int long long
  6. using namespace std;
  7. const int MAXN=1e5+;
  8. int f[MAXN],a[MAXN],x[MAXN],p[MAXN];
  9. int n;
  10. inline int read()
  11. {
  12. int X=,w=;char c=;
  13. while (!(c>=''&&c<='')) w|=c=='-',c=getchar();
  14. while (c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
  15. return w?-X:X;
  16. }
  17. inline void write(int x)
  18. {
  19. if (x<) { x=-x;putchar('-');}
  20. if (x>) write(x/);
  21. putchar(''+x%);
  22. }
  23. inline void writeln(int x) { write(x);putchar('\n');}
  24. signed main()
  25. {
  26. n=read();
  27. for (int i=;i<=n;i++)
  28. a[i]=read(),p[i]=read(),x[i]=read();
  29. f[n]=p[n];
  30. for (int i=n-;i>=;i--) {
  31. f[i]=f[i+];
  32. int j=upper_bound(a+i+,a++n,a[i]+x[i])-a;
  33. f[i]=max(max(f[i],p[i]),f[j]+p[i]);
  34. }
  35. writeln(f[]);
  36. return ;
  37. }

sol:这道题目对于100%的数据n,m<=3000,显然发现这一定是O(n2)的算法,

然后如果对于X1到X2的最短路径设为R1,X3到X4最短路劲R2,要求R1和R2交的尽可能多,那么这个解一定更优

首先一定要在最短路上,其次要求R1和R2尽可能交的更多,我们不妨设刚开始交的地方设为i,交结束的地方设为j

我们先求出X1,X2,X3,X4到各点的最短路D1,D2,D3,D4

我们枚举i然后再枚举j 由上图可以看出就是D1[i]+D2[j]+D3[i]+D4[j]+dist(i,j)在枚举j之前我们可以O(n)求出i的最短路D5

那么就是最小化D1[i]+D2[j]+D3[i]+D4[j]+D5[j],

然后我们交换(X1,X2)or (X3,X4) 之中的任意一对然后再求min,就是D1[i]+D2[j]+D3[j]+D4[i]+D5[j],

然后对于每一次枚举Ans=Min(D1[i]+D2[j]+D3[i]+D4[j]+D5[j],D1[i]+D2[j]+D3[j]+D4[i]+D5[j],ans)

对于一个显然的情况我们最后特判就是直接 X1走到X2,X3 走到 X4 最短路虽然并没有重复的路 即 ans=Min(ans,D1[X2]+D3[X4]);

code:

  1. # include <bits/stdc++.h>
  2. # ifdef O_2
  3. # pragma GCC optimze()
  4. # endif
  5. using namespace std;
  6. const int MAXN=;
  7. int n,m,X1,X2,X3,X4;
  8. int D1[MAXN],D2[MAXN],D3[MAXN],D4[MAXN],D5[MAXN];
  9. int tot=,head[MAXN];
  10. bool vis[MAXN];
  11. struct rec{ int pre,to,w;}a[MAXN*];
  12. inline int read()
  13. {
  14. int X=,w=;char c=;
  15. while (!(c>=''&&c<='')) w|=c=='-',c=getchar();
  16. while (c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
  17. return w?-X:X;
  18. }
  19. inline void write(int x)
  20. {
  21. if (x<) { x=-x;putchar('-');}
  22. if (x>) write(x/);
  23. putchar(''+x%);
  24. }
  25. inline void writeln(int x) { write(x);putchar('\n');}
  26. void adde(int u,int v,int w)
  27. {
  28. a[++tot].pre=head[u];
  29. a[tot].to=v;
  30. a[tot].w=w;
  31. head[u]=tot;
  32. }
  33. struct node{ int id,dist;};
  34. int d[MAXN];
  35. queue<node>q;
  36. void bfs(int s)
  37. {
  38. memset(vis,false,sizeof(vis));
  39. memset(d,0x3f,sizeof(d));
  40. d[s]=; vis[s]=;
  41. q.push((node){s,});
  42. while (!q.empty()) {
  43. node u=q.front();q.pop();
  44. for (int i=head[u.id];i;i=a[i].pre) {
  45. int v=a[i].to;
  46. if (vis[v]) continue;
  47. vis[v]=;
  48. d[v]=u.dist+;
  49. q.push((node){v,d[v]});
  50. }
  51. }
  52. }
  53. int Min(int a,int b,int c)
  54. {
  55. if (b<a) a=b;
  56. if (c<a) a=c;
  57. return a;
  58. }
  59. int main()
  60. {
  61. n=read();m=read();
  62. X1=read();X2=read();X3=read();X4=read();
  63. int u,v;
  64. for (int i=;i<=m;i++) {
  65. u=read();v=read();
  66. adde(u,v,); adde(v,u,);
  67. }
  68. bfs(X1); memcpy(D1,d,sizeof(d));
  69. bfs(X2); memcpy(D2,d,sizeof(d));
  70. bfs(X3); memcpy(D3,d,sizeof(d));
  71. bfs(X4); memcpy(D4,d,sizeof(d));
  72. int ans=m;
  73. for (int i=;i<=n;i++) {
  74. bfs(i); memcpy(D5,d,sizeof(d));
  75. for (int j=;j<=n;j++)
  76. ans=Min(ans,D1[i]+D3[i]+D2[j]+D4[j]+D5[j],D1[i]+D4[i]+D3[j]+D2[j]+D5[j]);
  77. }
  78. ans=min(ans,D1[X2]+D3[X4]);
  79. writeln(ans);
  80. return ;
  81. }

HGOI20181031 模拟题解的更多相关文章

  1. HGOI20181029模拟题解

    HGOI20181029模拟题解 /* sxn让我一定要谴责一下出题人和他的数据! */ problem: 给出十进制数a,b,然后令(R)10=(a)10*(b)10,给出c表示一个k进制数(1&l ...

  2. 【 P3952】 时间复杂度 大模拟题解

    题目链接 完全模拟 1.模拟结果 当我们的模拟程序执行结束时,直接执行模拟结果函数,用于比对我们的结果和数据给出的结果. bool yes(char a[],char b[]) { ;i<=;+ ...

  3. HGOI20181030 模拟题解

    problem:给定一个序列,问你能不能通过一次交换把他弄成有序 sol: 对于0%的数据,满足数列是一个排列,然后我就打了这档分(自己瞎造的!) 对于100%的数据,显然我们先对数列进行排序然后上下 ...

  4. CSYZDay2模拟题解

    T1.rotate [问题描述] ZYL有N张牌编号分别为1, 2,……,N.他把这N张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第i个位置的牌的编号为i,我们就称之为固定点.旋 ...

  5. CSYZDay1模拟题解

    T1.game [问题描述] LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2*M,以此类推,第N行的数字是(N-1)*M+ ...

  6. 2019-06-03 校内python模拟题解(所有非原题)

    一起来女装吧 本题改编自USACO(USA Computing Olympiad) 1.1节的第一题 (感谢lsy同学对本题题面的贡献) 直接计算就好了 chr:将ASCII码转成字符 ord:字符对 ...

  7. ZOJ Monthly, June 2014 月赛BCDEFGH题题解

    比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...

  8. hdu_5818_Joint Stacks(线段树模拟)

    题目链接:hdu_5818_Joint Stacks 题意: 给你两个栈,多了个合并操作,然后让你模拟 题解: 很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度 ...

  9. CSU 1862 The Same Game(模拟)

    The Same Game [题目链接]The Same Game [题目类型]模拟 &题解: 写这种模拟题要看心态啊,还要有足够的时间,必须仔细读题,一定要写一步,就调试一步. 这题我没想到 ...

随机推荐

  1. 网络运营商名称显示&amp;SIM名称显示

    一 网络名称显示这部分比較复杂.Spec对这也有明白的规定,依据其优先级由高往低介绍(其优先级參考TS 22.101), 1.       Enhanced Operator Name String. ...

  2. SQL_sql语言的学习

    关系数据库SQL sql基本功能 SQLde 基本概念 主要知识点 1.外模式包含若干视图和部分基本表 2.模式包含若干基本表 3.内模式包含若干存储文件 4操作对象 基本表:本身独立存在的表,一个关 ...

  3. 2017-2018-2 『网络对抗技术』Exp2:后门原理与实践

    1. 后门原理与实践实验说明及预备知识 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 (0.5分) 任务二:使用socat获取主机操作Shell, 任务计划启动 (0.5 ...

  4. IP 解析器(IpParser) test 和 生产环境 实现

    注意:之前我maven居然没有引入 StringUtils 的包,然后引入了一个路径类似,但其实包路径不一样的 StringUtils ,居然是划掉的状态,像这样 StringUtils ,这个其实不 ...

  5. Visual Studio控制台程序输出窗口一闪而过的解决方法

    转载大牛的博客,自己也遇到了类似的问题,解决方法很详细,也很管用   刚接触 Visual Studio的时候大多数人会写个Hello World的程序试一下,有的人会发现执行结束后输出窗口会一闪而过 ...

  6. WebService技术,服务端and客户端JDK-wsimport工具(一)

    使用webservice服务,需要了解几个名词:soap 简单对象协议.http+xml . WSDL 先看下代码结构: 服务端代码与客户端代码分别处于两不同的包中 一.服务端内容 服务端: @Web ...

  7. Web项目开发流程 PC端

      一.了解.明确需求. 这个应该是第一步了,不了解需求你就不知道为什么要做,要怎么去做这个项目的工作. (1)明确需求是相当重要的,很有必要去和产品经理.设计人员去沟通,需要明白每一个按钮,每一个开 ...

  8. idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输

    众所周知,HTTPS是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立“SSL”通道,确保数据运输 ...

  9. [paper]MaskFusion: Real-Time Recognition, Tracking and Reconstruction of Multiple Moving Objects

    Before 近期在调研关于RGBD在室内移动机器人下的语义导航的研究.目前帝国理工的Andrew Davison在这边有两个团队在研究,分别是Fusion++ 和 这篇 MaskFusion.这篇是 ...

  10. sqli-labs 下载、安装

    sqli-labs 下载.安装 下载地址:https://github.com/Audi-1/sqli-labs phpstudy:http://down.php.cn/PhpStudy2018021 ...