【题解】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 ...
随机推荐
- Vue.js 第1章 Vue常用指令学习
今日目标 能够写出第一个vue应用程序 能够接受为什么需要学vue 能够使用指令 能够通过指定完成简单的业务(增加删除查询) 能够理解mvvm 为什么要学习vue 企业需要 可以提高开发效率 实现vu ...
- oracle函数 NLS_INITCAP(x[,y])
[功能]返回字符串并将字符串的第一个字母变为大写,其它字母小写; [参数]x字符型表达式 [参数]Nls_param可选, 查询数据级的NLS设置:select * from nls_database ...
- css实现简单的页面自适应宽度
1.css样式.lgn{ width:500px; height:20px;}.item_left_yd{ float: left; display: inline-block; width:240p ...
- 【原生JS】简单取随机数
因为js本身取随机数仅能取 0 到 1之间的数,所以..... 取 1 - 10之间的随机数. function getSJS(x,y,z){ var int = null; while(int &g ...
- css的一些小问题
这是今天整理的笔记一.属性书写顺序: Formatting Model(布局方式.位置) > Box Model(尺寸) > Typographic(文本相关) > Visual(视 ...
- jackson java转json hibernate懒加载造成的无限递归问题
@JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties jackson中的@Jso ...
- 2018-8-10-win10-uwp-调试软件启动
title author date CreateTime categories win10 uwp 调试软件启动 lindexi 2018-08-10 19:16:51 +0800 2018-03-0 ...
- 【u238】暴力摩托
Time Limit: 1 second Memory Limit: 64 MB [问题描述] 晚会上大家在玩一款"暴力摩托"的游戏,它拥有非常逼真的画面和音响效果! 当然了,车子 ...
- java 内省综合案例和Beanutils工具包
演示用eclipse自动生成 ReflectPoint类的setter和getter方法. 直接new一个PropertyDescriptor对象的方式来让大家了解JavaBean API的价值,先用 ...
- H3C 根据主机地址数划分子网