首页 > 其他分享 >P9166 [省选联考 2023] 火车站

P9166 [省选联考 2023] 火车站

时间:2023-05-07 17:45:57浏览次数:52  
标签:答案 建好 省选 轨道 P9166 int 端点 now 联考

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;
}

标签:答案,建好,省选,轨道,P9166,int,端点,now,联考
From: https://www.cnblogs.com/iruiforever/p/17379659.html

相关文章

  • [省选联考2023] 过河卒
    [省选联考2023]过河卒题目背景棋盘上有一个过河卒,需要走到底线。卒行走的规则是可以向左移动一格,向右移动一格或者向前移动一格。同时在棋盘上有两个另一方的棋子,需要拦截这个卒走到底线。这两个棋子的走法和帅一致,可以走到前后左右四个方向上相邻的格子。因此本题可以称为“......
  • 【考后总结】NOI 统一省选 2023
    文化课补完了,但是考试考炸了,所以来补题。D1T1火车站station实际上只需要判断从\(x\)能否一直向一个方向移动且每个位置能不能作为这个方向的终点站。区间覆盖差分一下即可。提交记录:Submission-QOJD1T2城市建造cities一个连通块中只能有一个点被选中。由于连通块大......
  • 【考后总结】NOI 统一省选 2023
    文化课补完了,但是考试考炸了,所以来补题。D1T1火车站station实际上只需要判断从\(x\)能否一直向一个方向移动且每个位置能不能作为这个方向的终点站。区间覆盖差分一下即可。提交记录:Submission-QOJD1T2城市建造cities一个连通块中只能有一个点被选中。由于连通块大......
  • 【考后总结】NOI 统一省选 2023
    文化课补完了,但是考试考炸了,所以来补题。D1T1火车站station实际上只需要判断从\(x\)能否一直向一个方向移动且每个位置能不能作为这个方向的终点站。区间覆盖差分一下即可。提交记录:Submission-QOJD1T2城市建造cities一个连通块中只能有一个点被选中。由于连通块大......
  • 【考后总结】NOI 统一省选 2023
    文化课补完了,但是考试考炸了,所以来补题。D1T1火车站station实际上只需要判断从\(x\)能否一直向一个方向移动且每个位置能不能作为这个方向的终点站。区间覆盖差分一下即可。提交记录:Submission-QOJD1T2城市建造cities一个连通块中只能有一个点被选中。由于连通块大......
  • 【考后总结】NOI 统一省选 2023
    文化课补完了,但是考试考炸了,所以来补题。D1T1火车站station实际上只需要判断从\(x\)能否一直向一个方向移动且每个位置能不能作为这个方向的终点站。区间覆盖差分一下即可。提交记录:Submission-QOJD1T2城市建造cities一个连通块中只能有一个点被选中。由于连通块大......
  • 【题解】P4363 [九省联考 2018] 一双木棋 chess
    原题链接题目描述菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束。落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋......
  • 联合省选2023 D2T1 过河卒
    我们可以先\(dp\),设\(f_{i,j,k,l}\)和\(g_{i,j,k,l}\)表示当前三个棋子分别在点\(i,j,k\),目前轮到\(l\)走,谁胜利,最终会走多少步。然后我们发现,变成一个有向图博弈。并且\(l\)是由\(i,j,k\)的奇偶性唯一确定的。就可以在图上直接做了。首先我们发现,我们其实可以把初始......
  • 联合省选2022游忆
    本文内容纯属虚构,如与事实相近,纯属偶然。本人文笔不好,请见谅。抑郁症患者勿入。话说是站在现在的角度写好呢,还是站在当时的角度写好呢。从1月18日开始写吧,先写省选前的记录,先写个大概,细节以后再补充。先粘几张排行榜:中途还有几场线下的模拟赛,但是都爆零/垫底了。noip......
  • Solution Set (春测集训中旬至省选集训)
    SolutionSetCF1767FTwoSubtrees首先,考虑询问\(u=v\)的情况,发现需要使用线段树合并,或者分块/莫队。问了一下,可以不用薯粉块啥的。但是9s啊9s,为啥啊为啥。考虑当前\(u\)最小众数是\(x\)(不妨设\(\maxu_x>\maxv_x\))。所以其出现次数是\(p=u_x+v_x\)。若......