P9570 「NnOI R2-T2」Glaciaxion( 普及−) 题解

发布时间 2023-11-25 22:03:40作者: BadBadBad__gqc

这道题是洛谷基础赛的第二题

想必各位都AC了吧

没有AC的现在赶紧去做

题目传送门:传送门(最好别点)点了别怪我没提醒

题目链接:传送门<----点这个

做过的直接看下面就行


「NnOI R2-T2」Glaciaxion

题目描述

冰封的世界可以看作是 $ n $ 块初始时冷冻的冰川,这些冰川被编号为 \(1 \sim n\)

探测器抵达后的 $ m $ 秒,每秒都会探测到一块冰川融化。

当一块冰川第一次融化时,探测器返回 N,否则返回 Y

你需要根据探测器按顺序返回的信息,给出字典序最小的冰川融化过程的编号序列。如果不存在这样的编号序列,请输出 No solution 报告无解。

输入格式

第一行两个整数 $ n,m $。

接下来一行 $ m $ 个字符(NY,不加分隔),表示探测器按顺序返回的结果。

输出格式

一行一个长度为 $ m $ 的整数序列(空格分隔),表示字典序最小的冰川融化过程的编号序列,或输出 No solution 报告无解。

样例 #1

样例输入 #1

3 4
NYNY

样例输出 #1

1 1 2 1

样例 #2

样例输入 #2

5 3
YYY

样例输出 #2

No solution

样例 #3

样例输入 #3

5 7
NNNNNYN

样例输出 #3

No solution

提示

【样例 1 解释】

第 1 秒,1 号冰川融化,这是其首次融化,返回 N

第 2 秒,1 号冰川融化,这不是其首次融化,因为已经在第 1 秒融化过,返回 Y

第 3 秒,2 号冰川融化,这是其首次融化,返回 N

第 4 秒,1 号冰川融化,这不是其首次融化,因为已经在第 1,2 秒融化过,返回 Y

【数据范围】

对于 $ 100% $ 的数据,$ 1 \le n,m \le 10^6 $。

讲解部分

首先我们看题可以得知.无解的话就输出No solution

那么我们就可以思考一下,在什么样的情况下会无解

刚好样例二和样例三就都是无解的情况

样例二输入

5 3

YYY

为什么会无解呢?

想要知道这个问题我们可以将自己代入进去

第一秒钟 有一个冰川不是第一次融化

所以我们可以得知如果第一个字母就是 Y 的话无解,输出No solution

样例三输入

5 7
NNNNNYN
第一秒钟 有一座冰川第一次融化
第二秒钟 有一座冰川第一次融化
第三秒钟 有一座冰川第一次融化
第四秒钟 有一座冰川第一次融化
第五秒钟 有一座冰川第一次融化
第六秒钟 有一座冰川不是第一次融化
第一秒钟 有一座冰川第一次融化

从这里我们可以发现,不是说只有5座冰川吗?怎么会有六座冰川第一次融化呢?

所以我们可以得知如果 N 的数量大于 冰川的数量的话无解,输出No solution


那么如果有解的话怎么办呢?

其实很简单,因为题目说了要求字典序最小

所以我们就把字符串过一遍,定义一个sum初始化为0,如果当前字符为N的话就sum++就行了

最后如果sum>n就输出No solution

如果是Y的话直接输出1就行了

总结部分

无解判断

1. 如果第一个字母为Y的话无解
2. 如果N的数量大于冰川的数量无解

有解输出

将字符串过一遍,设置一个sum并初始化为1
如果当前字符为N,输出sum后再sum++
如果当前字符为Y,直接输出1

时间复杂度为O(2n)

代码部分

代码自己写去吧

下面给出AC代码(doge)

#include <bits/stdc++.h>
#define z22zz2z2z22z2zz2zz2zzz22z22z2 "No solution"
#define z22zz22zz22z2zz2zz2zzz22z22z2 return
#define z22zz22zz22z2zz2zz2zzz2zz22z2 'N'
#define z22zz22zz22z2zz2zz22zz2zz22z2 'Y'
#define z22zz2z2z22z2zz2zz2zzz2zz22z2 0
#define z22zz2z2z22z2zz2zz2z2z2zz22z2 cin
#define z22zz2z2z22z2zz2zz2z2z22zz2z2 cout
#define z22zz2z2z22z2zz2zz2zzz2zz2zz2 1
#define z22zz2z2z22z2zz2zz2zz22zz22z2 ' '
using namespace std;
int main()
{
	string z22zz2z2z2z2zz2zz2zzz22z22z2;
	int z22zz2z2zz2z2zz2zz2zzz22z22z2,z22zz2z2zz2z2z2z2zzz22z22z2;
	z22zz2z2z22z2zz2zz2z2z2zz22z2>>z22zz2z2zz2z2zz2zz2zzz22z22z2>>z22zz2z2zz2z2z2z2zzz22z22z2;
	z22zz2z2z22z2zz2zz2z2z2zz22z2>>z22zz2z2z2z2zz2zz2zzz22z22z2;
	if(z22zz2z2z2z2zz2zz2zzz22z22z2[z22zz2z2z22z2zz2zz2zzz2zz22z2]==z22zz22zz22z2zz2zz22zz2zz22z2)
	{
		z22zz2z2z22z2zz2zz2z2z22zz2z2<<z22zz2z2z22z2zz2zz2zzz22z22z2;
		z22zz22zz22z2zz2zz2zzz22z22z2 z22zz2z2z22z2zz2zz2zzz2zz22z2;
	}
	int z22zz2z2z2z2zz2zz2zz2z22z22z2=z22zz2z2z22z2zz2zz2zzz2zz22z2;
	for(int z22zz2z2z2z2z2z2zz2zzz22z22z2=z22zz2z2z22z2zz2zz2zzz2zz22z2;z22zz2z2z2z2z2z2zz2zzz22z22z2<z22zz2z2zz2z2z2z2zzz22z22z2;z22zz2z2z2z2z2z2zz2zzz22z22z2++)
	{
		if(z22zz2z2z2z2zz2zz2zzz22z22z2[z22zz2z2z2z2z2z2zz2zzz22z22z2]==z22zz22zz22z2zz2zz2zzz2zz22z2)
		{
			z22zz2z2z2z2zz2zz2zz2z22z22z2++;
		}
	}
	if(z22zz2z2z2z2zz2zz2zz2z22z22z2>z22zz2z2zz2z2zz2zz2zzz22z22z2)
	{
		z22zz2z2z22z2zz2zz2z2z22zz2z2<<z22zz2z2z22z2zz2zz2zzz22z22z2;
		z22zz22zz22z2zz2zz2zzz22z22z2 z22zz2z2z22z2zz2zz2zzz2zz22z2;
	}
	int z22z2z2z2zz2z2z2z2zzz22z22z2=z22zz2z2z22z2zz2zz2zzz2zz22z2;
	for(int z22zz2z2z2z2z2z2zz2zzz22z22z22=z22zz2z2z22z2zz2zz2zzz2zz22z2;z22zz2z2z2z2z2z2zz2zzz22z22z22<z22zz2z2zz2z2z2z2zzz22z22z2;z22zz2z2z2z2z2z2zz2zzz22z22z22++)
	{
		if(z22zz2z2z2z2zz2zz2zzz22z22z2[z22zz2z2z2z2z2z2zz2zzz22z22z22]==z22zz22zz22z2zz2zz2zzz2zz22z2)
		{
			z22z2z2z2zz2z2z2z2zzz22z22z2++;
			z22zz2z2z22z2zz2zz2z2z22zz2z2<<z22z2z2z2zz2z2z2z2zzz22z22z2<<z22zz2z2z22z2zz2zz2zz22zz22z2;
		}
		if(z22zz2z2z2z2zz2zz2zzz22z22z2[z22zz2z2z2z2z2z2zz2zzz22z22z22]==z22zz22zz22z2zz2zz22zz2zz22z2)
		{
			z22zz2z2z22z2zz2zz2z2z22zz2z2<<z22zz2z2z22z2zz2zz2zzz2zz2zz2<<z22zz2z2z22z2zz2zz2zz22zz22z2;
		}
	}
	z22zz22zz22z2zz2zz2zzz22z22z2 z22zz2z2z22z2zz2zz2zzz2zz22z2;
}

是不是很优雅的代码呀!