【BZOJ1930】【SHOI2003】吃豆豆
初见杀……
原题:
两个PACMAN吃豆豆。一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方。PACMAN走到豆豆处就会吃掉它。PACMAN行走的路线很奇怪,只能向右走或者向上走,他们行走的路线不可以相交。 请你帮这两个PACMAN计算一下,他们俩加起来最多能吃掉多少豆豆。
N < = 2000
一眼秒掉,拆点费用流
然后发现内存64M???减少边的数组,提交,RE……
看chty的题解,更换建图方式,减少边数,提交,WA……
然后我的上午没了

解题思路很简单,拆点费用流即可,关键就在减少边数上
先按x第一优先级y第二优先级升序排序,然后对于每个点i从i+1往后扫,同时记录一个max(初值为oo),对于某个扫到的点j,如果a[j]>=a[i]且a[j]<max,就连边并max=a[j]
然后对于每个拆开的点中间连费用为1的边基础上再连费用为0的边,这样做是为了配合上面的建图方式使得前面的点能跳过这个点扫到后面的点
注意一定要连费用为0,否则后果就是直接被干掉一个上午/下午/晚上
主要原因还是因为看到这种建图方式后没有深刻理解就直接写上去了,导致最后没有连出费用为0的边
心好累,实在看不懂怎么建图就看代码把,注意不要忘了费用为0的边
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
const int oo=;
ll rd(){ll z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
struct dcd{ll x,y;}a[];
bool cmp(dcd x,dcd y){ return (x.x==y.x)?(x.y<y.y):(x.x<y.x);}
//bool cmp(dcd x,dcd y){ return x.x<y.x;}
struct ddd{int nxt,y,v,rvs,c;}e[]; int lk[],ltp=;
inline void ist(int x,int y,int z,int _cst){
e[++ltp].nxt=lk[x],lk[x]=ltp,e[ltp].y=y,e[ltp].v=z,e[ltp].rvs=ltp+,e[ltp].c=_cst;
e[++ltp].nxt=lk[y],lk[y]=ltp,e[ltp].y=x,e[ltp].v=,e[ltp].rvs=ltp-;e[ltp].c=-_cst;
}
int n; int s,t,ss;
int lst[],lst_e[];
int dst[];
int q[],hd=,tl=,qt=; bool vstd[];
bool spfa(){
memset(dst,-,sizeof(dst));
q[hd=]=s; tl=; vstd[s]=true; dst[s]=;
//for(int k=1;k<=hd;++k){
while(tl!=hd){
int k=tl=(tl==qt ? : tl+);
for(int i=lk[q[k]];i;i=e[i].nxt)
if(e[i].v && dst[q[k]]+e[i].c>dst[e[i].y]){
dst[e[i].y]=dst[q[k]]+e[i].c;
lst[e[i].y]=q[k],lst_e[e[i].y]=i;
if(!vstd[e[i].y]) q[hd=(hd==qt ? : hd+)]=e[i].y,vstd[e[i].y]=true;
}
vstd[q[k]]=false;
}
return dst[t]>;
}
int cstflw(){
int bwl=,mnflw=oo;
while(spfa()){
mnflw=oo;
for(int i=t;i!=s;i=lst[i]) mnflw=min(mnflw,e[lst_e[i]].v);
for(int i=t;i!=s;i=lst[i]){
bwl+=mnflw*e[lst_e[i]].c;
//cout<<lst[i]<<" "<<i<<" "<<e[lst_e[i]].c<<endl;
e[lst_e[i]].v-=mnflw,e[e[lst_e[i]].rvs].v+=mnflw;
}
}
return bwl;
}
int main(){//freopen("ddd.in","r",stdin);
//freopen("ddd.out","w",stdout);
memset(vstd,,sizeof(vstd));
cin>>n; s=,t=n+n+,ss=t+;
for(int i=;i<=n;++i) a[i].x=rd(),a[i].y=rd();
sort(a+,a+n+,cmp);
//for(int i=1;i<=n;++i) cout<<a[i].x<<" "<<a[i].y<<endl;
for(int i=;i<=n;++i){
int mx=oo;
for(int j=i+;j<=n;++j)
if(a[j].y>=a[i].y && a[j].y<=mx) ist(i+n,j,oo,),mx=a[j].y;
//if(a[j].y>=a[i].y && a[j].x>=a[i].x) ist(i+n,j,oo,0);
ist(ss,i,oo,),ist(i+n,t,oo,),ist(i,i+n,,),ist(i,i+n,,);
}
ist(s,ss,,);
cout<<cstflw()<<endl;
return ;
}
【BZOJ1930】【SHOI2003】吃豆豆的更多相关文章
- 洛谷 P4066 [SHOI2003]吃豆豆 解题报告
P4066 [SHOI2003]吃豆豆 题目描述 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪 ...
- 【BZOJ1930】[Shoi2003]pacman 吃豆豆 最大费用最大流
[BZOJ1930][Shoi2003]pacman 吃豆豆 Description 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会 ...
- bzoj 1930: [Shoi2003]pacman 吃豆豆 [费用流]
1930: [Shoi2003]pacman 吃豆豆 题意:两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的 ...
- 1930: [Shoi2003]pacman 吃豆豆
1930: [Shoi2003]pacman 吃豆豆 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1969 Solved: 461[Submit][ ...
- [bzoj]1930 pacman吃豆豆
Description 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪,只能向右走或者向上走,他 ...
- HTML5吃豆豆游戏开发实战(一)使用Canvas绘制游戏主角
近期在学习HTML5.爱因斯坦曾说过,"最好的学习就是自己去经历". 于是.我想在学习HTML5的同一时候.做一款简单的小游戏,这样学习起来也会非常有趣的.我想做的是曾经小时候玩儿 ...
- css动画实现吃豆豆
话不多说,直接上代码:(作为一个初学者写的代码,多么0基础都能看的懂吧.) HTML部分 <!DOCTYPE html> <html lang=en> <head> ...
- BZOJ1930 [Shoi2003]pacman 吃豆豆
dp,首先建出图,f[i][j]表示a吃到了i点,b吃到了j点的最大值,转移的时候转移拓扑序小的那一维,如果i拓扑序小于j,那么转移到f[k][j],否则转移到f[i][k],建出的图边数也要优化, ...
- 【BZOJ 1930】 [Shoi2003]pacman 吃豆豆 最大费用最大流
如果你知道他是网络流的话你就很快会想到一个最大费用最大流的模型,然后你发现可能T,然而你发现你只用增广两次,然后你就开心的打了出来,然后发现被稠密图里spfa的丧病时间复杂度坑了,还是会T.于是我就开 ...
随机推荐
- POJ 1936 All in All 匹配, 水题 难度:0
题目 http://poj.org/problem?id=1936 题意 多组数据,每组数据有两个字符串A,B,求A是否是B的子串.(注意是子串,也就是不必在B中连续) 思路 设置计数器cnt为当前已 ...
- sqlalchemy tree 树形分类 无限极分类的管理。预排序树,左右值树。sqlalchemy-mptt
简介: 无限极分类是一种比较常见的数据格式,生成组织结构,生成商品分类信息,权限管理当中的细节权限设置,都离不开无限极分类的管理. 常见的有链表式,即有一个Pid指向上级的ID,以此来设置结构.写的时 ...
- .net core 之Hangfire任务调度
Hangfire可用作任务调度,类似延迟任务.队列任务.批量任务和定时任务等. 一.nuget Hangfire包 找到Hangfire.AspNetCore和Hangfire.SqlServer包, ...
- ssh免密登陆
1:建立新用户hadoop 2:进入/home/hadoop/.ssh/目录 3:所有要免密连接的终端运行: ssh-keygen -t rsa 三次回车后会产生:id_rsa,id_rsa.pub两 ...
- Android开发 ---如何操作资源目录中的资源文件2
Android开发 ---如何操作资源目录中的资源文件2 一.颜色资源管理 效果图: 描述: 1.改变字体的背景颜色 2.改变字体颜色 3.改变按钮颜色 4.图像颜色切换 操作描述: 点击(1)中的颜 ...
- byte[]->new String(byte[]) -> getByte()引发的不一致问题
今天接短信接口,短信接口提供了sdk,我们可以直接用sdk发送请求然后发送对应短信. 但是想使用我们平台自定义的httpUtil实现. 然而忙了1天半,才解决这个问题,还是我同事帮忙找出问题并解决的. ...
- redis_key键
exists k1,判断k1是否存在,‘1’就是存在,‘0’ 就是不存在 move k3 2 --->这里就是说把k3移动到2号库. ‘1’为成功,‘0’为失败 ttl k2 --查看k2 ...
- 利用node,跑项目。
(前提是已经安装了node) 一.简单介绍 Vue开发|文件目录结构部署 目录结构 ├── index.html 入口页面 ├── build 构建脚本目录 │ ├── build-server.j ...
- pytest的fixture和conftest
解决问题:用例1需要先登录,用例2不需要登录,用例3需要先登录.很显然这就无法用setup和teardown来实现了,这个时候就可以自定义测试用例的预置条件,比setup灵活很多. 1.fixture ...
- MongoDB的安装及安装为windows服务
首先在网上找了一篇教程,于是按着做,下载了最新版的安装包,解压以后目录是这样的: 没有bin目录啊 原因:zip没有经过编译 于是下载安装包,安装包是msi 一直按照next提示就可以了,但是记得选择 ...