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论文作者: ...
随机推荐
- pandas之whl格式安装
一.主要介绍linux下安装 1.下载安装包:https://pypi.doubanio.com/simple/pandas/ 2.安装 pip install wheel 3.更新一下pip版本( ...
- javascript获取时间戳
时间戳: 时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数.它也被称为 Unix 时间戳(Unix Timestamp). JavaScript 获取当前时间戳: < ...
- PyTorch中的backward [转]
转自:https://sherlockliao.github.io/2017/07/10/backward/ backward只能被应用在一个标量上,也就是一个一维tensor,或者传入跟变量相关的梯 ...
- 关于sql和MySQL的语句执行顺序
sql和mysql执行顺序,发现内部机制是一样的.最大区别是在别名的引用上. 一.sql执行顺序 (1) from (3) join (2) on (4) where (5) group by(开始使 ...
- BeautifulSoup下Unicode乱码解决
今天在用scrapy爬某个网站的数据,其中DOM解析我用的是BeautifulSoup,速度上没有XPath来得快,不过因为用了习惯了,所以一直用的bs,版本是bs4 不过在爬取过程中遇到了一些问题, ...
- 【译】理解JavaScript闭包——新手指南
闭包是JavaScript中一个基本的概念,每个JavaScript开发者都应该知道和理解的.然而,很多新手JavaScript开发者对这个概念还是很困惑的. 正确理解闭包可以帮助你写出更好.更高效. ...
- Coolpy开源项目简介
1.Coolpy初识 基于ARDUINO的迷你操作系统.只需一个ARDUINO主板+Ethernet Shield即可运行.成本低,Coolpy主件以目前淘宝价只需要76元人民币. 2.Coolpy能 ...
- Python学习(十) —— 常用模块
一.collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdic ...
- Codeforces 219E Parking Lot 线段树
Parking Lot 线段树区间合并一下, 求当前要占的位置, 不包括两端点的写起来方便一点. #include<bits/stdc++.h> #define LL long long ...
- js拷贝
现在有一个对象 var obj = { name: '隔壁老王', age: 60, sex: 'male' } 我们现在想把obj里的每一个属性拷贝到一个空对象var obj1 = {}中,那么需要 ...