最优解一定是将起点、终点以及所有必经点连接成一棵树,对于每条树边恰好走两次,而从起点到终点的一条路径只走一次。

考虑连通性DP,设$f[i][j][k][x]$表示考虑完前$i$个走道,第$i$个走道底部和上部是否存在于树中,底部和上部是否和起点连通,走一次的路径端点是底部还是上部时的最小代价。

时间复杂度$O(NA^2)$。

  1. #include<cstdio>
  2. const int N=360,inf=100000000;
  3. int m,n,A,B,i,j,k,x,a,b,nj,nk,nx,w,v[N][30],f[N][4][4][2],ans;
  4. inline void up(int&a,int b){a>b?(a=b):0;}
  5. inline int sum(int x,int l,int r){
  6. int t=v[x][r];
  7. if(l)t-=v[x][l-1];
  8. return t;
  9. }
  10. int main(){
  11. scanf("%d%d%d%d",&m,&n,&A,&B);A++;
  12. while(m--)scanf("%d%d",&i,&j),v[i][j]=1;
  13. for(i=0;i<=n;i++)for(j=0;j<4;j++)for(k=0;k<4;k++)for(x=0;x<2;x++)f[i][j][k][x]=inf;
  14. f[0][1][1][0]=-B;
  15. for(i=1;i<=n;i++)for(j=1;j<=A;j++)v[i][j]+=v[i][j-1];
  16. for(i=0;i<n;i++)for(j=0;j<4;j++)for(k=1;k<4;k++)for(x=0;x<2;x++)if(f[i][j][k][x]<inf){
  17. w=f[i][j][k][x];
  18. for(a=0;a<=A;a++){
  19. if(sum(i+1,0,a)<sum(i+1,0,A))continue;
  20. nj=1;
  21. if(a==A)nj|=2;
  22. nk=k&1;
  23. if((j>>1)&&!(k>>1))continue;
  24. if(a==A)nk|=(k&1)<<1;
  25. if(x==0){
  26. up(f[i+1][nj][nk][0],w+B+a*2);
  27. if(a==A)up(f[i+1][nj][nk][1],w+B+A);
  28. }
  29. }
  30. for(a=0;a<=A;a++){
  31. if(sum(i+1,a,A)<sum(i+1,0,A))continue;
  32. nj=2;
  33. if(a==0)nj|=1;
  34. nk=(k>>1)<<1;
  35. if((j&1)&&!(k&1))continue;
  36. if(a==0)nk|=k>>1;
  37. if(x==1){
  38. up(f[i+1][nj][nk][1],w+B+(A-a)*2);
  39. if(a==0)up(f[i+1][nj][nk][0],w+B+A);
  40. }
  41. }
  42. for(a=0;a<=A;a++)for(b=a+1;b<=A;b++){
  43. if(sum(i+1,0,a)+sum(i+1,b,A)<sum(i+1,0,A))continue;
  44. nj=3;
  45. nk=k;
  46. up(f[i+1][nj][nk][x],w+B*3+(a+A-b)*2);
  47. nk=k&1;
  48. if(x==0)if(!(j>>1)||(k>>1))up(f[i+1][nj][nk][0],w+B+(a+A-b)*2);
  49. nk=(k>>1)<<1;
  50. if(x==1)if(!(j&1)||(k&1))up(f[i+1][nj][nk][1],w+B+(a+A-b)*2);
  51. }
  52. up(f[i+1][3][3][x],w+B*3+A*2);
  53. up(f[i+1][3][3][x^1],w+B*3+A);
  54. }
  55. ans=f[n][1][1][0];
  56. up(ans,f[n][3][3][0]);
  57. return printf("%d",ans),0;
  58. }

  

BZOJ2512 : Groc的更多相关文章

  1. 论文解读(GROC)《Towards Robust Graph Contrastive Learning》

    论文信息 论文标题:Towards Robust Graph Contrastive Learning论文作者:Nikola Jovanović, Zhao Meng, Lukas Faber, Ro ...

  2. Android自动化学习笔记:获取APK包名的几种方法

    ---------------------------------------------------------------------------------------------------- ...

  3. Pascal编译器大全(非常难得)

    http://www.pascaland.org/pascall.htm Some titles (french) : Compilateurs Pascal avec sources = compi ...

  4. Go-GRPC 初体验

    grpc 跟常见的client-server模型相似(doubbo)grpc 编码之前需要准备以下环境: 安装protobuf,grpc的client与server之间消息传递使用的protoc格式消 ...

  5. python模块大全

    python模块大全2018年01月25日 13:38:55 mcj1314bb 阅读数:3049 pymatgen multidict yarl regex gvar tifffile jupyte ...

  6. SAS笔记

    SAS基础知识 SAS里面的PROC一览 The ACECLUS Procedure : 聚类的协方差矩阵近似估计(approximate covariance estimation for clus ...

  7. C链表的简单案例

    此案例只是简单的使用链表 链表的特点: 1.不需要提前知道要存入数据的长度 2.最后结点为NULL 3.头结点指向下一个结点的结构体指针 #include <stdio.h> #inclu ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. 论文解读(SimGRACE)《SimGRACE: A Simple Framework for Graph Contrastive Learning without Data Augmentation》

    论文信息 论文标题:SimGRACE: A Simple Framework for Graph Contrastive Learning without Data Augmentation论文作者: ...

随机推荐

  1. pandas之whl格式安装

    一.主要介绍linux下安装 1.下载安装包:https://pypi.doubanio.com/simple/pandas/ 2.安装  pip install wheel 3.更新一下pip版本( ...

  2. javascript获取时间戳

    时间戳: 时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数.它也被称为 Unix 时间戳(Unix Timestamp). JavaScript 获取当前时间戳: < ...

  3. PyTorch中的backward [转]

    转自:https://sherlockliao.github.io/2017/07/10/backward/ backward只能被应用在一个标量上,也就是一个一维tensor,或者传入跟变量相关的梯 ...

  4. 关于sql和MySQL的语句执行顺序

    sql和mysql执行顺序,发现内部机制是一样的.最大区别是在别名的引用上. 一.sql执行顺序 (1) from (3) join (2) on (4) where (5) group by(开始使 ...

  5. BeautifulSoup下Unicode乱码解决

    今天在用scrapy爬某个网站的数据,其中DOM解析我用的是BeautifulSoup,速度上没有XPath来得快,不过因为用了习惯了,所以一直用的bs,版本是bs4 不过在爬取过程中遇到了一些问题, ...

  6. 【译】理解JavaScript闭包——新手指南

    闭包是JavaScript中一个基本的概念,每个JavaScript开发者都应该知道和理解的.然而,很多新手JavaScript开发者对这个概念还是很困惑的. 正确理解闭包可以帮助你写出更好.更高效. ...

  7. Coolpy开源项目简介

    1.Coolpy初识 基于ARDUINO的迷你操作系统.只需一个ARDUINO主板+Ethernet Shield即可运行.成本低,Coolpy主件以目前淘宝价只需要76元人民币. 2.Coolpy能 ...

  8. Python学习(十) —— 常用模块

    一.collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdic ...

  9. Codeforces 219E Parking Lot 线段树

    Parking Lot 线段树区间合并一下, 求当前要占的位置, 不包括两端点的写起来方便一点. #include<bits/stdc++.h> #define LL long long ...

  10. js拷贝

    现在有一个对象 var obj = { name: '隔壁老王', age: 60, sex: 'male' } 我们现在想把obj里的每一个属性拷贝到一个空对象var obj1 = {}中,那么需要 ...