【题解】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 ...
随机推荐
- 14 个你可能不知道的 JavaScript 调试技巧
了解你的工具可以极大的帮助你完成任务.尽管 JavaScript 的调试非常麻烦,但在掌握了技巧 (tricks) 的情况下,你依然可以用尽量少的的时间解决这些错误 (errors) 和问题 (bug ...
- mysql ip常见异常
这次的项目采用mysql数据库,以前没怎么接触过,所以遇到很多问题,在此小小总结一下: (1)com.mysql.jdbc.exceptions.jdbc4.CommunicationsExcepti ...
- tp3 key json 分页
//json 强制转换为array $arr[$key]['checkpro'] = json_decode($val['checkpro'],JSON_FORCE_ARRAY); $arr[$ ...
- huyingsakai的Python学习day1:计算机硬件
1.python是什么?Python是一门编程语言 2.什么是编程语言?(*****)程序员和计算机沟通交流的介质 3.什么是编程?(*****)编程就是程序员想把内心表达的方法用某种计算机语言思维表 ...
- mysql 中 DATE_ADD函数和 DATE_SUB函数用法
mysql 中 DATE_ADD(date,INTERVAL expr type) 和 DATE_SUB(date,INTERVAL expr type) 这些函数执行日期运算. date 是一个 D ...
- 【HAOI2015】树上染色
[HAOI2015]树上染色 这题思路好神仙啊,首先显然是树形dp,f[i][j]表示在以i为根的子树中选j个黑点对答案的贡献(并不是当前子树最大值),dp时只考虑i与儿子连边的贡献.此时(i,son ...
- AtCoder Beginner Contest 078 D ABS
光做C了,做完C,就要结束了,看了看D,没看懂那操作啥意思,就扔了. 刚才看了看,突然懂了.. 就是每个人从那堆牌上边拿牌,最少拿一张,最多可以全拿走,然后手里留下最后一张拿到的,其余的都扔掉. 比如 ...
- supersockets和 AppSession,AppServer 配合工作
现在, 你已经有了 RequestInfo, ReceiveFilter 和 ReceiveFilterFactory, 但是你还没有正式使用它们. 如果你想让他们在你的程序里面可用, 你需要定义你们 ...
- CSS引入的方式有哪些? link和@import的区别是?
CSS引入的方式包括内联 内嵌 外链 导入 link和@import的区别是 : ①link属于XHTML标签,除了加载CSS外,还能 用于定义RSS, 定义rel连接属性等作用:而@import是C ...
- hsqldb使用
1 hsqldb介绍 HyperSQL DataBase 是一个现代的关系数据库管理软件,比较彻底遵从SQL:2008标准和JDBC4规范.支持SQL:2008标准所以的核心特性和很多的可选特性. H ...