[ICPC 2024 Chengdu R] Arrow a Row题解
P15072 [ICPC 2024 Chengdu R] Arrow a Row
题目描述
定义一个“箭头字符串”为满足以下条件的字符串:
- 字符串长度至少为 555。
- 字符串以 >\tt{>}> 开头,以 >>>\tt{>}\tt{>}\tt{>}>>> 结尾。
- 字符串的其余部分仅由 −\tt{-}− 组成。
例如,>−−>>>\tt{>}\tt{-}\tt{-}\tt{>}\tt{>}\tt{>}>−−>>> 和 >−−−>>>\tt{>}\tt{-}\tt{-}\tt{-}\tt{>}\tt{>}\tt{>}>−−−>>> 是有效的箭头字符串,而 >−>>\tt{>}\tt{-}\tt{>}\tt{>}>−>> 和 >−>−>>>\tt{>}\tt{-}\tt{>}\tt{-}\tt{>}\tt{>}\tt{>}>−>−>>> 则不是。
Sauden 给你一个长度为 nnn 的字符串 sss,仅由 >\tt{>}> 和 −\tt{-}− 组成。你需要通过对一个同样长度为 nnn、完全由 ∗\tt{*}∗ 组成的字符串执行一系列绘制操作来创建 sss。在一次绘制操作中,你可以选择一个长度至少为 555 的子串,并将其转换为一个箭头字符串。你执行的操作总数不能超过 nnn。
如果无法在不超过 nnn 次绘制操作的情况下获得字符串 sss,则输出 No\texttt{No}No。否则,输出 Yes\texttt{Yes}Yes 并提供绘制操作的详细信息。如果有多种解决方案,输出任意一种即可。
输入格式
- 第一行包含一个整数 TTT(1≤T≤1041\le T\le 10^41≤T≤104),表示测试用例的数量。
- 每个测试用例包含一行,为一个长度为 nnn(5≤n≤1055 \le n \le 10^55≤n≤105)的字符串 sss,仅由 >\tt{>}> 和 −\tt{-}− 组成。
保证所有测试用例的 nnn 之和不超过 5⋅1055 \cdot 10^55⋅105。
输出格式
对于每个测试用例,如果无法在不超过 nnn 次绘制操作的情况下获得给定字符串,则输出一行 No\texttt{No}No。否则,输出 Yes\texttt{Yes}Yes 和一个正整数 mmm(1≤m≤n1 \le m \le n1≤m≤n),表示需要执行的绘制操作次数。随后输出 mmm 行,每行包含两个整数 ppp(1≤p≤n−41\le p\le n-41≤p≤n−4)和 lll(5≤l≤n+1−p5\le l\le n+1-p5≤l≤n+1−p),分别表示所选子串的起始位置和长度。
输入输出样例 #1
输入 #1
4
>>->>>
>>>->
>>>>>
>->>>>>>
输出 #1
Yes 2
1 5
2 5
No
No
Yes 2
2 7
1 5
说明/提示
对于示例中的第四个测试用例,绘制过程如下所示:
:::align{center}
∗∗∗∗∗∗∗∗\tt{*}\tt{*}\tt{*}\tt{*}\tt{*}\tt{*}\tt{*}\tt{*}∗∗∗∗∗∗∗∗ →\rightarrow→ ∗>−−−>>>‾\tt{*}\underline{\tt{>}\tt{-}\tt{-}\tt{-}\tt{>}\tt{>}\tt{>}}∗>−−−>>> →\rightarrow→ >−>>>‾>>>\underline{\tt{>}\tt{-}\tt{>}\tt{>}\tt{>}}\tt{>}\tt{>}\tt{>}>−>>>>>>
:::
翻译由 DeepSeek V3 完成
思路
直接贪心构造,考虑先构造后的,再构造前的。
即先将后面的一整串满足了,再来满足前面的串。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long t,n=0,rf=0,uk;
string str;
char s[100005];
struct one{
long long l,r;
};
vector<one> v;
int main(){
cin>>t;
while(t--){
cin>>str;
n=0;
rf=0;
for(int i=0;i<str.size();i++){
s[++n]=str[i];
if(s[n]=='-'){
rf=1;
}
//cout<<s[n]<<endl;
}
v.clear();
if(s[1]=='-'||s[n]=='-'||s[n-1]=='-'||s[n-2]=='-'||rf==0){
cout<<"No"<<endl;
continue;
}
uk=n;
for(int i=n-3;i>=1;i--){
if(s[i]=='-'){
uk=i+3;
for(int j=n;j>=uk;j--){
v.push_back({1,j-1+1});
}
break;
}
}
//cout<<v.size()<<endl;
for(int i=1;i<=uk-3;i++){
if(s[i]=='>'){
v.push_back({i,uk-i+1});
}
}
cout<<"Yes"<<" "<<v.size()<<endl;
for(int i=0;i<v.size();i++){
cout<<v[i].l<<" "<<v[i].r<<endl;
}
}
return 0;
}

浙公网安备 33010602011771号