洛谷 P4066 [SHOI2003]吃豆豆 解题报告
P4066 [SHOI2003]吃豆豆
题目描述
两个PACMAN吃豆豆。一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方。PACMAN走到豆豆处就会吃掉它。PACMAN行走的路线很奇怪,只能向右走或者向上走,他们行走的路线不可以相交。 请你帮这两个PACMAN计算一下,他们俩加起来最多能吃掉多少豆豆。
输入输出格式
输入格式:
第一行为一个整数N,表示豆豆的数目。 接下来 N 行,每行一对正整数,表示第i个豆豆的坐标。任意两个豆豆的坐标都不会重合。
输出格式:
仅有一行包含一个整数,即两个PACMAN加起来最多能吃掉的豆豆数量
输入输出样例
输入样例#1:
8
8 1
1 5
5 7
2 2
7 8
4 6
3 3
6 4
输出样例#1:
7

说明:
N < = 2000
先考虑暴力一点的
其实应该算是个比较裸的费用流建模了。
拆点分别连容量和权值边各为1,代表通过这个点获得1且仅可以走一次。
源点1连源点2容量2,表示两个人走。其余容量inf,权值为0
关于两个人相交的部分,其实是无所谓的,可以交换
直接跑最大费用最大流即可
考虑优化
连边时连接了很多无用的边,比如某两个点本来就间接可达,又连接了直接的边。
我们可以只连间接可达的边。然而这样会出现问题,因为我们限制了一个点只能走一次。
好办,我们把拆的点再连一个容量为inf,权值为0的点,代表可以多次走但不产生答案
关于连边,按两个关键字排序以后,从左往右只连接x递增而y递减的边。其实有点计算几何的影子
Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
const int N=4050;
const int M=400010;
const int inf=0xcfcfcfcf;
int head[N],edge[M],f[M],to[M],Next[M],cnt=1,t,ans;
void add(int u,int v,int w,int flow)
{
to[++cnt]=v;edge[cnt]=w;f[cnt]=flow;Next[cnt]=head[u];head[u]=cnt;
to[++cnt]=u;edge[cnt]=-w;f[cnt]=0;Next[cnt]=head[v];head[v]=cnt;
}
std::pair <int,int > dx[N>>1];
int n;
std::queue <int > q;
int dis[N],used[N],pre[N];
bool spfa()
{
memset(dis,0xcf,sizeof(dis));
dis[0]=0;
q.push(0);
while(!q.empty())
{
int u=q.front();
used[u]=0;
q.pop();
for(int i=head[u];i;i=Next[i])
{
int v=to[i],w=edge[i];
if(f[i]&&dis[v]<dis[u]+w)
{
dis[v]=dis[u]+w;
pre[v]=i;
if(!used[v])
{
used[v]=1;
q.push(v);
}
}
}
}
return dis[t]!=inf;
}
void augment()
{
ans+=dis[t];
int now=t;
while(now)
{
f[pre[now]^1]+=1;
f[pre[now]]-=1;
now=to[pre[now]^1];
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&dx[i].first,&dx[i].second);
std::sort(dx+1,dx+1+n);
for(int i=1;i<=n;i++)
{
int mi=-inf;
for(int j=i+1;j<=n;j++)
if(dx[j].second<mi&&dx[j].second>=dx[i].second)
{
add(i+n,j,0,-inf);
mi=dx[j].second;
}
}
t=n*2+2;
for(int i=1;i<=n;i++)
{
add(i,i+n,1,1);
add(i,i+n,0,-inf);
add(n*2+1,i,0,-inf);
add(i+n,t,0,-inf);
}
add(0,n*2+1,0,2);
while(spfa())
augment();
printf("%d\n",ans);
return 0;
}
2018.7.13
洛谷 P4066 [SHOI2003]吃豆豆 解题报告的更多相关文章
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- 洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告
P4100 [HEOI2013]钙铁锌硒维生素 题目描述 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加 宇宙比赛的饮食. 众所周知,前往宇宙的某个星球,通常要花费好长好长的时间, ...
- 洛谷 P4074 [WC2013]糖果公园 解题报告
P4074 [WC2013]糖果公园 糖果公园 树上待修莫队 注意一个思想,dfn序处理链的方法,必须可以根据类似异或的东西,然后根据lca分两种情况讨论 注意细节 Code: #include &l ...
- 洛谷 P2473 [SCOI2008]奖励关 解题报告
P2473 [SCOI2008]奖励关 题目描述 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出\(k\)次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝 ...
- 洛谷 P2805 [NOI2009]植物大战僵尸 解题报告
P2805 [NOI2009] 植物大战僵尸 题目描述 Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plan ...
随机推荐
- Swift入门基础知识
var //代表变量,变量的值可以改变 let//代表常量类型不可改变 //声明常量heh类型Swift会自动根据你的值来自动判断该变量的类型也可以指定类型(个人感觉还是指定类型的比较好,可能会减少系 ...
- 转 gerrit
开发环境 https://blog.csdn.net/u013207966/article/details/79112740 先记录下我的开发环境以及要正确安装gerrit需要用到的工具: Redha ...
- 列出连通集(mooc)
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1 ...
- Python常用模块之VideoCapture
官方网址:http://videocapture.sourceforge.net/ 功能介绍: VideoCapture是Win32版Python的一个扩展,可以访问视频采集设备(如USB摄像头) ...
- Python 并行分布式框架:Celery 超详细介绍
本博客摘自:http://blog.csdn.net/liuxiaochen123/article/details/47981111 先来一张图,这是在网上最多的一张Celery的图了,确实描述的非常 ...
- qq浏览器的用户体验
用户界面: qq浏览器的用户界面简介,把一些不必要的东西去点,可以很容易让用户找到自己想看的网页,很方便. 记住用户的选择: qq浏览器和QQ相连,可是用QQ账户登录,并且会记住自己访问的高频网页,以 ...
- lintcode-223-回文链表
223-回文链表 设计一种方式检查一个链表是否为回文链表. 样例 1->2->1 就是一个回文链表. 挑战 O(n)的时间和O(1)的额外空间. 标签 链表 思路 找到链表中点后,翻转链表 ...
- Thrift语法参考
1.Types Thrift类型系统包括预定义基本类型,用户自定义结构体,容器类型,异常和服务定义 (1) 基本类型 bool: 布尔类型,占一个字节 byte: 有符号字节 i16:16位有符号整型 ...
- WPF浏览器应用程序与JS的互调用(不用WebBrowser)
首先说些题外话,很久没有写博客了,空间里面的大部分文章还是11年写的.那时候刚毕业就来到这家公司,参与到一个Asp.net MVC的项目开发中,这个项目是一个全新的项目,连项目开发框架都没有,亏得领导 ...
- HDFS shell命令行常见操作
hadoop学习及实践笔记—— HDFS shell命令行常见操作 附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop ...