题解 P10649 「ROI 2017 Day 1」四轴飞行器编程
很有意思的题。
题解
先从简单的情形开始考虑。因为原序列一定是一个合法的括号序列,于是第一个字符一定是
- 对于
\verb!)! 的情况,说明它与第一个字符组成了一个匹配,我们解决掉了一个子问题,接下来从第三个字符开始解决问题就行; - 对于
\verb!(! 的情况,说明第一个字符对应的括号下面有一些子括号问题,对于子问题,容易想到可以递归地去解决。
具体而言,我们维护两个变量
如果查询
由于每次询问之后
参考代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 3;
bool check(int l, int r){
cout << "? " << l << " " << r << endl;
string result;
cin >> result;
return result == "Yes";
}
char C[MAXN];
void dfs(int &i, int p){
while(1){
if(check(p, i)){
C[i] = ')', i ++; return;
} else {
C[i] = '(', i ++; dfs(i, i - 1);
}
}
}
int main(){
int n;
cin >> n;
int i = 1;
while(i <= n){
C[i] = '(', i ++; dfs(i, i - 1);
}
cout << "! " << C + 1 << endl;
return 0;
}