【题解】Leyni的汽车比赛
【题解】Leyni的汽车比赛
思维题?居然被我凑出来了
这种图论题先设这样一个状态
\]
表示从i到j,最多使用f个交通工具的最短路
转移的话,每辆车先自己跑一个Floyd,然后进去就好了,转移枚举中间点。
但是你说\(f\)很大,感觉这样做不行了,但是仔细思考一下,最多换\(n\)辆车就会到达终点,所以让\(f\)对\(n\)取min就好了。
这种分析复杂度的方法很好用,还有一个更典型的例子是,一个区间询问题,区间长度是\(100\),询问是\(1e5\)的,但是你每次询问只会\(O(n^2)\)的暴力,怎么过这个subtask? 直接记忆化啊!总共就\(100\times 90\)个不同的区间啊
于是我们获得了一个\(O(n^5)\)的做法,我以为可以过,但是有多组数据,交一发T了
for(register int t=1;t<=m;++t)
g[t].read(),g[t].gen();
for(register int t0=1;t0<=m;++t0)
for(register int f=1;f<=n+2;++f)
for(register int k=1;k<=n;++k)
for(register int t=1;t<=n;++t)
for(register int i=1;i<=n;++i)
ans[t][i][f]=Min(ans[t][i][f],ans[t][i][f-1],ans[t][k][f-1]+g[t0][k][i],ans[t][k][f-1]+ans[k][i][1]);
for(register int t=1;t<=r;++t){
register int t1=qr(),t2=qr(),t3=min(qr()+1,n+1);
printf("%d\n",ans[t1][t2][t3]);
}
代码中\(g[]\) 是我定义的结构体,里面是一个\(e[maxn][maxn]\),\(g[t].gen()\)是跑一遍floyd
考虑优化一下,由于我们是要求最小,我们看一下混乱不堪的转移,考虑在Min函数的第三个参数动动手脚,实际上,对于一个确定\(f\),我们求一个最小的\(g[t0][k][i]\)就好了,我们随便找个东西存一下就完事了。
实际上我这份转移靠感觉的代码做了这件事情,就是\(ans[t][k][f-1]+ans[k][i][1]\),这里\(ans[k][i][1]\)实际上就记录了最小的\(g[t0][k][i]\)。所以我们少枚举一个\(t0\),复杂度变为\(O(n^4)\)
本来这种思维题我是做不出来的,但d 是为啥我又写出来了?因为我发现可以通过观察代码的行为来优化算法。。。我用这种技巧已经帮助我在模拟赛里多拿了好几百分了23333333
没有退役全靠它
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=51;
const int inf=0x3f3f3f3f;
int ans[maxn][maxn][53];
int n,m,r;
struct Graph{
int e[maxn][maxn];
inline void read(){
for(register int t=1;t<=n;++t)
for(register int i=1;i<=n;++i)
e[t][i]=qr();
}
inline int* operator [](register int x){return e[x];}
inline void gen(){
for(register int k=1;k<=n;++k)
for(register int t=1;t<=n;++t)
for(register int i=1;i<=n;++i)
e[t][i]=min(e[t][i],e[t][k]+e[k][i]);
}
inline void print(){
for(register int t=1;t<=n;++t,printf("\n"))
for(register int i=1;i<=n;++i)
printf("%d ",e[t][i]);
}
}g[maxn];
inline int Min(const int&a,const int&b){if(a<b) return a; return b;}
inline int Min(const int&a,const int&b,const int&c){return Min(a,min(b,c));}
inline int Min(const int&a,const int&b,const int&c,const int&d){return Min(a,Min(b,c,d));}
int main(){
while(scanf("%d %d %d",&n,&m,&r)!=EOF){
for(register int t=0;t<=n;++t)
for(register int i=0;i<=n;++i)
for(register int k=0;k<=n+2;++k)
ans[t][i][k]=inf;
for(register int t=1;t<=n;++t) ans[t][t][0]=0;
for(register int t=1;t<=m;++t){
g[t].read(),g[t].gen();
for(register int i=1;i<=n;++i)
for(register int k=1;k<=n;++k)
ans[i][k][1]=min(ans[i][k][1],g[t][i][k]);
}
for(register int f=1;f<=n+2;++f)
for(register int k=1;k<=n;++k)
for(register int t=1;t<=n;++t)
for(register int i=1;i<=n;++i)
ans[t][i][f]=Min(ans[t][i][f],ans[t][i][f-1],ans[t][k][f-1]+ans[k][i][1]);
for(register int t=1;t<=r;++t){
register int t1=qr(),t2=qr(),t3=min(qr()+1,n+1);
printf("%d\n",ans[t1][t2][t3]);
}
}
return 0;
}
【题解】Leyni的汽车比赛的更多相关文章
- 题解-[HNOI2001]遥控赛车比赛
题解-[HNOI2001]遥控赛车比赛 前置知识:记忆化搜索.\(\texttt{Bfs}\). 参考资料 https://www.luogu.com.cn/blog/CYJian/solution- ...
- HLG 1400 汽车比赛
题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1400 结构体排序+树状数 ...
- 【题解】HNOI2013比赛
[题解][P3230 HNOI2013]比赛 将得分的序列化成样例给的那种表格,发现一行和一列是同时确定的.这个表格之前是正方形的,后来长宽都减去一,还是正方形.问题形式是递归的.这就启示我们可以把这 ...
- 【Codeforces Round #405 ( Div 2)】题解
Bear and Big Brother 签到题,直接模拟就可以了. Bear and Friendship Condition 满足只能是每个朋友圈中每个人和其他人都是朋友,这样的边数的确定的. 然 ...
- Hnoi2013题解 bzoj3139~3144
话说好久没写题(解)了.. 先贴份题解:http://wjmzbmr.com/archives/hnoi-2013-%E9%A2%98%E8%A7%A3/(LJ神题解..Lazycal表示看不懂..) ...
- Codeforces Round #524 (Div. 2)(前三题题解)
这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...
- Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)
这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...
- Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)
这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...
- Codeforces Round #701 (Div. 2) 题解
由于今天实在是太自闭了就前来写场已经 AK 的 div.2 的题解了 这场比赛是我的 div.2 首 AK 哦 A 先特判 \(b=1\),强制将 \(b+1\) 否则容易发现答案最大为 \(\log ...
随机推荐
- Python基础:13装饰器
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的应用有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同 ...
- @loj - 2461@ 「2018 集训队互测 Day 1」完美的队列
目录 @description@ @solution@ @part - 0@ @part - 1@ @accepted code@ @details@ @description@ 小 D 有 n 个 ...
- Vue.js 第4章 组件与路由
组件 什么是组件:组件就是一些标签结构的封装,同时为这些结构添加需要的业务逻辑,设置你想要的样式 一个组件中一般可以设置:结构,功能和样式 为什么要使用组件: 使用方便 复用 组件的创建和使用 组件的 ...
- js中setInterval与setTimeout用法 实现实时刷新每秒刷新
setTimeout 定义和用法: setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式. 语法: setTimeout(code,millisec) 参数: ...
- Centos7 Apache配置虚拟主机的三种方式
https://blog.csdn.net/tladagio/article/details/80760261 一.虚机主机的三种方式 1.基于IP 2.基于IP+端口 3.基于域名 官网文档:htt ...
- mysql 优化 1
一. 数据库索引 规则8:业务需要的相关索引是根据实际的设计所构造sql语句的where条件确定的,业务不需要的不要建索引,不允许在联合索引(或主键)中存在多余的字段,特别是该字段根本不会在条件语句中 ...
- Libev源码分析01:Libev中的监视器结构(C结构体实现继承)
在Libev的源码中,用到了一种用C实现类似C++中继承的技巧,主要是用宏和结构体实现. 在Libev中,最关键的数据结构就是各种监视器,比如IO监视器,信号监视器等等.这些监视器的多数成员都是一样的 ...
- JS划重点——类和对象的不正经阐述
JS划重点--类和对象的不正经阐述 /在JS 类里面函数也是一个对象,那么要创建一个对象就需要一个类,这个类可以由这个对牛逼的对象-函数来实现/ /首先是普罗大众都会的 工厂模式来创建一类/ func ...
- 2016.1.22 扩充临时表空间解决ora-01652错误
今天运行一个复杂查询时报错ora-01652 无法通过128 扩展temp段, 网上说是临时表空间大小不够,运行了脚本调整临时表空间,问题解决 alter database tempfile '/ap ...
- HDU 3397"Sequence operation"(线段树区间和并)
传送门 •题意 给你一个仅包含 0 和 1 的序列: 在这个序列上有如下操作: (1)0 a b : 将 [a,b] 区间的数置 0: (2)1 a b : 将 [a,b] 区间的数置 1: (3)2 ...