【题解】 P5022旅行】的更多相关文章

[题解]P5022 旅行 当给定你一颗树的时候,这题就是一道送分题,凉心啊! 但是给定你一颗基环树呢? 暴力断环直接跑. 但是数据范围\(n\le 1000\) 乱做就完事了. 考场上这样想的,对于\(m=n​\)的情况,得出来的最佳方案一定没有经过一条树边.那么我们直接枚举那条边不能走,直接\(O(n^2)​\)过就好了. 不过这样的算法有一个\(bug\),是因为\(dfs\)在节点上需要枚举哪个点最小,很可能被卡到\(O(n^3)\),但是\(ccf\)今年换配置了,而且不可能每个点都要枚…
题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m = n - 1 时的树的做法. 读题推一下样例不难发现,如果选择一个分支节点就必须走到头--直到一个节点没有子树. 那么我们就可以贪心的求得最小字典序序列,每次选择节点编号最小的走. 即对当前节点的所有子节点排序选择最小编号的往下进行即可. 60分code: #include <cstdio> #include <…
发现大部分题解都是O(n^2)的复杂度,这里分享一个O(n)复杂度的方法. 题目传送 首先前60%的情况,图是一棵无根树,只要从1开始DFS,每次贪心走点的编号最小的点就行了.(为什么?因为当走到一个点u时,若不把以它为根的子树的所有点都遍历一遍的话,回溯到u的父亲后,就再也没可能遍历u的没有遍历过的儿子了.) 再看剩下40%的情况,由于题目保证图是一个无向连通图,当 边数 等于 点数减一 时图必为树,在此基础上再多加一条边,就在一棵树的基础上形成一个环(为了方便,后文仍会提到树,而后文的树指的…
题目链接:https://www.luogu.org/problem/P5022 这道题目一开始看的时候没有思路,但是看到数据范围里面有一个: \(m = n-1\) 或 \(m = n\) ,一下子有了思路. 当 \(m = n-1\) 时,这就是一棵树,以1为根节点进行搜索,每次优先访问编号小的点即可. 当 \(m = n\) 时,可知只有一个环,找到环中对应的所有边,然后遍历每一条环中的边,假设删除它,然后就变成了一棵树. 时间复杂度为:\(O(n^2)\) . 实现代码如下: #incl…
本人的代码可以说洛谷最简单的了 我的存图方式有些与众不同 a[5000][5000]中第一个下标表示第几个点,第二个表示与点相连的点 虽然比前向星废内存但时间极快,大概是O(n)的. 现在步入正题 60分代码思路 用深搜查找最小路径很简单 #include<cstdio> #include<algorithm> using namespace std; int n,m,a[5005][5005],lj[5005]={0},c[5005]={0},s=0,fs=1,h[5005]={…
前面几个代码都是部分分代码,最后一个才是AC了的,所以最后一个有详细注释 安利一发自己的Blog 这是提高组真题,233有点欧拉回路的感觉. 题目大意: 一个 连通 图,双向边 ,无重边 , 访问图中所有点并依次记录经过的点的编号.求记录的编号字典序最小. 题目数据分析 题目中有 M 条边,而 M 有两种情况: M = N 或者 M = N- 1 . 现在我们将 M = N的情况叫做情况一 ,M = N - 1叫做情况二 情况一和情况二分析 情况二:我们都知道,一棵生成树有N - 1条边,且要保…
\(\mathcal {NOIP2018} 旅行 - 竞赛题解\) 坑还得一层一层的填 填到Day2T1了 洛谷 P5022 题目 (以下copy自洛谷,有删减/修改 (●ˇ∀ˇ●)) 题目描述 小 Y 是一个爱好旅行的 OIer.她来到 X 国,打算将各个城市都玩一遍. 小Y了解到, X国的 \(n\) 个城市之间有 \(m\) 条双向道路.每条双向道路连接两个城市. 不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路.并且, 从任意一个城市出发,通过这些道路都可以到达任意…
原题链接  https://www.luogu.org/problem/P5022 本着快csp了,做点往年的NOIp的题试试水来着,没想到水这么深 难度还挺大的,耗了我一天的时间(可能是我太菜了) 题目大意: 给你 n 个点和 m 条边,问如何遍历每个结点才能使最后的字典序最小,注意只有遍历完一棵字树的所有结点后才能回溯到他的父亲结点: 前 60 pts: 作为 NOIp2018 day2T1 来说,部分分确实给的挺足的,这 60 pts 就是哦: 看到 m = n-1 说明这是一棵树,考虑用…
传送门 先考虑是一颗树的情况 求最小的 dfs 序 显然按儿子编号从小到大dfs 如果有多一条边怎么办 显然会有一条边不用走 直接枚举删那条边然后每次都暴力 dfs 复杂度 $O(n^2)$ 注意每个节点的儿子顺序先预处理好 不要每次都重新算 #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<v…
Description 某趟列车的最大载客容量为V人,沿途共有n个停靠站,其中始发站为第1站,终点站为第n站.在第1站至第n-1站之 间,共有m个团队申请购票搭乘,若规定:(1)对于某个团队的购票申请,要么全部满足,要么全部拒绝,即不允 许只满足部分.(2)每个乘客的搭乘费用为其所乘站数.问:应如何选择这些购票申请,能使该趟列车获得最大 的搭乘费用?其中,每个团队的购票申请格式是以空格分隔的三个整数:a b t,即表示有t个人需要从第a站点 乘至第b站点(注:每个团队的所有人员都必须同时在a站上…
开始写复赛题了 先放张图纪念我惨烈的卡常之路 不说了,简直悲伤 题目链接 思路么..不想写了 Code //不要在意四十行超级加速,卡常用的 #include<bits/stdc++.h> #pragma GCC optimize(3) #pragma GCC target("avx") #pragma GCC optimize("Ofast") #pragma GCC optimize("inline") #pragma GCC o…
以后必须学会面向数据编程!看半天题目不知道咋写直接爆搜,结果分少的可怜,还不如直接贪搞个60分. 观察数据,发现图至多存在一个环. 显然,如果没有环,这个题不跟你多bb,直接贪就完事了,线性复杂度. 原因十分显然,一旦你还没走到底就往回走的话,就走不完整张图了. 有环的话,这题就是个基环树. 根据题意,小Y显然是不能走完一个环的,那就简单了,直接删边开搞. 参考代码 #include<iostream> #include<cstdio> #include<cstring>…
好吧...一直咕..现在才过...被卡常卡到爆... 写的垃圾版本,$n^2$无脑删边..可以发现走出来的是棵树...更优秀的及数据加强版先咕着...一定写.qwq #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #define ll long long #define R register int <<…
今天换标题格式了,因为感觉原版实在有点别扭…… 还是直接上题板,看完题再讲吧: 对了有个小细节没说,m一定是等于n或者等于n-1的. 这题是2018年提高组的真题哦!被我肝了2天肝出来了,2天……(真打提高怕不是废了) 哎呀不说废话直接开始.首先我们知道m肯定等于n或者n-1,就可以把这个题分成2种情况: 先做第一种:好做的m等于n-1 在m等于n-1的情况,是不存在指针在里面转圈圈,转到一半还要退出来的情况的.至于这是为什么,我们可以把他看成是一个每个点的入度都为一的图,每个点只有一次从别的点…
做了几天远古老题,发现不可做,于是咕掉..转而从2005开始.. 1997: P1549 棋盘问题(2):搜索,优化搜索顺序,对于第一行第一列先搜小的(但是其实这样是错的,仅仅能过原题) 加强版咕. 1998: P1011 车站:类似斐波那契,推式子即可. P1012 拼数:sort cmp:a+b>b+a P1013 进制位:观察性质发现,一定是n-1进制. 原因:若进制 <n-1 会出现重复字母,若进制 >n-1 则不会进位导致出现更大的数. 判断一个数字是什么: 其实就是这样 19…
题意 大家都是优秀生,这点英文还是看得懂的:点此看题 题解 由于旅行路线成一个环,所以从哪里出发不重要,我们把景点按照 a i a_i ai​ 排序,不妨就从左边最小的出发.基础的旅行费用 c i c_i ci​ 是都要算上的,我们的目的是最小化额外的费用 ∑ max ⁡ ( 0 , ( a j − a i ) − c j ) \sum\max(0,(a_j-a_i)-c_j) ∑max(0,(aj​−ai​)−cj​) . 很明显有一部分的景点是回程(从大到小飞回起点)的时候经过的,这些景点一…
题目大意: 给出n个排成一行的城市,每个城市有一个不同的海拔.定义两个城市间的距离等于他们的高度差的绝对值,且绝对值相等的时候海拔低的距离近.有两个人轮流开车,从左往右走.A每次都选最近的,B每次都选次近的.旅行时有一个总路程x,如果两个人的总路程>x 或 有一个人无法按照自己的原则选择目的城市,旅行就终止. 有两个问: 1.给出x0,求从哪一个城市出发,使得A走的路程/B走的路程最小.如果B走的路程=0,则比值视为无穷大.如果有多个城市满足要求,则输出海拔最高的那个城市. 2.给出x和s(出发…
[HAOI2006]旅行 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,-,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路.也许是为了保护该地的旅游资源,Z小镇有个奇怪的规定,就是对于一条给定的公路Ri,任何在该公路上行驶的车辆速度必须为Vi.速度变化太快使得游客们很不舒服,因此从一个景点前往另一个景点的时候,大家都希望选择行使过程中最大速度和最小速度的比尽可能小的路线,也就是所谓最…
Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个…
从佳木斯回来刷一刷去年没A的题 题目描述 小 Y 是一个爱好旅行的 OIer.她来到 X 国,打算将各个城市都玩一遍. 小Y了解到, X国的 nn 个城市之间有 mm 条双向道路.每条双向道路连接两个城市. 不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路.并且, 从任意一个城市出发,通过这些道路都可以到达任意一个其他城市.小 Y 只能通过这些 道路从一个城市前往另一个城市. 小 Y 的旅行方案是这样的:任意选定一个城市作为起点,然后从起点开始,每次可 以选择一条与当前城市…
P1522 牛的旅行 Cow Tours 题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个牧场了. John想在牧场里添加一条路径(注意,恰好一条).对这条路径有以下限制: 一个牧场的直径就是牧场中最远的两个牧区的距离(本题中所提到的所有距离指的都是最短的距离).考虑如下的有5个牧区的牧场,牧区用"*"表示,路径用直线表示.每一个牧区都…
旅行(不是加强版) 加强版 加强版数据范围: 我们注意到 也就是说要么是个树,要么是个基环树 60pts 这60分是个树,可以简单的贪心想到每次都走子树中编号最小的那个,并且把1作为根 dfs练手题 还是贴个代码叭 void dfs1(int now,int fa) { if(vis[now])return ; ans1[++t]=now; vis[now]=1; vector<int> qwq;//为了不使存储的点被后面的子树覆盖,所以用vector for(int e=head[now];…
这道题是真滴火!(一晚上加一节信息课!) 先链接一下题目:luoguP1081 开车旅行 首先,这个预处理就极其变态,要与处理出每一个点往后走A会去哪里,B会去哪里.而且还必须O(nlogn)给它跑出来,反正这就要了我好久好久的时间,还没想出来!那么我们来慎重思考一下: 1.既然要让我们这么快的时间内把一个点东边的高度最近和次近找出来,只能考虑先排序.那我们就先让它以高度为关键字排一遍序,肯定还是要记录一下原先的序号的. 2.模拟一下,如果我们要找第一个点(最西边的点)的预处理,那不就是在排完序…
题面:https://www.cnblogs.com/Juve/articles/11733280.html 最大异或和: 简单博弈,小Q一定不会输,如果异或和为0,则平局,因为无论小Q如何拿,小T都会拿到和小Q一样 如果异或和不为0,则小Q只要取走二进制下最高位的那个数即可 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define int long l…
题目大意: 给出一个n个点的数,和m次操作.每个点有颜色和权值. 每次操作分4种 1:修改一个点的颜色 2:修改一个点的权值 3:询问从x到y的路径上,和x相同颜色的点的权值和(保证x,y同颜色) 4:询问从x到y的路径上,和x相同颜色的点的权值最大值(保证x,y同颜色) 思路: 树链剖分,用线段树来维护和以及最大值. 代码: #include<cstdio> #include<iostream> #define M 3000009 using namespace std; ],n…
题目链接:https://www.luogu.org/problemnew/show/P1137 topsort + DP #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 100001; struct edge{ int next,…
洛谷P3313 大概是一道树链剖分的裸题.可以看出如果不是查询相同宗教的这一点,就和普通的树链剖分毫无两样了.所以针对每一个宗教都单独开一棵线段树,变成单点修改+区间查询.只不过宗教数目很多,空间消耗太大所以只能开一棵总的再动态开点. #include <bits/stdc++.h> using namespace std; #define maxn 200500 #define maxm 2000000 , cnt, tot, root[maxn], name[maxn], head[max…
传送门 很显然,每个点的答案是它所有前驱节点的答案加1,即f[i]=max(f[i],f[j]+1); 考虑空间复杂度用邻接表存图,在拓扑排序同时DP就好了 #include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<map> #include<cmath> using namespace std; ],],total,f[]; qu…
由于此题边数比较小,所以可以先给边排个序,然后跑m遍最小生成树,每跑一次删除一条边,找最优解. 防TLE技巧 把边按从小到大的顺序排好,那么只要当前无法联通,那么后面也无法联通 最优解找法 double tmp=(1.0*e[i].w)/(1.0*e[j].w); //因为边是有序的,所以当前的第一条边是最大的,保证能联通的最后一条边就是最小的(详细的自己理解) if(tmp<ans) a=e[i].w,b=e[j].w,ans=tmp; //与当前的最优解进行比较 分数的处理技巧 设a和b是最…
题目链接 https://www.luogu.org/problemnew/show/P2502 分析 一个很\(naive\)的做法是从\(s\)到\(t\)双向BFS这当然会TLE 这时我就有个想法就是二分套二分边下标来求得一个比值,同时排序后从小到大枚举每一条边作为最小值,同时再枚举每一条边,如果边权之比小于比值就连起来用并查集维护连通性,可是这个时间复杂度\(O(m^2 log^2m \ \alpha(n))\)过不去QAQ 然后想为什么不直接枚举每条边作为最小值,同时搞一颗以这条边为最…