P9570 「NnOI R2-T2」Glaciaxion( 普及−) 题解
这道题是洛谷基础赛的第二题
想必各位都AC了吧
没有AC的现在赶紧去做
题目传送门:传送门(最好别点)点了别怪我没提醒
题目链接:传送门<----点这个
做过的直接看下面就行
「NnOI R2-T2」Glaciaxion
题目描述
冰封的世界可以看作是 $ n $ 块初始时冷冻的冰川,这些冰川被编号为 \(1 \sim n\)。
探测器抵达后的 $ m $ 秒,每秒都会探测到一块冰川融化。
当一块冰川第一次融化时,探测器返回 N
,否则返回 Y
。
你需要根据探测器按顺序返回的信息,给出字典序最小的冰川融化过程的编号序列。如果不存在这样的编号序列,请输出 No solution
报告无解。
输入格式
第一行两个整数 $ n,m $。
接下来一行 $ m $ 个字符(N
或 Y
,不加分隔),表示探测器按顺序返回的结果。
输出格式
一行一个长度为 $ 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;
}
是不是很优雅的代码呀!