题目链接

思路

仔细理解一下题意可以发现。

对于每个完整的括号序列都是独立的,然后就想到分治。高度是序列中所有括号序列的最大值,宽度是所有括号序列宽度和\(+1\)。

然后仔细想了一下,这种分治应该是可以被卡成\(n^2\)的。

题解就比较厉害了。

其实基本思想和分治相似。

建立一棵树的模型。每到一个左括号就给当前节点添加一个子节点。每到一个右括号,就回到父亲节点。

等到建完这张图,发现其实就是把分治的过程给提前处理出来了。

然后对于这棵树\(dp\)一下就好了。

当前节点的高度是孩子中最大高度\(+1\),宽度是孩子宽度之和\(+1\),答案就是宽度\(\times\)高度\(-\)孩子的答案之和

代码

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<cstring>
#include<bitset>
#include<vector>
using namespace std;
typedef long long ll;
#define int ll
const int N = 500000 + 100;
vector<int>e[N];
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
char s[N];
int w[N],h[N];
int dfs(int u) {
int k = e[u].size();
w[u] = 1;
h[u] = 0;
int sum = 0;
for(int i = 0;i < k;++i) {
int v = e[u][i];
sum += dfs(v);
w[u] += w[v] + 1;
h[u] = max(h[u],h[v]);
}
h[u]++;
return !u ? sum : w[u] * h[u] - sum;
}
int fa[N];
signed main() {
int T = read();
while(T--) {
scanf("%s",s + 1);
int now = 0,tot = 0;
memset(fa,0,sizeof(fa));
int n = strlen(s + 1);
for(int i = 1;i <= n;++i) {
if(s[i] == '(') e[now].push_back(++tot),fa[tot] = now,now = tot;
else now = fa[now];
}
printf("%lld\n",dfs(0));
for(int i = 0;i <= tot;++i) e[i].clear();
} return 0;
}

nowcoder16450 托米的简单表示法的更多相关文章

  1. 关于javascript对象的简单记忆法

    关于javascript对象方法的简单记忆法(个人整理) string对象: 大号小号闪烁加链接./big/small/blink/link/ 粗体斜体打字删除线./bold/italics/fixe ...

  2. C语言排序算法之简单交换法排序,直接选择排序,冒泡排序

    C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 /*简单交换法排序 根据序列中两个记录键值的比较结果来对换这两 ...

  3. LC滤波器简单设计法 - 一文读懂LC滤波器简单设计方法及原理介绍,LC值计算方法

    LC滤波器概述 LC滤波器也称为无源滤波器,是传统的谐波补偿装置.LC滤波器之所以称为无源滤波器,顾名思义,就是该装置不需要额外提供电源.LC滤波器一般是由滤波电容器.电抗器和电阻器适当组合而成,与谐 ...

  4. 简单工厂法( Factory Method)

    工厂方法 (Factory Method) Define an interface for creating an object ,but let subclasses decide which cl ...

  5. SVN和git的使用(附github的简单玩法)

    今天简单的总结了下SVN和git的使用,也尝试了下github,应该好好提高下自己的英文水平了,梦想有一天不再使用任何翻译软件. [svn]:集中式的代码管理工具(版本控制工具--版本记录) 1> ...

  6. Collections在sort()简单分析法源

    Collections的sort方法代码: public static <T> void sort(List<T> list, Comparator<? super T& ...

  7. git的简单玩法

    本篇笔记参考廖雪峰的git教程,为方便查看将命令部分提取并记录下来. 无意对原作的版权侵犯,如需要学习请到廖雪峰网站学习git 创建git仓库 # mkdir learngit && ...

  8. [置顶] Git 配置SSH简单玩法?

    > 第一步下载git点击直接下载 他会检测您的系统当前是64bit还是32bit安装过程不再啰嗦反正就是Next Next Next Finish 第二步这里你可以下载TortoiseGit点击 ...

  9. PS人物脸部去高光简单之法

    案例素材图: 方法原理步骤:得到高光面的选区,然后吸取高光面附近的颜色填充上去,这样就达到了去高光的效果. 得到高光选区的方法有很多种,要提取这种选区,通过阿尔法通道是最合适不过的了,本案例就通过阿尔 ...

随机推荐

  1. .net core 验证 Options 参数

    .net core 中通过 PostConfigure 验证 Options 参数 Intro 在 .net core 中配置项推荐用 Options 来实现,有一些参数可能必须是用由用户来配置,不能 ...

  2. 新版的nuget包 PackageLicense 这样写

    Intro 最近编译类库项目的时候发现总是有个 licenseUrl 的警告,警告信息如下: warning NU5125: The 'licenseUrl' element will be depr ...

  3. mysql的定时器

    mysql定时器是系统给提供了event,而oracle里面的定时器是系统给提供的job.废话少说,下面创建表: create table mytable ( id int auto_incremen ...

  4. Clickhouse v18编译记录

    简介 ClickHouse是"战斗民族"俄罗斯搜索巨头Yandex公司开源的一个极具"战斗力"的实时数据分析数据库,是面向 OLAP 的分布式列式DBMS,圈内 ...

  5. python正则表达式模块re

    正则表达式的特殊元素 匹配符号 描述 '.'(点dot) 在默认模式下,它匹配除换行符之外的任何字符.如果指定了DOTALL标志,则匹配包括换行符在内的任何字符 '^'(Caret) 匹配以字符串开头 ...

  6. SQLServer之创建唯一非聚集索引

    创建唯一非聚集索引典型实现 唯一索引可通过以下方式实现: PRIMARY KEY 或 UNIQUE 约束 在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自 ...

  7. MySql 学习之路-Date函数

    MySQL中重要的内建函数 函数 描述 NOW() 返回当前的日期和时间 NOW() 返回当前的日期和时间. 语法 NOW() -- 实例 -- 下面是 SELECT 语句: SELECT NOW() ...

  8. css_选择器

    老师的博客:https://www.cnblogs.com/liwenzhou/p/7999532.html 参考w3 school:http://www.w3school.com.cn/css/cs ...

  9. 上传本地文件到GitHub上

    问题解决 今天在windows上上传本地文件到github,出现用户名和仓库不匹配的情况,解决方式如下: 打开控制面板,选择用户账户 把该删除的账户删除一下就行了. 上传文件的步骤如下: 将上传的文件 ...

  10. Linux内核入门到放弃-内核活动-《深入Linux内核架构》笔记

    中断 中断类型 同步中断和异常.这些由CPU自身产生,针对当前执行的程序 异步中断.这是经典的中断类型,由外部设备产生,可能发生在任意时间. 在退出中断中,内核会检查下列事项. 调度器是否应该选择一个 ...