BZOJ2512 : Groc
最优解一定是将起点、终点以及所有必经点连接成一棵树,对于每条树边恰好走两次,而从起点到终点的一条路径只走一次。
考虑连通性DP,设$f[i][j][k][x]$表示考虑完前$i$个走道,第$i$个走道底部和上部是否存在于树中,底部和上部是否和起点连通,走一次的路径端点是底部还是上部时的最小代价。
时间复杂度$O(NA^2)$。
#include<cstdio>
const int N=360,inf=100000000;
int m,n,A,B,i,j,k,x,a,b,nj,nk,nx,w,v[N][30],f[N][4][4][2],ans;
inline void up(int&a,int b){a>b?(a=b):0;}
inline int sum(int x,int l,int r){
int t=v[x][r];
if(l)t-=v[x][l-1];
return t;
}
int main(){
scanf("%d%d%d%d",&m,&n,&A,&B);A++;
while(m--)scanf("%d%d",&i,&j),v[i][j]=1;
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;
f[0][1][1][0]=-B;
for(i=1;i<=n;i++)for(j=1;j<=A;j++)v[i][j]+=v[i][j-1];
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){
w=f[i][j][k][x];
for(a=0;a<=A;a++){
if(sum(i+1,0,a)<sum(i+1,0,A))continue;
nj=1;
if(a==A)nj|=2;
nk=k&1;
if((j>>1)&&!(k>>1))continue;
if(a==A)nk|=(k&1)<<1;
if(x==0){
up(f[i+1][nj][nk][0],w+B+a*2);
if(a==A)up(f[i+1][nj][nk][1],w+B+A);
}
}
for(a=0;a<=A;a++){
if(sum(i+1,a,A)<sum(i+1,0,A))continue;
nj=2;
if(a==0)nj|=1;
nk=(k>>1)<<1;
if((j&1)&&!(k&1))continue;
if(a==0)nk|=k>>1;
if(x==1){
up(f[i+1][nj][nk][1],w+B+(A-a)*2);
if(a==0)up(f[i+1][nj][nk][0],w+B+A);
}
}
for(a=0;a<=A;a++)for(b=a+1;b<=A;b++){
if(sum(i+1,0,a)+sum(i+1,b,A)<sum(i+1,0,A))continue;
nj=3;
nk=k;
up(f[i+1][nj][nk][x],w+B*3+(a+A-b)*2);
nk=k&1;
if(x==0)if(!(j>>1)||(k>>1))up(f[i+1][nj][nk][0],w+B+(a+A-b)*2);
nk=(k>>1)<<1;
if(x==1)if(!(j&1)||(k&1))up(f[i+1][nj][nk][1],w+B+(a+A-b)*2);
}
up(f[i+1][3][3][x],w+B*3+A*2);
up(f[i+1][3][3][x^1],w+B*3+A);
}
ans=f[n][1][1][0];
up(ans,f[n][3][3][0]);
return printf("%d",ans),0;
}
BZOJ2512 : Groc的更多相关文章
- 论文解读(GROC)《Towards Robust Graph Contrastive Learning》
论文信息 论文标题:Towards Robust Graph Contrastive Learning论文作者:Nikola Jovanović, Zhao Meng, Lukas Faber, Ro ...
- Android自动化学习笔记:获取APK包名的几种方法
---------------------------------------------------------------------------------------------------- ...
- Pascal编译器大全(非常难得)
http://www.pascaland.org/pascall.htm Some titles (french) : Compilateurs Pascal avec sources = compi ...
- Go-GRPC 初体验
grpc 跟常见的client-server模型相似(doubbo)grpc 编码之前需要准备以下环境: 安装protobuf,grpc的client与server之间消息传递使用的protoc格式消 ...
- python模块大全
python模块大全2018年01月25日 13:38:55 mcj1314bb 阅读数:3049 pymatgen multidict yarl regex gvar tifffile jupyte ...
- SAS笔记
SAS基础知识 SAS里面的PROC一览 The ACECLUS Procedure : 聚类的协方差矩阵近似估计(approximate covariance estimation for clus ...
- C链表的简单案例
此案例只是简单的使用链表 链表的特点: 1.不需要提前知道要存入数据的长度 2.最后结点为NULL 3.头结点指向下一个结点的结构体指针 #include <stdio.h> #inclu ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 论文解读(SimGRACE)《SimGRACE: A Simple Framework for Graph Contrastive Learning without Data Augmentation》
论文信息 论文标题:SimGRACE: A Simple Framework for Graph Contrastive Learning without Data Augmentation论文作者: ...
随机推荐
- 隐藏WIN10资源管理器中的3D对象文件夹
1.WIN+R,打开运行窗口,输入“regdeit”启动注册表编辑器 2.定位到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersio ...
- Java数据结构与算法结构图
- 真的分治fft
以前学的分治fft f[i]=sigma(f[i-x]*g[x]),其中g[x]已知 那么我们可以用cdq分治来做(l,mid 对mid+1,t的影响) 而现在的$f[i]=sum(f(i-x)*f( ...
- MediatR
1.MediatR是什么? 微软官方eshopOnContainer开源项目中使用到了该工具, mediatR 是一种中介工具,解耦了消息处理器和消息之间耦合的类库,支持跨平台 .net Standa ...
- content字符生成配合CSS3 animation的点点点loading
CSS代码: dot { display: inline-block; height: 1em; line-height: 1; vertical-align: -.25em; overflow: h ...
- JavaScript onmousewheel鼠标滚轮示例
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- union和union all的区别(面试常考)
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: Union All:对两个结果集进行并集操作,包括重复行,不进行排序: Union因为要进行重复值扫描,所以效率低.如果合 ...
- day56 文件 文档处理,事件
前情回顾: 1. 前情回顾 0. 选择器补充 - 属性选择器 - $("[egon]") - $("[type='text']") - $("inpu ...
- PageHelper在Mybatis中的使用
环境:Spring 4.2.1 Mybatis 3.2.8 pagehelper 5.1.2 Mybatis官方教程:https://github.com/pagehelper/Mybatis-Pag ...
- sql语句中start with用法,用于表达一个复杂的目录树存储在一张表中
select * from tablename start with 条件1 connect by prior 条件2 where 条件3