Description

两个PACMAN吃豆豆。一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方。PACMAN走到豆豆处就会吃掉它。PACMAN行走的路线很奇怪,只能向右走或者向上走,他们行走的路线不可以相交。 请你帮这两个PACMAN计算一下,他们俩加起来最多能吃掉多少豆豆。

Input

第一行为一个整数N,表示豆豆的数目。 接下来 N 行,每行一对正整数,表示第i个豆豆的坐标。任意两个豆豆的坐标都不会重合。

Output

仅有一行包含一个整数,即两个PACMAN加起来最多能吃掉的豆豆数量

Sample Input

8

8 1

1 5

5 7

2 2

7 8

4 6

3 3

6 4

Sample Output

7

HINT

N < = 2000

Source

拼尽全力优化,最后还是超时1个点。。。

裸的费用流

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. #include<algorithm>
  6. using namespace std;
  7.  
  8. const int INF=0x7fffffff;
  9.  
  10. struct Edge
  11. {
  12. int from,to,v,c,next;
  13. }E[];
  14. int node=;
  15. int head[],from[],dis[],vis[];
  16.  
  17. int n,ans,S,T;
  18. struct point
  19. {
  20. int x,y;
  21. }P[];
  22.  
  23. int read()
  24. {
  25. int x=,f=;char ch=getchar();
  26. while(ch<''||ch>''){if(ch=='-')f=-f;ch=getchar();}
  27. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  28. return x*f;
  29. }
  30.  
  31. void ins(int from,int to,int v,int c)
  32. {
  33. node++;
  34. E[node]=(Edge){from,to,v,c,head[from]};
  35. head[from]=node;
  36. }
  37.  
  38. void insert(int from,int to,int v,int c)
  39. {
  40. ins(from,to,v,c);ins(to,from,,-c);
  41. }
  42.  
  43. bool spfa()
  44. {
  45. queue<int> Q;
  46. for(int i=;i<=T;i++) dis[i]=-INF;
  47. Q.push();dis[]=;vis[]=;
  48. while(!Q.empty())
  49. {
  50. int q=Q.front();Q.pop();
  51. for(int i=head[q];i;i=E[i].next)
  52. if(E[i].v>&&dis[q]+E[i].c>dis[E[i].to])
  53. {
  54. dis[E[i].to]=dis[q]+E[i].c;
  55. from[E[i].to]=i;
  56. if(!vis[E[i].to])
  57. {
  58. Q.push(E[i].to);
  59. vis[E[i].to]=;
  60. }
  61. }
  62. vis[q]=;
  63. }
  64. return dis[T]!=-INF;
  65. }
  66.  
  67. void mcf()
  68. {
  69. int x=INF;
  70. for(int i=from[T];i;i=from[E[i].from])
  71. x=min(E[i].v,x);
  72. for(int i=from[T];i;i=from[E[i].from])
  73. {
  74. ans+=x*E[i].c;
  75. E[i].v-=x;E[i^].v+=x;
  76. }
  77. }
  78.  
  79. bool cmp(point a,point b)
  80. {
  81. return a.x<b.x||(a.x==b.x&&a.y<b.y);
  82. }
  83.  
  84. int main()
  85. {
  86. n=read();T=*n+;S=T-;
  87. for(int i=;i<=n;i++)
  88. P[i].x=read(),P[i].y=read();
  89. sort(P+,P+n+,cmp);
  90. insert(,S,,);
  91. for(int i=;i<=n;i++)
  92. {
  93. insert(S,i,,);
  94. insert(i,i+n,,);
  95. insert(i,i+n,,);
  96. insert(i+n,T,,);
  97. }
  98. for(int i=;i<=n;i++)
  99. {
  100. int inf=INF;
  101. for(int j=i+;j<=n;j++)
  102. {
  103. if(P[i].y<=P[j].y)
  104. {
  105. if(P[j].y<inf)
  106. insert(i+n,j,,);
  107. inf=min(inf,P[j].y);
  108. }
  109. }
  110. }
  111. while(spfa())
  112. mcf();
  113. printf("%d",ans);
  114. return ;
  115. }

[bzoj]1930 pacman吃豆豆的更多相关文章

  1. bzoj 1930: [Shoi2003]pacman 吃豆豆 [费用流]

    1930: [Shoi2003]pacman 吃豆豆 题意:两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的 ...

  2. 1930: [Shoi2003]pacman 吃豆豆

    1930: [Shoi2003]pacman 吃豆豆 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1969  Solved: 461[Submit][ ...

  3. 【BZOJ1930】[Shoi2003]pacman 吃豆豆 最大费用最大流

    [BZOJ1930][Shoi2003]pacman 吃豆豆 Description 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会 ...

  4. 【BZOJ 1930】 [Shoi2003]pacman 吃豆豆 最大费用最大流

    如果你知道他是网络流的话你就很快会想到一个最大费用最大流的模型,然后你发现可能T,然而你发现你只用增广两次,然后你就开心的打了出来,然后发现被稠密图里spfa的丧病时间复杂度坑了,还是会T.于是我就开 ...

  5. BZOJ1930 [Shoi2003]pacman 吃豆豆

     dp,首先建出图,f[i][j]表示a吃到了i点,b吃到了j点的最大值,转移的时候转移拓扑序小的那一维,如果i拓扑序小于j,那么转移到f[k][j],否则转移到f[i][k],建出的图边数也要优化, ...

  6. 【BZOJ1930】【SHOI2003】吃豆豆

    初见杀…… 原题: 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪,只能向右走或者向上走,他们行 ...

  7. 洛谷 P4066 [SHOI2003]吃豆豆 解题报告

    P4066 [SHOI2003]吃豆豆 题目描述 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪 ...

  8. HTML5吃豆豆游戏开发实战(一)使用Canvas绘制游戏主角

    近期在学习HTML5.爱因斯坦曾说过,"最好的学习就是自己去经历". 于是.我想在学习HTML5的同一时候.做一款简单的小游戏,这样学习起来也会非常有趣的.我想做的是曾经小时候玩儿 ...

  9. css动画实现吃豆豆

    话不多说,直接上代码:(作为一个初学者写的代码,多么0基础都能看的懂吧.) HTML部分 <!DOCTYPE html> <html lang=en> <head> ...

随机推荐

  1. java CDI

    Scope声明周期 http://www.cnblogs.com/yjmyzz/p/javaee-cdi-bean-scope.html

  2. day7计算作业详解

    1.day7题目 1.判断一个数是否是水仙花数, 水仙花数是一个三位数, 三位数的每一位的三次方的和还等于这个数. 那这个数就是一个水仙花数, 例如: 153 = 13 + 53 + 3**3 2.给 ...

  3. js 检查字符串中是否包含中文(正则)

    function CheckChinese(val){ var reg = new RegExp("[\\u4E00-\\u9FFF]+","g"); if(r ...

  4. [LOJ 2039] 「SHOI2015」激光发生器

    [LOJ 2039] 「SHOI2015」激光发生器 链接 链接 题解 分为两个部分 第一个是求直线之间的交点找到第一个触碰到的镜面 第二个是求直线经过镜面反射之后的出射光线 第一个很好做,第二个就是 ...

  5. Tkinter 的三大布局管理器 pack、grid 和 place用法汇总

    学习python的tkinter免不了要对各个组件进行位置的排放与设定,常用的布局管理器有grid,pack和place.这三种均用于同一父组件下的组件布局,但是也是有区别的,先看下他们各自的含义吧. ...

  6. .NET Core模块化

    .NET Core模块化 源码地址 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:https://nm.iamoldli.com账户:ad ...

  7. Net Core下通过Proxy 模式

    Net Core下通过Proxy 模式 NET Core下的WCF客户端也是开源的,这次发布.NET Core 2.0,同时也发布了 WCF for .NET Core 2.0.0, 本文介绍在.NE ...

  8. CSS——三种页面引入方法

    目的:为了把样式和内容分开,并且使网页元素更加丰富,引入了CSS CSS页面引入有三种方式: 1)内联式:比较不常用,因为内容和样式仍然在一起,不方便.示例: <!DOCTYPE html> ...

  9. 机器学习框架ML.NET学习笔记【9】自动学习

    一.概述 本篇我们首先通过回归算法实现一个葡萄酒品质预测的程序,然后通过AutoML的方法再重新实现,通过对比两种实现方式来学习AutoML的应用. 首先数据集来自于竞赛网站kaggle.com的UC ...

  10. 获取jqGrid中选择的行的数据

    下面可以获取选择一行的id,如果你选择多行,那下面的id是最后选择的行的id: var id=$(‘#gridTable’).jqGrid(‘getGridParam’,'selrow’); 如果想要 ...