[2020-11-23 contest]图(dfs剪枝),劫富济贫(字典树),小A的树(树形DP),游戏(贪心/斜率优化)

文章目录

  • T1:图
    • solution
    • code
  • T2:劫富济贫
    • solution
    • code
  • T3:小A的树
    • solution
    • code
  • T4:游戏
    • solution
    • code

T1:图

【问题描述】
给你一个n个点,m条边的无向图,每个点有一个非负的权值ci,现在你需要选择一些点,使得每一个点都满足:
如果这个点没有被选择,则与它有边相连的所有点都必须被选择。
问:满足上述条件的点集中,所有选择的点的权值和最小是多少?
QYQ很快就解决了这个问题,但是他已经回到了左下角……没有留下答案,现在只好请你来解决这个问题啦!
【输入描述】
从文件graph.in中输入数据。
输入的第一行包含两个整数n,m
输入的第二行包含n个整数,其中第i个整数代表ci
输入的第三行到第m+2行,每行包含两个整数u,v,代表点u和点v之间有一条边
【输出描述】
输出到文件graph.out中。
输出的第一行包含一个整数,代表最小的权值和
【样例】
Sample Input
3 1
1 2 3
3 1
Sample Output
1
【样例解释】
只选择1号点,满足题意
【数据规模】
对于20% 的数据:n<=10
对于40%的数据:n<=20
对于100%的数据:1<=n<=50, 1<=m<=500, 0<=c<=1000
图中可能会有重边,自环。
点的编号为1—n。

solution

直接大法师 搜索即可
当然不是指纯O(2n)O(2^n)O(2n)那么头铁的暴搜
其实也差不多啦~
可以加入两个强劲剪枝
①:当前搜索的值已经大于了已经找到的最小值,就没有搜下去的意义了
②:当uuu点强制不选后,所有与uuu点直接相连的点就必须选,这也可以剪掉很多情况
最后就发现跑的贼nm快,但是就很玄学,懂?——算不了时间复杂度
直接帮你从O(250)O(2^{50})O(250)TTT飞直接剪进ACACAC
在这里插入图片描述
这道题告诉我,有的时候正解真的就是普普通通的搜索,只不过平时因为都是思维方面的训练
所以搜索一般是用来想不出正解搞简单的部分分用的算法
搜索——正解算法思考下优先级可能没那么高,但是当什么算法都不行的时候,可能就要尝试一下了
而且一般很小的范围,除掉很巧妙的结论或者技巧题——贪心,状压,搜索就很大概率是正解
因为搜索的时间复杂度加上剪枝后就变得很玄学
所以考场上,就算知道暴搜点强制选了后,与之直接相连的点必须不选的情况下
我也没敢直接就大法师冲,平时就是直接刚了,莫名这个时候稳如一匹翻车的老狗
在这里插入图片描述

code

#include <cstdio>
#include <vector>
using namespace std;
#define maxn 55
#define inf 0x3f3f3f3f
vector < int > G[maxn];
int n, m, ans, minn, cnt;
int c[maxn], p[maxn], tot[maxn];
bool vis[maxn], flag[maxn];
int g[maxn][maxn];void dfs1( int u, int fa ) {vis[u] = 1, p[++ cnt] = u;for( int i = 0;i < G[u].size();i ++ )if( vis[G[u][i]] ) continue;else dfs1( G[u][i], u );
}void dfs2( int u, int cost ) {if( cost > minn ) return;if( u > cnt ) {minn = min( minn, cost );return;}dfs2( u + 1, cost + c[p[u]] );if( ! flag[p[u]] && ! tot[p[u]] ) {for( int i = 0;i < G[p[u]].size();i ++ )tot[G[p[u]][i]] ++;dfs2( u + 1, cost );for( int i = 0;i < G[p[u]].size();i ++ )tot[G[p[u]][i]] --;}
}int main() {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ )scanf( "%d", &c[i] );for( int i = 1, u, v;i <= m;i ++ ) {scanf( "%d %d", &u, &v );g[u][v] = g[v][u] = 1;if( u == v ) flag[u] = 1; }for( int i = 1;i <= n;i ++ )for( int j = 1;j <= n;j ++ )if( g[i][j] ) G[i].push_back( j );for( int i = 1;i <= n;i ++ )if( ! vis[i] ) {cnt = 0, minn = inf;dfs1( i, 0 );dfs2( 1, 0 );ans += minn;}printf( "%d\n", ans );return 0;
}

T2:劫富济贫

【问题描述】
吕弗·普自小从英国长大,受到骑士精神的影响,吕弗·普的梦想便是成为一位劫富济贫的骑士。
吕弗·普拿到了一份全国富豪的名单(不在名单上的都是穷人),上面写着所有富豪的名字以及他们的总资产,比如豪特斯·珀去年资产有86E,吕弗·普就会准备抢来资助贫困的伯恩兄弟……
现在吕弗·普做了M次打劫计划,每次要打劫若干个人,他想知道每次能打劫到的总资产是多少
【输入格式】
第一行一个正整数N,代表富豪的个数
接下来N行,每行一个由小写字母组成的字符串Si和一个非负整数Wi,分别代表第i个富豪的名字和第i个富豪的资产数量
然后一个正整数M,代表吕弗·普的打劫次数
接下来M行,每行第一个数为正整数Xi,代表这次要打劫Xi个人,接下来有X个字符串,说明了这Xi个人是谁
【输出格式】
对于每次打劫任务,输出一行一个整数表示打劫到的总资产
如果这次打劫任务中打劫了一个穷人,那就输出-1
【样例输入】
2
a 10
b 20
3
2 a b
1 b
2 a c
【样例输出】
30
20
-1
【数据范围与约定】
对于30% 的数据,输入中每个名字的长度均为1
对于60% 的数据,N,∑Xi<= 100,输入中每个名字的长度<=10
对于100%的数据,N,∑Xi<= 10^5 ,输入中所有名字的总长<=2*10^6 ,Wi<=10^9,保证任意两个富豪名字不同,但不保证打劫计划中会不会有重复的人(重复的人会被重复打劫)

solution

法一:
直接mapmapmap就跑,应该是只能拿到70%70\%70%,但是我旁边的香香mm就莫名卡过去了,我就没卡过去
明知字典树可做的情况下还是以为3s3s3s,再怎么说mapmapmap也绰绰有余的
在这里插入图片描述

法二:hashhashhash应该是能AAA
法三:正解——trietrietrie字典树
还是很裸的了,大部分人在一看到这句话肯定就知道怎么写了

这里提一句关于数组大小的问题——此题只给了256MB
也就是说只允许一个trie[2e6][26]trie[2e6][26]trie[2e6][26]大小的数组再加点其他小数组
还必须留有一定的运行空间
刚开始我的flagflagflag数组开得跟trietrietrie一样大,然后就自然地MLEMLEMLE
后面才领悟到——其实只用开nnn大小的就可以了
因为虽然字典树是每个节点都有262626个儿子,但是我总点数就等于总名字长度,不会超过2e62e62e6

code

#include <cstdio>
#include <cstring>
#define maxm 2000005
#define maxn 500005
int n, m, cnt;
int trie[maxm][26], w[maxn];
char s[maxm];
int flag[maxm];void insert( char *s, int id ) {int p = 0, len = strlen( s );for( int i = 0;i < len;i ++ ) {int c = s[i] - 'a';if( ! trie[p][c] ) trie[p][c] = ++ cnt;p = trie[p][c];}flag[p] = id;
}int query( char *s ) {int p = 0, len = strlen( s );for( int i = 0;i < len;i ++ ) {int c = s[i] - 'a';if( ! trie[p][c] ) return 0;p = trie[p][c];}return flag[p];
}int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) {scanf( "%s %d", s, &w[i] );insert( s, i );}scanf( "%d", &m );for( int i = 1, x;i <= m;i ++ ) {scanf( "%d", &x );long long ans = 0;bool no = 0;for( int j = 1;j <= x;j ++ ) {scanf( "%s", s );int id = query( s );if( id ) ans += w[id];else no = 1;}if( no ) printf( "-1\n" );else printf( "%lld\n", ans );}return 0;
}

T3:小A的树

【问题描述】
给出一棵n个点的树,每个点有黑白两种颜色。q次询问,每次询问给出x和y,问能否选出一个x个点的联通子图,使得其中黑点数目为y。
【输入描述】
第一行一个正整数 T 表示数据组数。
对于每一组数据,第一行有两个用空格隔开的正整数,分别是 n 和 q ,表示树的节点数和询问次数。
接下来 n-1 行,每行两个用空格隔开的正整数和,表示和间有一条边相连。
接下来一行有 n 个用空格隔开的整数,其中值若0,则表示第 i 个点为白色,否则为黑色。
接下来 q 行,每行两个用空格隔开的整数 x 和 y 。
T=1,n<=5000,q<=10^5
【输出描述】
对于每一组数据,输出 q 行,每行为 “YES” 或者 “NO” (不含双引号),表示对于给定的和,能否满足小A 的要求。
每相邻两组数据的输出之间空一行。
【样例输入】
1
9 4
4 1
1 5
1 2
3 2
3 6
6 7
6 8
9 6
0 1 0 1 0 0 1 0 1
3 2
7 3
4 0
9 5
【样例输出】
YES
YES
NO
NO

solution

T=1T=1T=1就挺离谱儿的

这道题如果发现了一个性质👇就很简单了 然并卵,我既没有发现也不觉得发现后就简单了
在这里插入图片描述

对于某一大小的连通子图,其包含黑点数的最小值与最大值之间的所有点数目都能够取得到
简单感性证明一下哈哈哈哈
一个连通子图可以删除一个点再加入一个点,保证连通子图的大小依然不变
且此时黑点的数目变化最多只为111

然后此题就摇身一变为简单的树形dp带背包
在这里插入图片描述

如果对树形dp+背包不熟悉的可以先去做一下洛谷的选课

定义f[i][j]f[i][j]f[i][j]表示:iii子树中选jjj个点(即大小为jjj的连通子图)中包含黑点个数的最大值
定义g[i][j]g[i][j]g[i][j]表示:iii子树中选jjj个点(即大小为jjj的连通子图)中包含黑点个数的最小值

注意树形背包的正确枚举:只使用已经遍历过的点数目和当前子树中的点数目转移
否则会被链卡到 O(n3)O(n^3)O(n3)

code

#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define maxn 5005
vector < int > G[maxn];
int T, n, Q;
int w[maxn], siz[maxn];
int f[maxn][maxn], g[maxn][maxn];void dfs( int u, int fa ) {siz[u] = 1;f[u][1] = g[u][1] = w[u];for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == fa ) continue;dfs( v, u );for( int j = siz[u];j;j -- )for( int k = siz[v];k;k -- ) {f[u][j + k] = max( f[u][j + k], f[v][k] + f[u][j] );g[u][j + k] = min( g[u][j + k], g[v][k] + g[u][j] );}siz[u] += siz[v];}for( int i = 1;i <= n;i ++ ) {f[0][i] = max( f[0][i], f[u][i] );g[0][i] = min( g[0][i], g[u][i] );}
}int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d %d", &n, &Q );for( int i = 1, u, v;i < n;i ++ ) {scanf( "%d %d", &u, &v );G[u].push_back( v );G[v].push_back( u );}for( int i = 1;i <= n;i ++ )scanf( "%d", &w[i] );memset( g, 0x3f, sizeof( g ) );dfs( 1, 0 );for( int i = 1, x, y;i <= Q;i ++ ) {scanf( "%d %d", &x, &y );if( g[0][x] <= y && y <= f[0][x] ) printf( "YES\n" );else printf( "NO\n" );}}return 0;
} 

T4:游戏

【问题描述】
WYF从小就爱乱顶,但是顶是会造成位移的。他之前水平有限,每次只能顶出k的位移,也就是从一个整点顶到另一个整点上。我们现在将之简化到数轴上,即从 一个整点可以顶到与自己相隔在k之内的数轴上的整点上。现在WYF的头变多了,于是他能顶到更远的地方,他能顶到任意整点上。现在他在玩一个游戏,这个游 戏里他只能向正方向顶,同时如果他从i顶到j,他将得到a[j] * (j - i)的分数,其中a[j]是j点上的分数,且要求j > i, 他最后必须停在n上。
现给出1~n上的所有分数,原点没有分数。他现在在原点,没有分。WYF想知道他最多能得多少分。
【输入描述】
第一行一个整数n。
第二行有n个整数,其中第i个数表示a[j]。
【输出描述】
一个整数,表示WYF最多能得到的分数。
【样例输入】
3
1 1 50
【样例输出】
150
【数据范围】
对于60%的数据,n<=1000;
对于100%的数据,n<=100000,0<=a[j]<=50

solution

本场最简单的题没有之一——因为我A了
在这里插入图片描述
法一:我的做法——贪心
[1,n][1,n][1,n]间,最大值的地方假设为iii,我肯定直接从000飞到iii上面,中间不会有中转点
然后就从iii再继续飞到[i+1,n][i+1,n][i+1,n] 中最大值的地方,以此类推,实现方法很多,不赘述

法二:斜率优化
考场上我也推出来了,因为这个样子长得就在暗示我用斜率优化搞他
但是我发现贪心不更简单吗,所以我就没敲

在这里插入图片描述
f[i]=max(f[i],f[j]+a[i]∗(i−j))f[i]=max(f[i],f[j]+a[i]*(i-j))f[i]=max(f[i],f[j]+a[i](ij))
假设j<k<ij<k<ij<k<i且选择jjj优于选择kkk,翻译成C++👇
f[j]+a[i]∗(i−j)>f[k]+a[i]∗(i−k)f[j]+a[i]*(i-j)>f[k]+a[i]*(i-k)f[j]+a[i](ij)>f[k]+a[i](ik)
f[j]−f[k]>a[i]∗(j−k)f[j]-f[k]>a[i]*(j-k)f[j]f[k]>a[i](jk) 注意符号变化哦~
(f[j]−f[k])/(j−k)<a[i](f[j]-f[k])/(j-k)<a[i](f[j]f[k])/(jk)<a[i]

法三:我觉得特别巧妙——香香mm的做法
她的心路历程:看这个aaa范围这么小,在暗示她时间复杂度跟aaa挂钩,那肯定是O(n∗a)O(n*a)O(na)
在这里插入图片描述
考虑从式子本身进行变形
f[i]=f[j]+a[i]∗(i−j)=f[j]−j∗a[i]+a[i]∗if[i]=f[j]+a[i]*(i-j)=f[j]-j*a[i]+a[i]*if[i]=f[j]+a[i](ij)=f[j]ja[i]+a[i]i
发现a[i]∗ia[i]*ia[i]ijjj无关,所以就考虑求f[j]−j∗a[i]f[j]-j*a[i]f[j]ja[i]的最大值
但是因为j<ij<ij<i,所以在jjj的时候是无法知道a[i]a[i]a[i]的值的
那么就直接硬刚
是男人就硬刚 在这里插入图片描述

暴力枚举a[i]a[i]a[i]的大小
去求出当a[i]=xa[i]=xa[i]=x的时候,f[j]−j∗a[i]f[j]-j*a[i]f[j]ja[i]的最大值究竟是多少
存下来就可以了,我们不想知道是谁转移的,我们只想要转移后的最大值

for( int i = 1;i <= n;i ++ ) {scanf( "%d", &a );ans = max( ans, pre[a] + a * i );for( int j = 1;j <= 50;j ++ )pre[a] = max( pre[a], ans - i * j );
}
printf( "%d", ans );

code

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 100005
struct node {int v, id;node() {}node( int V, int Id ) {v = V, id = Id;}
}b[maxn];
int n;
int a[maxn];bool cmp( node x, node y ) {return x.v > y.v;
}
int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ )scanf( "%d", &a[i] );for( int i = 1;i <= n;i ++ )b[i] = node( a[i], i );sort( b + 1, b + n + 1, cmp );int p = 0, ans = 0;for( int i = 1;i <= n;i ++ ) {int val = b[i].v, ip = b[i].id;if( ip < p ) continue;else ans += val * ( ip - p ), p = ip;}printf( "%d\n", ans );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1742 最小圆覆盖

P1742 最小圆覆盖 题意&#xff1a; 给出N个点&#xff0c;让你画一个最小的包含所有点的圆。 题解&#xff1a; 先说结论&#xff1a; 最优解的圆一定是在以某两个点连线为直径的圆 或者 某三个点组成的三角形的外接圆 初始化将某个圆心定为第一个点&#xff0c;R0 枚举第…

Java实现非对称加密【详解】

Java实现非对称加密 1. 简介2. 非对称加密算法--DH&#xff08;密钥交换&#xff09;3. 非对称加密算法--RSA非对称加密算法--EIGamal5. 总结6 案例6.1 案例16.2 案例26.3 案例3 1. 简介 公开密钥密码学&#xff08;英语&#xff1a;Public-key cryptography&#xff09;也称非…

轻量级.Net Core服务注册工具CodeDi发布啦

为什么做这么一个工具因为我们的系统往往时面向接口编程的,所以在开发Asp .net core项目的时候,一定会有大量大接口及其对应的实现要在ConfigureService注册到ServiceCollection中,传统的做法是加了一个服务,我们就要注册一次(service.AddService()),又比如,当一个接口有多个实…

2020 CSP-S 游记

迟到的游记总述T1&#xff1a;儒略日T2&#xff1a;动物园T3&#xff1a;函数调用T4&#xff1a;贪吃蛇总结总述 可能是有了去年第一次的狂炸经历&#xff0c;很明显的就是在考试策略上的提升 头不铁了&#xff0c;手不残了&#xff0c;心态稳了&#xff0c;分也多了 T1&…

P7516-[省选联考2021A/B卷]图函数【bfs】

正题 题目链接:https://www.luogu.com.cn/problem/P7516 题目大意 懒了&#xff0c;直接抄题意了 对于一张 nnn 个点 mmm 条边的有向图 GGG&#xff08;顶点从 1∼n1 \sim n1∼n 编号&#xff09;&#xff0c;定义函数 f(u,G)f(u, G)f(u,G)&#xff1a; 初始化返回值 cnt0cn…

【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期

上一篇我介绍了JWT的生成验证及流程内容&#xff0c;相信大家也对JWT非常熟悉了&#xff0c;今天将从一个小众的需求出发&#xff0c;介绍如何强制令牌过期的思路和实现过程。.netcore项目实战交流群&#xff08;637326624&#xff09;&#xff0c;有兴趣的朋友可以在群里交流讨…

[2020-11-24 contest]糖果机器(二维偏序),手套(状压dp),甲虫(区间dp),选举(线段树 最大子段和)

文章目录T1&#xff1a;糖果机器solutioncodeT2&#xff1a;手套solutioncodeT3&#xff1a;甲虫solutioncodeT4&#xff1a;选举solutioncodeT1&#xff1a;糖果机器 solution 考虑从第iii个糖果出发能到达第jjj个&#xff0c;则有Tj−Ti≥∣Sj−Si∣T_j-T_i≥|S_j-S_i|Tj​…

ASP.NET Core 数据加解密的一些坑

点击蓝字关注我ASP.NET Core 给我们提供了自带的Data Protection机制&#xff0c;用于敏感数据加解密&#xff0c;带来方便的同时也有一些限制可能引发问题&#xff0c;这几天我就被狠狠爆了一把我的场景我的博客系统有个发送邮件通知的功能&#xff0c;因此需要配置一个邮箱账…

[2020-11-28 contest]素数(数学),精灵(区间dp),农夫约的假期(结论),观察(树链剖分lca+set)

文章目录素数solutioncode精灵solutioncode农夫约的假期solutioncode观察solutionsolutioncode素数 solution 通过观察可得一个结论 对于两个相邻的质数p1,p2(p1<p2)p_1,p_2\ (p_1<p_2)p1​,p2​ (p1​<p2​) 对于x∈[p1,p2)x∈[p_1,p_2)x∈[p1​,p2​)&#xff0c;都…

B. Box Fitting

B. Box Fitting 题意&#xff1a; 现在有n个长方形&#xff0c;宽均为1&#xff0c;现在有一个底为m的容器&#xff0c;问将长方形放入其中&#xff0c;所用容器的最小宽度是多少 &#xff08;长方形必须长朝下放置详细如图&#xff09; 题解&#xff1a; 比赛时脑子抽了。…

人工智能第六课:如何做研究

这是我学习 Data Science Research Methods 这门课程的笔记。这门课程的讲师是一名教授和数据科学家&#xff0c;可能因为他既有理论背景&#xff0c;又有实践经验&#xff0c;所以整个课程听下来还比较舒服&#xff0c;学到了一些不错的理论知识。这门课比较系统地介绍了什么…

[2020-11-30 contest]数列(矩阵加速),秘密通道(dijkstra最短路)小X游世界树(换根dp),划分(数学)

文章目录数列solutioncode秘密通道solutioncode小X游世界树solutioncode划分solutioncode数列 a[1]a[2]a[3]1 a[x]a[x-3]a[x-1] (x>3) 求 a 数列的第 n 项对 1000000007&#xff08;10^97&#xff09;取余的值。 输入格式 第一行一个整数 T&#xff0c;表示询问个数。 以下…

Docker最全教程——数据库容器化之持久保存数据(十二)

上一节我们讲述了SQL Server容器化实践&#xff08;注意&#xff0c;SQL Server现在也支持跨平台&#xff09;&#xff0c;本节将讲述如何持久保存数据&#xff0c;并且接下来将逐步讲解其他数据库&#xff08;MySql、Redis、Mongodb等等&#xff09;的容器化实践&#xff0c;中…

【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行)

文章目录前言李超树引入(斜率优化)什么是李超树&#xff1f;李超树活着能干点什么&#xff1f;算法思想(使用手册&#xff1f;)插入查询模板判断是否覆盖(优不优)插入查询例题板题&#xff1a;BlueMary开公司分析code线段游戏分析code拓展——(动态开点李超树维护凸包)ZZH的旅行…

老牌开源Office操作组件NPOI现已支持.NET Core

昨天在微信群里听到老牌Excel开发利器NPOI的作者瞿总说4.6.1版本的NPOI已经支持.NET Standard 2.0了&#xff0c;这也就意味着你可以在.NET Core中使用NPOI了。作者&#xff1a;依乐祝原文地址 &#xff1a;https://www.cnblogs.com/yilezhu/p/10269281.html写在前面曾经的.NET…

.NET西安社区 [拥抱开源,又见 .NET] 第二次活动简报

「拥抱开源, 又见 .NET」随着 .NET Core的发布和开源&#xff0c;.NET又重新回到人们的视野。 .NET Core的下个3.0即将release&#xff0c;加入非常多的新功能&#xff0c;越来越拥抱变化&#xff0c;DevOps和Microservice的最佳实践已经在 .NET Core落地&#xff0c;比如 Ocel…

[dsu on tree]树上启发式合并总结(算法思想及模板附例题练习)

文章目录前言树上启发式合并引入算法思想时间复杂度模板练习例题&#xff1a;CF600E Lomsat gelralsolutioncodeCF208E Blood CousinssolutioncodeCF570D Tree RequestssolutioncodeCF1009F Dominant Indicessolutioncode前言 最近不是在⛏李超树嘛&#xff0c;然后就去玩了下…

领域驱动设计,让程序员心中有码(七)

领域驱动设计- 让程序员心中有码&#xff08;七&#xff09;-设计原则和设计模式&#xff0c;互联网开发者们共同的追求前言多年来&#xff0c;笔者一直从事传统软件企业的软件开发和项目管理工作。笔者发现在众多的传统软件企业中&#xff0c;评判优秀开发者的标准往往是技能的…

cf1504. Travelling Salesman Problem

cf1504. Travelling Salesman Problem 题意&#xff1a; n个城市&#xff0c;编号1~n&#xff0c;每个城市有美丽值a[i]&#xff0c;现在要从城市1出发&#xff0c;其他所有城市走一遍&#xff0c;最后回到城市1&#xff0c;城市i到j的花费为max(ci,aj-ai)&#xff0c;ci为第…

[NOIP-S 2020]游记(附考前注意事项)

呜呼起飞T1&#xff1a;排水系统T2&#xff1a;字符串匹配T3&#xff1a;移球游戏T4&#xff1a;微信步数总述考前注意事项T1&#xff1a;排水系统 嗯—— 怎么说呢&#xff1f;&#xff1f; 比赛开始后迅速通读三遍题 顶着第一题肯定是打卡题的心态 哪怕是恶心模拟也得上&…