题目传送门

这道题 51nod只Ac了十二个人 没有题解可以研究 所以就自己YY了半天 在这里先感谢一波岚清大爷 orz

然后这道题我分了两种情况 一种是左边的往左跑右边的往右跑 中间有一部分直接走不用跑左右

另一种是全部都要跑左右 然后有一部分点需要左右都跑的 但是左跑和右跑的有一部分点会相互冲突 这个时候需要处理一波矛盾关系

讲的不清楚 给一份数据自己模拟试试吧(再次感谢一波 orzllq)

  1
  5 11
  5 3
  3 4
  1 10
  7 9
  9 1

这个时候 我们第一个想到的是一波网络流找最小割 经过一波混乱以后 代码成功出世并且意外AC了 贴一波代码

当然也可以贪心枚举而且数据大了会快很多 推荐一篇写的很全的博客吧 orzzsn

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define LL long long
using namespace std;
const int M=,inf=0x3f3f3f3f;
LL read(){
LL ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
LL ans,sum,cnt;
LL n,L,m,S,T;
int f[M][M];
struct node{LL l,r;}e[*M];
bool cmp(node a,node b){return a.l<b.l;}
int first[M],cur[M];
struct note{LL to,next,flow;}q[*M*M];
void ins(LL a,LL b,LL flow){cnt++; q[cnt].to=b; q[cnt].flow=flow; q[cnt].next=first[a]; first[a]=cnt;}
void insert(int a,int b,int flow){ins(a,b,flow); ins(b,a,);}
void find1(LL x,LL k){
bool f=;
LL now=e[x].r;
for(int i=k+;i<=n;i++) if(now>e[i].r) insert(x,i,inf),f=;
if(f) insert(S,x,*(L-e[x].r));
}
void find2(LL x,LL k){
LL now=e[x].r;
for(int i=;i<=k;i++) if(now<e[i].r){
insert(x,T,*e[x].r);
break;
}
}
int check(int x){
LL mx1=,mx2=L,now=e[x].r;
for(int i=;i<x;i++) mx1=max(mx1,e[i].r);
for(int i=x+;i<=n;i++) mx2=min(mx2,e[i].r);
return mx1<now&&mx2>now;
}
int okay(int x){
LL mx1=,mn1=L;
for(int i=;i<=x;i++) mx1=max(mx1,e[i].r);
for(int i=x+;i<=n;i++) mn1=min(mn1,e[i].r);
return mx1<mn1;
}
LL calc1(int x){
LL sum=;
for(int i=;i<=x;i++) sum=sum+e[i].l+e[i].r;
return sum;
}
LL calc2(int x){
LL sum=;
for(int i=x;i<=n;i++) sum=sum+(*L-e[i].l-e[i].r);
return sum;
}
LL pd(LL x){return x>=?x:-x;}
LL d[M],st[M];
int bfs(){
memset(d,-,sizeof(d));
int head=,tail=;
st[]=S; d[S]=;
while(head!=tail){
int x=st[head++]; if(head>M) head=;
for(int i=first[x];i;i=q[i].next){
int now=q[i].to;
if(q[i].flow&&d[now]==-){st[tail++]=now; d[now]=d[x]+; if(tail>M) tail=;}
}
}
return d[T]!=-;
}
LL dfs(LL x,LL a){
if(x==T||a==) return a;
int f,flow=;
for(int &i=cur[x];i;i=q[i].next){
int now=q[i].to;
if(d[now]==d[x]+&&(f=dfs(now,min(a,q[i].flow)))>){
q[i].flow-=f; q[i^].flow+=f;
flow+=f;
a-=f; if(a==) break;
}
}
return flow;
}
LL dinic(){
LL ans=;
while(bfs()){for(int i=;i<=T;i++) cur[i]=first[i]; ans+=dfs(S,inf);}
return ans;
}
int main()
{
for(int v=read();v;v--){
ans=inf; n=read(); L=read();
for(int i=;i<=n;i++) e[i].l=read(),e[i].r=read();
e[].l=; e[].r=; e[n+].l=L; e[n+].r=L;
sort(e+,e++n,cmp);
sum=; for(int i=;i<=n;i++) sum=sum+e[i].l+e[i].r; ans=min(ans,sum);
sum=; for(int i=;i<=n;i++) sum=sum+(*L-e[i].r-e[i].l); ans=min(ans,sum);
for(int i=;i<=n;i++)if(okay(i)){
int k=i+; sum=;
sum+=calc1(i);
while(check(k)) sum=sum+pd(e[k].r-e[k].l),k++;
sum+=calc2(k);
ans=min(ans,sum);
}
for(int i=;i<=n;i++){
sum=; cnt=; S=; T=n+;
memset(first,,sizeof(first));
sum+=calc1(i)+calc2(i+);
for(int k=;k<=i;k++) find1(k,i);
for(int k=i+;k<=n;k++) find2(k,i);
sum+=dinic();
ans=min(ans,sum);
}
printf("%lld\n",ans);
}
return ;
}

51nod1331 狭窄的通道的更多相关文章

  1. 51Nod 1331 狭窄的通道

    有一个长为L的狭窄通道,我们假设这个通道在x轴上,其两个出口分别在x=0与x=L处.在这个通道里有N只狼,第i只狼有一个初始位置ai,它想到达位置bi(0<=i=L处空间足够大可以装下任意数量的 ...

  2. 【51nod 1331】狭窄的通道

    Description 有一个长为L的狭窄通道,我们假设这个通道在x轴上,其两个出口分别在x=0与x=L处.在这个通道里有N只狼,第i只狼有一个初始位置ai,它想到达位置bi(0<=i<N ...

  3. 游戏AI技术 2

    [Unity3D人工智能编程精粹 2] 1.跟随领队行为. 用靠近(Seek)或追逐(Pursuit)实现跟随领队行为并不好.在Seek中,AI角色会被推向领队,最终与领队占据相同位置.而Pursui ...

  4. 基于SketchUp和Unity3D的虚拟场景漫游和场景互动

    这是上学期的一次课程作业,难度不高但是也一并记录下来,偷懒地拿课程报告改改发上来. 课程要求:使用sketchUp建模,在Unity3D中实现场景漫游和场景互动. 知识点:建模.官方第一人称控制器.网 ...

  5. 默 of 2018:年终总结

    目录 1 概述:在平凡中求变 2 专业分流:一个时代的终点,我的新起点 2.1 我在专业分流前夕的境况 2.2 专业分流情况概述,以及对一篇文章的回顾 2.3 总结与余绪 2.4 附:关于理科与工科的 ...

  6. High-level NavMesh Building Components

    Here we introduce four high level components for the navigation system: //这里我们介绍四个高水平导航系统组件: NavMesh ...

  7. 金山中学 rugular SRM 04 ——纪念我的第一次Ak

    虽然只是一场比较简单的比赛 但奈何我也比较弱啊.... T1 一道计算概率的题目 T SRM 04 描述 给个长度为 n 的数列,每次操作能将数列打乱(RandomShuffle),问在期望下需要多少 ...

  8. 用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线

    我最近出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中给出了MACD,KDJ ...

  9. Paypal开发中遇到请求被中止: 未能创建 SSL/TLS 安全通道及解决方案

    最近在基于ASP.NET上开发了Paypal支付平台,在ASP.NET开发的过程中没有遇到这个问题,但是引用到MVC开发模式中的时候就出现了"未能创建 SSL/TLS 安全通道及解决方案&q ...

随机推荐

  1. centos目录

    cd /opt cd /home/lujie cd /etc cd /usr cd /dev cd /bin cd /mnt cd /media cd /tmp

  2. js控制浏览器全屏

    HTML 5中的full screen,目前可以在除IE和opera外的浏览器中使用 ,有的时候用来做全屏API,游戏呀,等都很有用.先看常见的API element.requestFullScree ...

  3. php-编译模块2

    PHP扩展-扩展的生成和编译 首先说明一下,PHP扩展有两种编译方式:方式一:在编译PHP时直接将扩展编译进去方式二:扩展被编译成.so文件,在php.ini里配置加载路径: 以下开始说明创建PHP扩 ...

  4. BZOJ1131[POI2008]Sta——树形DP

    题目描述 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 输入 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. 输出 输出你所找到的点,如果具有 ...

  5. BZOJ4650 NOI2016优秀的拆分(后缀数组)

    显然只要求出以每个位置开始的AA串数量就可以了,将其和反串同位置的结果乘一下,加起来就是答案.考虑对每种长度的字符串计数.若当前考虑的A串长度为x,我们每隔x个字符设一个关键点,求出相邻两关键点的后缀 ...

  6. Luogu5055 【模板】可持久化文艺平衡树(fhq-treap)

    注意下传标记时也需要新建节点.空间开的尽量大. #include<iostream> #include<cstdio> #include<cmath> #inclu ...

  7. day23 序列化模块

    概念: 序列化 -- 其他数据类型转换成一个字符串数据类型 反序列化 -- 字符串转换成其他数据类型 序列 -- 字符串 必须要转换成字符串的场景: 往文件里面写数据的时候只能写字符串,不能写字典的 ...

  8. 震惊!1MB == 1000KB??

    稍微对电脑了解一点的同学可能都知道,电脑中的单位换算是: 1KB = 1024B 1MB = 1024KB 1GB = 1024MB ... 以前,我也是这么认为的.... 最近我在Linux解压某个 ...

  9. The 2018 ACM-ICPC China JiangSu Provincial Programming Contest快速幂取模及求逆元

    题目来源 The 2018 ACM-ICPC China JiangSu Provincial Programming Contest 35.4% 1000ms 65536K Persona5 Per ...

  10. C# HasRows 和 Read的区别

    HasRows:返回true或者false,表示从数据库中读取出来的数据集DataRead是否存在,用来判断是否为空: Read:返回true或者false,Read才是真正的读数据,采用的是顺序读法 ...