首页 > 其他分享 >[省选联考 2023]D1 题解

[省选联考 2023]D1 题解

时间:2023-04-01 20:15:10浏览次数:37  
标签:Node maxlen 省选 题解 地点 int 端点 include 联考

D1T1 P9166 火车站

观察题目,联系到以前做过的一些区间 dp 可以发现如果小 A 可以去到(这里是去到而不是最终停在) \(k\) 地点,那么 \(x\) 到 \(k\) 之间的所有地点他都可以去到,因为火车是连续的,不能跳着走,要来到当前地点必须到过路途中的所有节点。

这样子就好办了,分两次处理往左边和往右边走两种情况,这里讨论往右走的情况,往左同理。

我们对于每种情况处理他能去到的最右的地点,具体地,考虑在什么情况下,一个节点会去不了,不难得到处理完所有左端点早于这个节点的轨道后如果还到不了就是真的到不了。

于是我们按照左端点排序,如果遍历到的区间和当前答案区间有交集,就用遍历到的区间右端点更新当前的最右地点,最后判断每个铁轨的右端点在不在当前范围内即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector> 
#define ll long long
using namespace std;
struct Node{
	int l,r;
}a[2000005];
bool cmp(Node x,Node y){
	return x.l<y.l;
}
bool cmp2(Node x,Node y){
	return x.r<y.r;
}
int cnt[2000005];
int main(){
	int n,m,x;
	cin>>n>>m>>x;
	for(int i=1;i<=m;i++)cin>>a[i].l>>a[i].r;
	sort(a+1,a+m+1,cmp);
	int maxlen=x;
	for(int i=1;i<=m;i++){
		if(a[i].r<x || a[i].l>maxlen) continue;
		maxlen=max(maxlen,a[i].r);
	}
	for(int i=1;i<=m;i++) if(a[i].r<=maxlen && a[i].r>=x) cnt[a[i].r]++;
	sort(a+1,a+m+1,cmp2);
	int minlen=x;
	for(int i=m;i>=1;i--){
		if(a[i].l>x || a[i].r<minlen) continue;
		minlen=min(minlen,a[i].l);
	}
	for(int i=1;i<=m;i++) if(a[i].l>=minlen && a[i].l<=x) cnt[a[i].l]++;
	for(int i=1;i<=n;i++)if(i!=x && cnt[i]) cout<<i<<' ';
}

标签:Node,maxlen,省选,题解,地点,int,端点,include,联考
From: https://www.cnblogs.com/eastcloud/p/17279237.html

相关文章

  • 联合省选 2023
    \(\textcolor{red}{\texttt{Day1}}\)\(\mathtt{20230401}\)记:首次参加省选,来增加经验的,心态也很平和。这次在交大附中考,发现考场环境还是这里最舒服。键盘相对来说好用多了。没有犯春赛没打完暴力的错误。但是花了很久写部分分。T1一开没看出正解,但是看起来很好想(有点像C......
  • P6146 [USACO20FEB]Help Yourself G 题解
    题目链接先按左端点从小到大排序。设\(f(i)\)表示前\(i\)条线段的所有子集的复杂度之和。考虑从\(f(i-1)\)转移到\(f(i)\),即考虑新加进来第\(i\)条线段的过程。第\(i\)条线段加进来所新产生的贡献分两种:设除了第\(i\)条线段选中的线段集合为\(S\),则若\(S\)......
  • # P4391 [BOI2009]Radio Transmission 无线传输 题解
    [BOI2009]RadioTransmission无线传输题目描述给你一个字符串\(s_1\),它是由某个字符串\(s_2\)不断自我连接形成的(保证至少重复\(2\)次)。但是字符串\(s_2\)是不确定的,现在只想知道它的最短长度是多少。输入格式第一行一个整数\(L\),表示给出字符串的长度。第二行给出......
  • 4.1 模拟赛题解
    A一模一样讲过B先做一遍前缀和将区间和转成两数之差的形式。cdq分治,递归时排好序。按顺序枚举左端点,合法的右端点区间单调移动。CIDA*,容易发现每次翻转并不会打乱中间的铁盘,只会改变下边界的相邻关系。最终顺序相邻两个铁盘大小相差均为\(1\),所以估价函数设为已操作次数......
  • 使用 IntelliJ IDEA 构建 Spring Framework 5.3.21 源码问题解决
    源码版本1、下载地址:https://github.com/spring-projects/spring-framework/tags2、选择要构建的源码版本并下载,例如:5.3.21相关环境1、操作系统:Windows102、JDK版本:Jdk173、IDE工具:IntelliJIDEA2021.3.34、项目构建工具:Gradle7.3.3使用IntelliJIDEA构建Spring......
  • CodeTON Round 4 (Div. 1 + Div. 2, Rated, Prizes!)(CF1810)A~D题题解
    今天采用的是新格式。CF1810ABeautifulSequence点击查看原题点击查看思路如果一个数字的值\(v\),不大于当前的位置\(p\),那我们可以通过删除\(p-v\)个数字,使它们两个对应上。比如\([1,7,2,5,3]\)中的\(3\),其数值为\(3\),位置为\(5\),数值\(3\)小于等于\(......
  • CodeTON Round 4 (Div. 1 + Div. 2, Rated, Prizes!) A-D题解
    题目地址A-BeautifulSequence题意:给出一个数组,问是否存在任意一个子区间,存在i,使得ai=iSolution直接比较当前的数和i的大小就行了,当前为x,如果要求答案存在,必须有i>=xvoidsolve(){ intn;cin>>n; intflag=0; for(inti=1;i<=n;i++) { intx;cin>>x; if(i>=x) {......
  • Thinkpad T14升级Windows11ver22h2失败问题解决小记
    背景手头的ThinkPad在近一年的时间里每次升级Windows11的22h2版本每次都会报错,具体有以下几种情况:更新过程中无问题,重启后黑屏更新过程中会卡在26%左右,然后蓝屏报KENERAL_CHECK_FAIL,接着便自动重启进入修复程序在WindowsUpdate更新中报错0xC1900101在上述错误出现后,再次更......
  • 【比赛游记】联合省选 2023 退役记
    Day0试机从15:00到16:00。考场键盘是大键帽的键盘,对味了。鼠标一如既往的不灵敏。虚拟机用的是VMwareWorkstation,不会配置VScode,这下只能命令行编译了。写了SAM和SA,虽然过程有点曲折(两份程序没有保存就命令行编译,查了好久),但好歹是拍上了。17:00坐地铁去白湖亭......
  • 使用 wine 安装微信遇到的问题解决方法
    1.中文显示成方块添加启动环境变量:LANG=zh_CN.UTF-82.输入框不显示文字安装winetrickssudoaptinstallwinetricks#oryay-Sywinetricks然后安装riched20winetricksriched20......