[破碎的状态] Tc 688 Div 1
感谢JCarlson的翻译
250
给你个括号序列
你要在10次特殊交换以内把它变成一个合法的括号
求10次特殊交换的左右端点
特殊交换:把它先倒着读,然后在'('和')'互换(怎么感觉像是转了180°)
我的做法:
10次?2次就够了
我们把成对的()给无视掉,一定是
))))))...) (((((..(
虽然不知道...中有多少个(可能根本是0个)
我们先暴力把右边翻转为')',然后再取中间那个)翻转即可
注意处理好坐标
然而考场上瞎写写FST了..居然还过了所以Sample..
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<time.h> #include<math.h> #include<memory> #include<vector> #include<bitset> #include<fstream> #include<stdio.h> #include<utility> #include<string.h> #include<iostream> #include<stdlib.h> #include<algorithm> using namespace std; struct node { int y; bool state; }; node a[1005]; vector<int> ans; int n; void dfs() { int i; int last=-1; for (i=0;i<n;i++) { if (a[i].y==-1) continue; if (a[i].state==1) { if (last==-1) continue; a[last].y=-1; a[i].y=-1; dfs(); return; } else { last=i; } } } struct ParenthesesDiv1Easy { vector <int> correct(string s) { vector<int> wa; wa.push_back(-1); if (s.size()%2==1) return wa; int i; n=s.length(); for (i=0;i<n;i++) { a[i].y=i; a[i].state=(s[i]==')'); } dfs(); int count=0; for (i=0;i<n;i++) { if (a[i].y!=-1) count++; } int t=count/2; for (i=0;i<n;i++) { if (a[i].y==-1) continue; if (a[i].state==0) { ans.push_back(a[i].y); ans.push_back(n-1); reverse(a+a[i].y,a+n); break; } } for (i=0;i<n;i++) { if (a[i].y==-1) continue; t--; if (t==0) { ans.push_back(0); ans.push_back(i); return ans; } } return ans; } }; #ifdef absi2011 int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); ParenthesesDiv1Easy a; a.correct(")()((("); return 0; } #endif