P9166 [省选联考 2023] 火车站
Posted iruiforever
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P9166 [省选联考 2023] 火车站相关的知识,希望对你有一定的参考价值。
这道题很抽象,有这么几点注意事项
1,火车必须走到尽头才可以停下,所以答案一定会出于输入的这些端点
2,火车只能往一个方向走,不可以在中途换向
那么这题怎么处理?不会真的要一波操作然后把所有答案排个序吧?
我选择标记法!标记答案,省去了排序的过程。
那么哪些端点是答案?
这是个大问题!
那么我们开始构思,头脑风暴法?瞪眼法!考场三个小时直接不断优化,不断更新思路
从一开始的想要建图,想要掏出杀手锏search,到后来冷静分析,用有限的数据找到题目的精髓,找到答案统计的本质,经过一波分析,我决定从新出发,用最简朴的方式,最朴素的算法切掉这题,数据规模不大,才2e5,那么我们可以直接相信奥义,既然题干告诉你这是火车站,那么我们化身为工程师了,总览全局,真正融入修铁路这门事业
考虑到可能数据规模较大,我们就要边输入边扩建,从起点扩建范围,只有与已建好铁路范围有交集的铁路才可以实现已建好铁路的扩建,那么输入的过程顺便修点铁路也可以神奇的省去复杂度,早开工早下班
那么假设我们已经拿到了一段修好的铁路,什么是答案?
分为以下几种情况
1,这条轨道区间在已经建好的范围内
x在这条轨道区间内 左右端点都是答案
x在这条轨道区间左边 右端点是答案
x在这条轨道区间右边 左端点是答案
2,这条轨道左端点在起点和已经建好的右端点之间,右端点在外边
右端点是答案
3,这条轨道右端点在已经建好的左端点和起点之间,左端点在外边
左端点是答案
4,已经建好的在这条轨道区间的范围内
这一轮没用,先丢进队列
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
struct pp
int a, b;
e[200001];
queue<int> q;
int now_l = 200001, now_r, cnt, w, copy_m/*剩余轨道数量*/;
bool ans[200001], p[200001];
int main()
int n, m, x;
scanf("%d%d%d", &n, &m, &x);
copy_m = m;
for(int i = 1, l, r; i <= m; ++i)
scanf("%d%d", &l, &r);//输入轨道边界
e[++cnt].a = l;//存轨道
e[cnt].b = r;
q.push(cnt);//以轨道编号压入队列
if(l <= x && r >= x) now_l = min(l, now_l), now_r = max(r, now_r);//扩建
int now;
while(!q.empty())
now = q.front();
q.pop();
if(e[now].a >= now_l && e[now].b <= now_r) //这条轨道在建好的轨道之间
if(e[now].a <= x && e[now].b >= x)//起点在这条轨道上
ans[e[now].a] = 1, ans[e[now].b] = 1;//这条轨道两端都可以到
else if(e[now].a >= x && e[now].b >= x) //整个轨道在起点右边
ans[e[now].b] = 1;//这条轨道只有右端点可以到
else if(e[now].a <= x && e[now].b <= x) //整个轨道在起点左边
ans[e[now].a] = 1;//这条轨道只有左端点可以到
copy_m--;
w = 0;
continue;
else if(e[now].a >= x && e[now].a <= now_r && e[now].b > now_r) //这条轨道左端点在已经建好的轨道范围内,右端点出界
now_r = e[now].b;//扩建
ans[e[now].b] = 1;//右端点可以到
copy_m--;
w = 0;
continue;
else if(e[now].a < now_l && e[now].b >= now_l && e[now].b <= x) //这条轨道右端点在已经建好的轨道范围内,左端点出界
now_l = e[now].a;//扩建
ans[e[now].a] = 1;//左端点可以到
copy_m--;
w = 0;
continue;
else //与已经建好的轨道无交集
q.push(now);//再次压入队列
w++;
if(w == copy_m) break;//如果连续压入队列的次数等于剩余轨道数量,说明剩下的轨道是飞舞,退出循环
for(int i = 1; i <= n; i++)
if(i == x) continue;
if(ans[i]) printf("%d ", i);//被标记过的点可以到达
return 0;
省选联考 2023 同步赛
\\(3.29 Day-2\\)
今天精神很好,打王者打到三点才睡。
\\(3.30 Day-1\\)
早上突然惊醒,七点半了,匆忙清完行李出门,眼睁睁的看着一辆电车从面前发车,只能多等 \\(10\\) 分钟,为我的迟到奠定了基础。
到了北站,三年没来了不知道怎么走,还好前面有位姐姐,跟着她走到了集合点。
出门的时候好像看到了高二物竞的同学,在北站又碰到了,他们出去培训。
在车站候检的时候,做了一面必刷题,上车做了两面,然后看立体几何的视频。
到了武汉,坐车到了华科,安排好了入住,被教练赶去吃饭,向左拐再右拐到了食堂,旁的一些餐馆, 吃了麦当劳,回宾馆放了点东西就去考试了。
到了考场,先打基础模板,\\(T1\\) 不记得是啥了,\\(T2\\) 我看出来了有些贡献需要用到桥(可惜我忘了,考完也没有看,\\(D1T2\\) 直接挂钩),然后就算桥搞出来了,也不会,特殊性质啥的也想不出来,好菜啊呜呜呜,\\(T3\\) 构造+数论,很恶心,不想写,好像退火有分,但是懒得写)于是全输出 \\(0\\),就睡过去了后面的时间。结束前监考员说晚上讲解的位置是下一楼先左转再右转(那到底是往下一层楼还是在一楼呢?)。
出考场,被教练赶去食堂吃饭(不得不说,华科饭真贵,临时卡还加钱,又不合胃口)。
然后赶去听张泽阳讲题(肚子异常的痛,就先蹲了个坑,本以为是结束,没想到是开始)。
\\(zzy\\) 在 \\(b\\) 站开了直播,但是没开声音))。
听不懂,只听到了点分治,求导,竞赛图(就是不会的),然后就打开了蜘蛛纸牌,好好玩。
当时跟 \\(yyh\\) 石头剪刀布把自己 \\(qq\\) 二维码给后面同学扫,巧合之中面基了 \\(Fy5\\)。
讲解结束,匆忙赶回宾馆打游戏。
回去肚子又痛了。
十点被教练拖回去,洗了澡,还洗了衣服,没有晾的地方,于是我:
然后抱着单身狗睡着了。
\\(3.31 Day0\\)
早上错过了闹钟,从六点响到六点半,最后八点半起床吃早餐,然后又是摆烂。
中午玩游戏玩到一半 \\(yyh\\) 打电话叫我出去吃饭,然后出发,先左转再右转,中午去秀玉,吃的很好。
吃饭会到宾馆,依然如就,玩了下午+晚上,下午肚子痛,晚上没吃饭,有点饿于是就一起出去买了夜宵。
由于买的比较多,我记错号码了,然后问了错误的没好(等了很久,实际确实也没好),然后不想去问好没好,没 \\(wy,yyh\\) 尊称为社恐。
回到宾馆,刚准备吃,被教练赶回去了))。
吃完就睡了。
\\(4.1 Day1\\)
早上起不来,被教练赶起来吃饭,去考试,到了考场,倒数第二排,\\(but\\) 居然是 \\(windows\\) 系统,我以为只能用 \\(linux\\) 特别慌,同样是代码模板,这次想写个 \\(dinic\\),然后忘了 \\(dfs\\) 那里怎么写了,寄。考试的时候肚子痛。
解压密码:up@up#up$1234
pdf密码:flood#head0413
\\(T1\\),读完特别激动,因为水啊!签到题,先给序列排序,只需要维护左右最大能拓展到什么点,对应输出就可以了,是 \\(O(n)\\) 的,瓶颈在排序,\\(8:40\\) 写完,由于大样例是 \\(linux\\) 格式的,以为自己错了,搞到九点。
\\(T2\\) 不会,写了 \\(10\\) 分的 \\(n2^m\\) 暴力跑路了。
\\(T3\\)
\\(9:30\\) 有个显然的贪心策略,能力值大的尽量下放(重儿子排序,每次放在siz最大的儿子,放满再放下一个儿子)。
然后小的尽量往上,直接一遍 \\(dfs\\) 就可以实现,这是 \\(O(n)\\) 的,但跑不满,常数比较小。
答案的话,树形dp即可,复杂度是 \\(O(nm)\\) 的。
性质 \\(A\\),不太会,应该跟树链剖分扯上了关系(没有修改操作)。
性质 \\(B\\),一条链不需要树形 \\(dp\\) 了,直接差分就可以实现。
性质 \\(C\\),不需要每次重新调整整棵树,改一个值足以,直接修改答案即可。
然后初始插入的话,是 \\(O(nk)\\) 的。
总时间复杂度\\(O(nk+nm)\\)。
期望得分 \\(48\\)分
\\(9:40\\) 好困啊,先睡一会,顺便想想 \\(T2\\)。
\\(10:25\\) 睡醒了,猛然发现,\\(T3\\) 删除操作好像不好搞。
\\(dp[i][j]\\) 前 \\(i\\) 个中,第 \\(i\\) 个优秀点,放在 \\(j\\) 的最大价值。
\\(dp[i][j] = max(dp[i-1][k])+val\\)
可以滚动数组优化,但是怎么去重。
现在期望得分玄学。
\\(11:10\\) 贪心假了,寄。原因,看错题了。
然后又想了几个贪心感觉很对,又感觉很不对,然后通过 \\(sb\\) 的思维 \\(hack\\) 掉了(事实好像并不会),然后就没写,然后搞了 \\(6\\) 分的暴力,后面的时间就摸鱼过去了。走之前我大胆喻言,我就不信明天座位还能更靠后。
估分:\\(100+10+6=116\\)
出考场,跟两位同学浅谈了一下,我说希望有数学,回到宾馆,没吃午饭(两点了,没时间,也懒得吃),玩了一下午,晚上吃了夜宵(又是麦当劳)。晚上回到房间肚子又很痛。
正好周末,麦旋风买一送一。
吃完很困,然后躺床上睡着了,在听音乐,但是忘了关了。
\\(4.2 Day2\\)
早上被教练赶起来,然后去洗澡,洗到一半肚子痛,然后蹲坑继续洗,搞了五十分钟。
去前台存包,放完听到前台姐姐跟旁边的哥哥说了句好可爱,不知道是不是我。
吃完,我跟 \\(yyh,wy\\) 说希望有大模拟,这样我只写这个题。
进考场,带了五包面包,拿不下,安检的时候还掉了,好尴尬。
一看座位,大惊失色,居然是最后一排,太难受了!
同样是写完代码模板,开题:
解压密码:downdown&down^9981
pdf密码:pku#120401@
\\(T1\\) 草!大模拟,可惜带博弈,真恶心。性质 \\(A\\) 是送的,快速写完,性质 \\(B\\) 有点复杂,画了好多图手膜了很久,写了差不多十种情况,伴随着大样例,调过了。这时只有 \\(30\\) 分,还有 \\(40\\) 分的特殊性质分能写,但是已经十一点了,没时间了,赶紧转去 \\(T3\\)。打完 \\(T2\\) 暴力后,\\(12:20\\) 了,赶紧写性质 \\(D\\),\\(12:40\\) 写完了,过了小样例,大样例救不活了,性质 \\(C\\) 很繁琐,没时间想,今天很亏。
\\(T2\\) 没怎么想,只写了 \\(20\\) 的暴力,(其实这题的某性质是非常经典的二分图匹配,可以用网络流实现,但是我没有去想,很亏)。
\\(T3\\) 感觉比较有感觉,第一问算了半个小时,发现答案与杨辉三角有关,然后码码码,发现还要冗斥,这时已经 \\(12\\) 点了,而且发现第一问只有 \\(1\\) 分,果断放弃(第二问没有思路),转向 \\(T2\\) 暴力。
估分:\\(30+20+0=50\\)
总分:\\(100+10+6+30+20+0=166\\)
又到了漫长的验代码环节,吃完了所有零食,又等了好久才到我,好慢,隔壁的都走光了。
老师看到我的代码的第一行,就说哈哈,不用看了吧,我也很开心的说,不要了不要了太明显了,然后光速溜走了)。
到一楼,\\(yyh\\) 说这次时间很紧,代码不够写,\\(wy\\) 他调二分图调了两个多小时。
路上和 \\(wy\\) 通过不严谨分析发现 \\(T1\\) 的性质 \\(C\\) 有 \\(48\\) 种情况。
然后到超时买了点零食就返程了,中午又没吃饭。
下午在火车上尝试做全品,但是燥热,没心思做,只能继续听立体几何(四天未上 \\(b\\) 站,未写作业)。
带了半箱作业,想不到只做了随身背的两本书,效率感人。
总的来说,这次虽然是同步赛,题目也感受了,感谢 \\(NOIP\\) 的炸裂,没有让我盲目停课备战省选去尝试今年的一项不可能的事,虽然没有认识新朋友,但是玩得很开心,希望明年的 \\(NOIP\\) 我能取得优异的成绩,而现在的目标,确实得转向 \\(whk\\),或许正如老师所言,我可能应该退役了,但是,未来又有谁说得准,我命由我不由天!
完结 \\((2023.4.3)\\)
以上是关于P9166 [省选联考 2023] 火车站的主要内容,如果未能解决你的问题,请参考以下文章