A. Regular Bracket Sequence

显然,"\(()\)"不影响结果它是自我匹配的,可以把所有的\(((\)和\())\)都放在左边/右边,这样只要检查它们的数目就行,还有个坑点,就是如果\()(\)多于一,需要给左右两边一个负担,必须小于它们的数量才行。

#include <cstdio>
#include <iostream>
using namespace std;
int c1, c2, c3, c4;
int main(){
scanf("%d%d%d%d", &c1, &c2, &c3, &c4);
if(c1 == c4 && c4 >= min(c3, 1)) puts("1");
else puts("0");
return 0;
}

B. Discounts

模拟,从小到大排好序后,答案 \(=\) 总数 - \(a[n - q_i + 1]\)。

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 300010;
typedef long long LL;
int n, m, a[N], q;
LL sum = 0;
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", a + i), sum += a[i];
}
sort(a + 1, a + 1 + n);
scanf("%d", &m);
for(int i = 1; i <= m; i++){
scanf("%d", &q);
printf("%lld\n", sum - a[n - q + 1]);
}
return 0;
}

C. Painting the Fence

考虑到\(q <= 5000\),用前缀和维护每个位置都有几个人刷,然后预处理\([l, r]\)这段有多少\(1\)(他不刷就没人刷)和\(2\)(安排掉他俩就没人刷),用\(O(q ^ 2)\)的复杂度暴力枚举两个人分别是谁,然后\(O(1)\)找即可。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 5010;
int n, m, sum[N], c[N], c2[N], tot = 0, ans = -1;
PII a[N];
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++){
scanf("%d%d", &a[i].first, &a[i].second); }
sort(a + 1, a + 1 + m);
for(int i = 1; i <= m; i++){
sum[a[i].first]++, sum[a[i].second + 1]--;
}
for(int i = 1; i <= n; i++) {
sum[i] += sum[i - 1];
c[i] = c[i - 1] + (sum[i] == 1);
c2[i] = c2[i - 1] + (sum[i] == 2);
tot += (sum[i] > 0);
}
for(int i = 1; i < m; i++){
for(int j = i + 1; j <= m; j++){
int cnt = tot;
int L = a[i].first, R = a[i].second;
int L1 = a[j].first, R1 = a[j].second;
if(L1 <= R) {
cnt -= c[L1 - 1] - c[L - 1];
cnt -= c[max(R, R1)] - c[min(R, R1)];
cnt -= c2[min(R, R1)] - c2[L1 - 1];
}else{
cnt -= c[R] - c[L - 1];
cnt -= c[R1] - c[L1 - 1];
}
ans = max(ans, cnt);
}
}
printf("%d\n", ans);
return 0;
}

F. Clear the String

区间\(dp\)。

设\(f[i][j]\) 为合并\([i, j]\)区间的最小花费,对于任何一个\(f[i][j]\),有三种决策:

  1. 直接多加一位\(min(f[i + 1][j], f[i][j - 1]) + 1\)

  2. 找一个位置\(k(i + 1 <= k <= j )\),使\(str[i] = str[k]\),更新答案为:

\(f[i + 1][k - 1] + f[k][j] + (s[k] != s[i])\)

等于是把\([i + 1, k - 1]\)先合并起来,然后\(i\)字符就会贴到\(k\)一起,然后这两个字符一样,可以视作一个字符,每次修改最坏是用\(k\)为左边界,\(i\)字符作为附庸不用计算花费

  1. 同样的还有用右端点合并...

想状态的时候我也会有疑惑,为什么只用找开头和结尾跟中间匹配呢?重复,每次处理区间时,\(l + 1、l + 2...\)已经找过匹配点了...

后来发现只需要处理用开头字符一种情况,因为两种状态转移上重复了,每次找\(k\)的过程中也相当于\(k\)去找\(i\),在这之前想到于已经匹配过\([l + 1, r], [l + 2, r]...[l + n, r]\),这样的匹配方式是可逆的,先后反复是相同的,即使此时的\(l + n\)左边还没处理,但是每次处理相当于一个包围的形式,可以不重不漏地继承。所以可以不需用步骤\(3\),但是蒟蒻的我肯定想不到啦...

顺便,注意初始化问题,对于\(f[i][j] (i > j)\) 花费是\(0\),当然如果边界写的精准了这种状态不会用到。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 510;
int n, f[N][N];
char s[N];
int main(){
scanf("%d%s", &n, s + 1);
for(int i = 1; i <= n; i++) f[i][i] = 1;
for(int l = 2; l <= n; l++){
for(int i = 1, j; (j = i + l - 1) <= n; i++){
f[i][j] = min(f[i + 1][j], f[i][j - 1]) + 1;
for(int k = i; k <= j - 2; k++){
f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j - 1] + (s[k] != s[j]));
}
for(int k = i + 2; k <= j; k++){
f[i][j] = min(f[i][j], f[i + 1][k - 1] + f[k][j] + (s[k] != s[i]));
}
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++) printf("%d ", f[i][j]);
puts("");
}
printf("%d\n", f[1][n]);
return 0;
}

Codeforces Edu Round 61 A-C + F的更多相关文章

  1. Codeforces Beta Round #61 (Div. 2)

    Codeforces Beta Round #61 (Div. 2) http://codeforces.com/contest/66 A 输入用long double #include<bit ...

  2. Codeforces Beta Round #61 (Div. 2) D. Petya and His Friends 想法

    D. Petya and His Friends time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  3. Educational Codeforces Round 61

    Educational Codeforces Round 61 今早刚刚说我适合打pikmike出的EDU 然后我就挂了 A 不管 B 不管 C 这道题到快结束了才调出来 大概就是\(n^2\)枚举不 ...

  4. Codeforces Round #485 (Div. 2) F. AND Graph

    Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...

  5. Codeforces Round #486 (Div. 3) F. Rain and Umbrellas

    Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...

  6. Codeforces Round #501 (Div. 3) F. Bracket Substring

    题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...

  7. Codeforces Round #499 (Div. 1) F. Tree

    Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...

  8. Codeforces Beta Round #62 题解【ABCD】

    Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...

  9. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

随机推荐

  1. IP 层收发报文简要剖析5--ip报文发送2

    udp 发送ip段报文接口ip_append_data ip_append_data 函数主要用来udp 套接字以及raw套接字发送报文的接口.在tcp中发送ack 以及rest段的ip_send_u ...

  2. 连续子数组的和的绝对值的最大值、最小值(非绝对值的话直接dp动态规划)

    前缀和的思路: sum[i] = num[0]+num[1]+......+num[i-1] sum[j] = num[0]+num[1]+......+num[j-1] 那么:num[i]+num[ ...

  3. JS中 `=+` 是什么?

    JS中 =+ 是什么? 依然是赋值 =是赋值,+代表后面的数字为正数,同理=-代表后面的数字为负数 用处 相当于告诉编译器,即将赋值的数值类型为数字类型,不要把数字当作字符串去拼接 示例 functi ...

  4. 用JavaScript做精灵图

    用JavaScript做精灵图 精灵图可以不用在给每一个小块一 一的修改位置.主要原理是找到整张的背景图与li的下标的数学关系. 这是一大张背景图,这个背景图的位置其实是有规律的,每两张之间间隔一个固 ...

  5. 两种不同的扩展Scrum的方式

    两种不同的扩展Scrum的方式 1.LeSS和LeSS Huge –大型Scrum LeSS(和LeSS Huge –真正的大型程序)的合著者Craig Larman首先批评了管理,开发人员和客户传统 ...

  6. 玩转百度地图API(地图,坐标,标记,添加控件,2D图,混合图,智能搜索,地址解析器,信息窗口)

    1.注册得到appkey 2.直接上代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Conte ...

  7. .NET 5 ORM 八大实用技巧 干货 - SqlSugar ORM

    介绍 sqlsugar已经在第一时间完美兼容.NET5并且已经有人在使用了, 很多人都担心用了开源框架遇到问题无法解决,导致前功尽弃,使用SqlSugar你大可放心,除了有详细文档和几年的大量用户积累 ...

  8. 不想错过网课?不妨用Camtasia录制下来!

    2020年突发的这场疫情给我们的日常生活与学习带来了一些不便,却也意外的让网课走红了起来.小学.中学.大学都开始通过媒体工具或直播平台开始授课,但网络授课与实际课堂上课还是有区别的,学生们受到环境影响 ...

  9. python应用(1):安装与使用

    程序员的基本工作是写程序,而写程序要用到编程语言,编程语言可以分为编译型语言跟解释型语言. 编译型语言,就是在执行代码之前,先把源代码编译(加链接)成另一种形式的代码,比如目标代码,或字节码,这种代码 ...

  10. 怎么理解虚拟 DOM?

    一.前言 现在web前端的开发,对于MVVM框架的运用,那是信手拈来,用的飞起.一个xxx-cli工具,就能初始化一套模板,再填充业务代码,打包部署即可.但是会用,是一个方面,大家有没有底层深入思考一 ...