topcoder srm 688 div1 -3

时间:2022-12-27 23:00:54

problem1 link

首先去掉原串中已经配对的括号,那么剩下的括号序列是以下情况:(1)空串;(2)))));(3)((((;(4)))))((。第一种情况不需要处理。对于第三种情况和第四种情况,都可以将其变成第二种情况。第二种情况只需要对前一半做操作即可。另外,每次操作的时候不会影响已经删掉的匹配的串。

problem2 link

(1)首先,如果$[x,y_{1}],[x,y_{2}],y_{1}< y_{2}$都要是匹配的,那么有$[x,y_{1}],[y_{1}+1,y_{2}]$之间要分别匹配。

(2)其次,如果$[x_{1},y_{1}],[x_{2},y_{2}]$都要匹配,$x_{1}<x_{2}<y_{1}<y_{2}$,那么$[x_{1},x_{2}-1],[x_{2},y_{1}],[y_{1}+1,y_{2}]都要匹配$

经过这样的处理,最后所有匹配的区间可能会有包含的关系,然后没有其他相交关系。所以可以按照区间长度排序,一个区间一个区间进行处理。每个区间都相等于一个小的串(对于包含小区间的大区间不需要考虑已经处理的小区间,只需要考虑除了小区间外其他的部分匹配)。对于一个串$T$,定义$f(T)$表示将$T$变成匹配最少的修改数,这个修改指的是单独把左括号改成右括号或右括号改成左括号的次数,而不是交换。最后的答案其实是重复了一半,除以2即可。还有一个问题是有可能所有考虑的范围内的左括号数过于多,以至于在未考虑区间根本没有足够的右括号可以交换,这种情况是无解的。

problem3 link

这里有一个贪心的思路。

code for problem1

#include <algorithm>
#include <queue>
#include <string>
#include <vector> class ParenthesesDiv1Easy {
public:
std::vector<int> correct(std::string s) {
int n = static_cast<int>(s.size());
if (n % 2 == 1) {
return {-1};
}
return Dfs(s);
} std::vector<int> Dfs(std::string &s) {
int n = static_cast<int>(s.size());
std::deque<int> st;
for (int i = 0; i < n; ++i) {
if (s[i] == '(') {
st.push_back(i);
} else if (!st.empty() && s[st.back()] == '(') {
st.pop_back();
} else {
st.push_back(i);
}
}
if (st.empty()) {
return {};
}
std::vector<int> ans; for (size_t i = 0; i < st.size(); ++i) {
if (s[st[i]] == '(') {
int L = st[i];
int R = st.back();
ans.push_back(L);
ans.push_back(R);
Flip(s, L, R);
auto r = Dfs(s);
for (int x : r) {
ans.emplace_back(x);
}
return ans;
}
}
ans.push_back(st.front());
ans.push_back(*(st.begin() + st.size() / 2 - 1));
return ans;
} void Flip(std::string &s, int L, int R) {
std::reverse(s.begin() + L, s.begin() + R + 1);
for (int i = L; i <= R; ++i) {
if (s[i] == '(')
s[i] = ')';
else
s[i] = '(';
}
}
};

code for problem2

#include <algorithm>
#include <string>
#include <vector> class ParenthesesDiv1Medium {
public:
int minSwaps(const std::string &s, const std::vector<int> &L,
const std::vector<int> &R) {
int n = static_cast<int>(s.size());
int m = static_cast<int>(L.size()); std::vector<int> inside(n);
for (int i = 0; i < m; ++i) {
++inside[L[i]];
if (R[i] + 1 < n) {
--inside[R[i] + 1];
}
}
for (int i = 1; i < n; ++i) {
inside[i] += inside[i - 1];
} std::vector<std::vector<int>> ends(n);
for (int i = 0; i < m; ++i) {
ends[L[i]].emplace_back(R[i]);
}
std::vector<std::pair<int, int>> requests;
for (int i = 0; i < n; ++i) {
if (ends[i].empty()) {
continue;
}
std::sort(ends[i].begin(), ends[i].end());
ends[i].erase(std::unique(ends[i].begin(), ends[i].end()), ends[i].end()); for (size_t j = 1; j < ends[i].size(); ++j) {
ends[ends[i][j - 1] + 1].emplace_back(ends[i][j]);
}
ends[i].resize(1);
int x = ends[i][0];
for (int j = n - 1; j > i; --j) {
if (!ends[j].empty() && ends[j].back() >= ends[i][0]) {
x = min(x, j - 1);
}
}
if (x < ends[i][0]) {
ends[x + 1].emplace_back(ends[i][0]);
ends[i][0] = x;
}
requests.emplace_back(i, ends[i][0]);
} int ans = 0;
std::sort(requests.begin(), requests.end(),
[&](const std::pair<int, int> &a, const std::pair<int, int> &b) {
int ll = a.second - a.first;
int rr = b.second - b.first;
return ll != rr ? ll < rr : a.first < b.first;
});
std::string cs = s;
for (const auto &e : requests) {
int ll = e.first;
int rr = e.second;
std::string cur_s;
for (int j = ll; j <= rr; ++j) {
if (cs[j] != '*') {
cur_s += cs[j];
cs[j] = '*';
}
}
int c = Compute(cur_s);
if (c == -1) {
return -1;
}
ans += c;
}
if (total_left > total_len) {
ans += total_left - total_len;
} else {
ans += abs(total_right - total_len);
}
for (int i = 0; i < n; ++i) {
if (inside[i] == 0) {
if (s[i] == ')') {
--total_left;
} else {
--total_right;
}
}
}
if (total_left > total_len || total_right > total_len) {
return -1;
}
return ans / 2;
}
int Compute(const std::string &s) {
int n = static_cast<int>(s.size());
if (n % 2 == 1) {
return -1;
}
if (n == 0) {
return 0;
}
auto Update = [&](int &x, int y) {
if (x == -1 || x > y) {
x = y;
}
};
std::vector<std::vector<int>> dp(n, std::vector<int>(n + 1, -1));
dp[0][1] = s[0] == ')';
for (int i = 1; i < n; ++i) {
for (int j = 0; j <= i; ++j) {
if (dp[i - 1][j] == -1) {
continue;
}
if (s[i] == '(') {
Update(dp[i][j + 1], dp[i - 1][j]);
if (j > 0) {
Update(dp[i][j - 1], dp[i - 1][j] + 1);
}
} else {
if (j > 0) {
Update(dp[i][j - 1], dp[i - 1][j]);
}
Update(dp[i][j + 1], dp[i - 1][j] + 1);
}
}
}
for (char x : s) {
if (x == '(') {
++total_left;
} else {
++total_right;
}
}
total_len += n / 2;
return dp[n - 1][0];
} int total_left = 0;
int total_right = 0;
int total_len = 0;
};

code for problem3

#include <string>

class ParenthesesDiv1Hard {
public:
int minCost(const std::string &s) {
int len = static_cast<int>(s.size());
std::string red, blue;
int r_num = 0, b_num = 0;
for (int i = 0; i < len; ++i) {
if (s[i] == '(') {
if (r_num == b_num) {
++r_num;
red += s[i];
} else {
++b_num;
blue += s[i];
}
} else {
if (r_num > b_num) {
red += s[i];
--r_num;
} else if (b_num == 0) {
return -1;
} else {
blue += s[i];
--b_num;
}
}
}
if (r_num != 0 || b_num != 0) {
return -1;
}
return Score(red).second + Score(blue).second;
} std::pair<int, int> Score(const std::string &s) {
int left = 0;
for (size_t i = 0; i < s.size(); ++i) {
if (s[i] == '(') {
++left;
} else if (--left == 0) {
auto score1 = Score(s.substr(1, i - 1));
auto score2 = Score(s.substr(i + 1));
int depth = std::max(score1.first + 1, score2.first);
int score = score1.second + (score1.first + 1) * (score1.first + 1) +
score2.second;
return {depth, score};
}
}
return {0, 0};
}
};

  

topcoder srm 688 div1 -3的更多相关文章

  1. Topcoder SRM 643 Div1 250&lt&semi;peter&lowbar;pan&gt&semi;

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle&lpar;枚举&rpar;

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 &colon; 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. POJ2185Milking Grid&lpar;最小覆盖子串 &plus; 二维KMP&rpar;

    题意: 一个r*c的矩形,求一个子矩形通过平移复制能覆盖整个矩形 关于一个字符串的最小覆盖子串可以看这里http://blog.csdn.net/fjsd155/article/details/686 ...

  2. 六款值得推荐的android(安卓)开源框架简介&lpar;转&rpar;

    1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduli ...

  3. DCMTK3&period;6&period;0&lpar;MD支持库&rpar;安装说明

    一.运行环境:WIN7 32bit + VisualStudio2008 + dcmtk3.6.0 + Cmake2.8.8 或者 WIN7 64bit 二.准备工作: 1)MD/MT的知识储备: / ...

  4. bzoj1834 &lbrack;ZJOI2010&rsqb;network 网络扩容

    第一问跑最大流,第二问新建一条边连接0和1,流量为上第一问的答案+k,费用为0,接下来图中每条边拆成两条边,第一条容量为C费用为0,第二条容量无穷费用为W,再跑一遍费用流即可. 代码 #include ...

  5. &commat;RenderSection与&commat;RenderBody

    _LayoutMain: <html> <head> @RenderSection("head") </head> <body> @ ...

  6. hdu 2594 Simpsons’ Hidden Talents 【KMP】

    题目链接:http://acm.acmcoder.com/showproblem.php?pid=2594 题意:求最长的串 同一时候是s1的前缀又是s2的后缀.输出子串和长度. 思路:kmp 代码: ...

  7. (转)Java正则表达式的语法与示例

    转自:http://www.cnblogs.com/lzq198754/p/5780340.html 概要: Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 2在字符串 ...

  8. git status 显示中文乱码

    场景 在使用git命令行查看当前 状态时, git status 显示中文文件乱码:  解决 修改git配置, git config --global core.quotepath false

  9. Spring Security 中的过滤器

    本文基于 spring-security-core-5.1.1 和 tomcat-embed-core-9.0.12. Spring Security 的本质是一个过滤器链(filter chain) ...

  10. Selenium自动化测试Python五:WebDriver设计模式

    WebDriver 设计模式 欢迎阅读WebDriver进阶讲义.本篇讲义将会重点介绍Selenium WebDriver 自动化框架的设计,着重使用Page Object设计模式,以及使用HTML测 ...