题面

给一个长度为

2

N

2N

2N 的序列

A

A

A,定义一个长度为

2

N

2N

2N 的合法括号序列的 得分(score) 为:

  • 对于每对配对的括号

    i

    ,

    j

    i,j

    i,j,

    ∣

    A

    i

    −

    A

    j

    ∣

    |A_i-A_j|

    ∣Ai​−Aj​∣ 的和。

输出得分最高的任意一个合法括号序列。

1

≤

N

≤

2

⋅

1

0

5

1\leq N\leq 2\cdot10^5

1≤N≤2⋅105.

题解

我们先想一个相关的问题:

在数轴上从左到右存在

2

N

2N

2N 个点(可重合),点之间两两配对并连成线段,问最大的线段总长度。

这是一个经典问题了

考虑第一个点到第二个点之间的部分,最多会被线段覆盖一层,因为左边只有一个点;
第二个点到第三个点之间的部分,最多会被覆盖两层,因为左边只有两个点;
……
依此类推,我们能不能找到一种配对方法,使得每两个点之间的部分都达到能被覆盖的最大层数呢?

不难发现,我们可以将第一个点跟最后一个点配对,第二个点跟倒数第二配对……这是一种方法,最终答案就是后

N

N

N 个点的坐标和 - 前

N

N

N 个点的坐标和。这么看来,更一般地,我们可以在第

N

N

N 个点和第

N

+

1

N+1

N+1 个点之间划条分界线,只要每条线段都能经过这条分界线,即左边的只能和右边的配对,那么最终答案不也是后

N

N

N 个点的坐标和 - 前

N

N

N 个点的坐标和了吗?

有了这个分析,我们可以想想怎么应用在括号序列中了。


如果我们把

A

A

A 序列排个序,如果能保证前一半的点只跟后一半的点配对,那么答案一定最大化了。我们只需要满足这个条件(并且恐怕必须得满足这个条件),就是正确答案了。

那么就可以先把

A

A

A 排个序(最好带上原下标),然后把前一半的变成白点,后一半的变成黑点。

在排序前的序列中,白点黑点个数相同,那么把相邻的黑白点配对,变成左括号和右括号,再把它们在序列中删掉。由于序列中白点黑点个数一直相同,因此总有白点黑点相邻。这样就可以构造出一种合法方案了。

当然,具体实现没必要这么麻烦。这就比较考验各位的模拟能力了。

CODE

#include<set>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 400005
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x) & (x))
#define INF 0x3f3f3f3f
LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f * x;
}
int n,m,i,j,s,o,k;
int a[MAXN];
struct it{
int nm,id;
}b[MAXN];
bool cmp(it a,it b) {return a.nm == b.nm ? (a.id < b.id):(a.nm < b.nm);}
int main() {
n = read();
for(int i = 1;i <= 2*n;i ++) {
a[i] = read();b[i].nm = a[i];b[i].id = i;
}
sort(b + 1,b + 1 + 2*n,cmp);
for(int i = 1;i <= n;i ++) {
a[b[i].id] *= -1;
}
int ct = 0;
for(int i = 1;i <= 2*n;i ++) {
if(a[i] < 0) {
if(ct < 0) putchar(')');
else putchar('(');
ct ++;
}
else {
if(ct > 0) putchar(')');
else putchar('(');
ct --;
}
}ENDL;
return 0;
}

ARC120D Bracket Score 2 (模拟)的更多相关文章

  1. CodeForces - 224C. Bracket Sequence (栈模拟)简单做法

    A bracket sequence is a string, containing only characters "(", ")", "[&quo ...

  2. Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 模拟

    题目链接: http://codeforces.com/contest/670/problem/E 题解: 用STL的list和stack模拟的,没想到跑的还挺快. 代码: #include<i ...

  3. HDU 5268 ZYB loves Score (简单模拟,水)

    题意:计算Bestcoder四题的得分. 思路:直接模拟,4项分数直接计算后输出.注意不要低于百分之40的分. //#include <bits/stdc++.h> #include &l ...

  4. 【CF1023C】Bracket Subsequence(模拟)

    题意:给定一个正则括号序列 s ,让你在当中选择一个长度正好为 t 的子串,使得 t 恰好也是一个正则括号序列 思路:用栈模拟 #include<cstdio> #include<c ...

  5. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维,模拟栈)

    题意:给你一串括号,每次仅可以修改一个位置,问有多少位置仅修改一次后所有括号合法. 题解:我们用栈来将这串括号进行匹配,每成功匹配一对就将它们消去,因为题目要求仅修改一处使得所有括号合法,所以栈中最后 ...

  6. ACM思维题训练 Section A

    题目地址: 选题为入门的Codeforce div2/div1的C题和D题. 题解: A:CF思维联系–CodeForces -214C (拓扑排序+思维+贪心) B:CF–思维练习-- CodeFo ...

  7. CodeForces 670E Correct Bracket Sequence Editor(list和迭代器函数模拟)

    E. Correct Bracket Sequence Editor time limit per test 2 seconds memory limit per test 256 megabytes ...

  8. CF思维联系– Codeforces-990C Bracket Sequences Concatenation Problem(括号匹配+模拟)

    ACM思维题训练集合 A bracket sequence is a string containing only characters "(" and ")" ...

  9. Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 线段树模拟

    E. Correct Bracket Sequence Editor   Recently Polycarp started to develop a text editor that works o ...

随机推荐

  1. Linux系列之安装中文字体

    Linux系统安装中文字体 拷贝字体文件至Linux 从windows电脑的C:\Windows\fonts复制字体文件上传至Linux服务器新建的目录下 复制ttc.ttf文件至Linux服务器字体 ...

  2. JavaScript产生随机颜色

    //获取rgb类型的颜色 IE7不支持 function randomColor(){ var r = Math.floor(Math.random()*256); var g = Math.floo ...

  3. Python+opencv打开修图的正确方式get

    先逼逼两句: 图像是 Web 应用中除文字外最普遍的媒体格式. 流行的 Web 静态图片有 JPEG.PNG.ICO.BMP 等.动态图片主要是 GIF 格式.为了节省图片传输流量,大型互联网公司还会 ...

  4. 【机器学习】K-means聚类分析

    前言 聚类问题是无监督学习的问题,算法思想就是物以类聚,人以群分,聚类算法感知样本间的相似度,进行类别归纳,对新输入进行输出预测,输出变量取有限个离散值.本次我们使用两种方法对鸢尾花数据进行聚类. 无 ...

  5. protobuf 的交叉编译使用(C++)

    前言 为了提高通信效率,可以采用 protobuf 替代 XML 和 Json 数据交互格式,protobuf 相对来说数据量小,在进程间通信或者设备之间通信能够提高通信速率.下面介绍 protobu ...

  6. 记一道经典树上Nim游戏

    这道题首先是 Hanriver 提出来的,但是大家都不会做,今天看到了一道一模一样的题目 AT2667 题目大意是,每个人删掉一个不是整棵树的原树的子树,给定一个树问游戏状态. 首先,这是需要用到多个 ...

  7. 如何用车辆违章查询API接口进行快速开发

    最近公司项目有一个车辆违章查询显示的小功能,想着如果用现成的API就可以大大提高开发效率,所以在网上的API商店搜索了一番,发现了 APISpace,它里面的车辆违章查询API非常符合我的开发需求. ...

  8. Eolink 全局搜索介绍【翻译】

    随着前后端分离成为互联网项目开发的标准模式, API 成为了前后端联通的桥梁.而面对越来越频繁和复杂的调用需求,项目里的 API 数量也越来越多,我们需要通过搜索功能来快速定位到对应的 API来进行使 ...

  9. C++指针和结构体基础知识

    学习C++首先要回忆起C语言当中的指针和结构体知识,本文作者将通过一段代码来总结指针和结构体基础知识:指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使 ...

  10. Linux系统安全与应用

    补充:重定向 类型                                                              操作符                          ...