P9166 [省选联考 2023] 火车站

Posted iruiforever

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P9166 [省选联考 2023] 火车站相关的知识,希望对你有一定的参考价值。

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#1204
01@

\\(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] 火车站的主要内容,如果未能解决你的问题,请参考以下文章

[P9167] [省选联考 2023] 城市建造

树[省选联考2020]

P6627 [省选联考 2020 B 卷] 幸运数字

luoguP6623 [省选联考 2020 A 卷] 树(trie树)

P6625 [省选联考 2020 B 卷] 卡牌游戏

题解 省选联考2020 组合数问题