初见杀……

原题:

两个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】吃豆豆的更多相关文章

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

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

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

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

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

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

  4. 1930: [Shoi2003]pacman 吃豆豆

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

  5. [bzoj]1930 pacman吃豆豆

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

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

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

  7. css动画实现吃豆豆

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

  8. BZOJ1930 [Shoi2003]pacman 吃豆豆

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

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

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

随机推荐

  1. bzoj1010

    题解: 斜率优化dp f[i]=f[j]+(i-j+sum[i]-sum[j]-L)^2 然后斜率优化 代码: #include<bits/stdc++.h> typedef long l ...

  2. TTL反相器的外部特性

    TTL反相器的外部特性 电压传输特性 输入端噪声容限特性 静态输入特性: 静态输出特性: 动态特性: 传输延迟时间:是由晶体管的延迟时间,电阻以及寄生电容元素引起的.包括俩部分:输入由低电平跳为高电平 ...

  3. js上传文件(可自定义进度条)

    //本地上传图片.语音 function rsc_UploadFile(file) { ]; //创建一个FormData空对象,然后使用append方法添加key/value var fd = ne ...

  4. jquery去重复 如何去除select控件重复的option

    #1.去除select控件重复的option <select id="companyId" onchange="getContract()" name=& ...

  5. centos中PATH环境变量查看和修改

    PAHT环境变量 :定义的是系统搜索命令的路径.<就是自己写的程序不打绝对路径就可以执行,必须放到 $PATH这个文件中>查看命令:echo $PATH 以添加mongodb server ...

  6. ylz框架外网之JSP 自定义TAG

    首先用到了ServletContext,全局容器的概念,之前不知道哪里有用,现在用到,这里解析的是一个sysCode的TAG,用于下拉框等选项的时候自动显示要选的内容.大致思路是,利用前一篇所说到的E ...

  7. winform datatable 或datagridview中添加列

    DataGridViewCheckBoxColumn dg = new DataGridViewCheckBoxColumn(); dg.HeaderText = "选择"; dg ...

  8. Access denied for user 'root'@'IP' (using password:YES)解决方法

    在MySql的使用过程中,碰到“Access denied for user 'root'@'IP' (using password:YES)”的问题,使用以下语句修改后还是不行. GRANT ALL ...

  9. 2016 多校联赛7 Elegant Construction

    Being an ACMer requires knowledge in many fields, because problems in this contest may use physics, ...

  10. 在SELECT的时候,加入一列固定值

    SELECT * FROM (select id id, si_code code, si_sharetype sharetype, si_name name, si_organid organid, ...