【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.于是我就开 ...
随机推荐
- python-递归,二分查找
# print(list("胡辣汤")) # lst = ["河南话", "四川话", "东北", "山东&q ...
- loj6277
题解: 树状数组模板提 代码: #include<bits/stdc++.h> using namespace std; ; int num[N],n,a[N],l,r,c,opt; vo ...
- 【原创】<Debug> not positioned on a valid record
[Problem] QSqlQuery::value: not positioned on a valid record QSqlQuery :: value:未定位在有效记录上 [Solution] ...
- json 2017-04-21 10 17
jo := SO(); jo.S['tttt'] := 'tttt'; TbSendedTidJson['jo'] := jo; ja := TbSendedTidJson['jo'];//取出来后, ...
- 关于js的对象原型继承(二)
本章讨论使用new一个构造函数来创建一个对象. 前期知识点说明: 1.prototype是函数的一个属性,每个函数都有一个prototype属性.这个属性是一个指针,指向一个对象.它是显示修改对象的原 ...
- java阶段学习目标
0-1年: <java编程思想> 1-2年: <大话设计模式>http://www.cnblogs.com/zuoxiaolong/p/pattern26.html <重 ...
- Cracking The Coding Interview 1.8
//Assume you have a method isSubstring which checks if one word is a substring of another. //Given t ...
- html页面技巧
Query获取Select选择的Text和Value: 语法解释: 1. $("#select_id").change(function(){//code...}); //为S ...
- DevExpress WPF v18.2新版亮点(五)
买 DevExpress Universal Subscription 免费赠 万元汉化资源包1套! 限量15套!先到先得,送完即止!立即抢购>> 行业领先的.NET界面控件2018年第 ...
- Android开发---基本UI组件1:自动拨电话,自动上网,输入框不换行、只输数字、只输文本、只输密码
1.activity_main.xml 描述:构建一个按钮 <?xml version="1.0" encoding="utf-8"?> <L ...