ARC120D Bracket Score 2 (模拟)
题面
给一个长度为
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 (模拟)的更多相关文章
- CodeForces - 224C. Bracket Sequence (栈模拟)简单做法
		
A bracket sequence is a string, containing only characters "(", ")", "[&quo ...
 - Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 模拟
		
题目链接: http://codeforces.com/contest/670/problem/E 题解: 用STL的list和stack模拟的,没想到跑的还挺快. 代码: #include<i ...
 - HDU 5268 ZYB loves Score (简单模拟,水)
		
题意:计算Bestcoder四题的得分. 思路:直接模拟,4项分数直接计算后输出.注意不要低于百分之40的分. //#include <bits/stdc++.h> #include &l ...
 - 【CF1023C】Bracket Subsequence(模拟)
		
题意:给定一个正则括号序列 s ,让你在当中选择一个长度正好为 t 的子串,使得 t 恰好也是一个正则括号序列 思路:用栈模拟 #include<cstdio> #include<c ...
 - Codeforces Round #529 (Div. 3)  E. Almost Regular Bracket Sequence  (思维,模拟栈)
		
题意:给你一串括号,每次仅可以修改一个位置,问有多少位置仅修改一次后所有括号合法. 题解:我们用栈来将这串括号进行匹配,每成功匹配一对就将它们消去,因为题目要求仅修改一处使得所有括号合法,所以栈中最后 ...
 - ACM思维题训练 Section A
		
题目地址: 选题为入门的Codeforce div2/div1的C题和D题. 题解: A:CF思维联系–CodeForces -214C (拓扑排序+思维+贪心) B:CF–思维练习-- CodeFo ...
 - CodeForces 670E Correct Bracket Sequence Editor(list和迭代器函数模拟)
		
E. Correct Bracket Sequence Editor time limit per test 2 seconds memory limit per test 256 megabytes ...
 - CF思维联系– Codeforces-990C Bracket Sequences Concatenation Problem(括号匹配+模拟)
		
ACM思维题训练集合 A bracket sequence is a string containing only characters "(" and ")" ...
 - 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 ...
 
随机推荐
- 浏览器代理user-agent
			
两种方法: 法1:浏览器地址栏输入:about://version,然后复制用户代理: 如果法1不行,法2肯定可以. 法2:打开任意浏览器,输入任意网址,下面以火狐和百度网址为例来进行说明: 打开火狐 ...
 - vue项目经常遇到的Error: Loading chunk * failed
			
vue项目随着代码量.业务组件.路由页面等的丰富,出于性能要求考虑不得不使用代码分割技术实现路由和组件的懒加载,这看似没什么问题 当每次通过npm run build构建生产包并部署到服务器后,操作页 ...
 - 合宙AIR105(二): 时钟设置和延迟函数
			
目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 Air105 的时钟 高频振荡源 芯片支持使用内部振荡源, 或使 ...
 - kubernetes code-generator使用
			
目录 Overview Prerequisites CRD code-generator 编写代码模板 code-generator Tag说明 开始填写文件内容 type.go doc.go reg ...
 - VR技术赋能五大领域,不止高级,更高效!
			
除了VR游戏.VR影视作品,究竟还有哪些产业领域会应用到VR技术并为生活带来改变呢?今天就帮大家好好梳理一下~ VR赋能交通,不只是高级 最近在网上看到了VR考驾照的新闻,网友都赞叹,现在学车都这么高 ...
 - SprinigBoot自定义Starter
			
自定义Starter 是什么 starter可以理解是一组封装好的依赖包,包含需要的组件和组件所需的依赖包,使得使用者不需要再关注组件的依赖问题 所以一个staerter包含 提供一个autoconf ...
 - SAP 实例 3 Context Menus
			
REPORT demo_dynpro_context_menu. DATA: field1 TYPE i VALUE 10, field2 TYPE p DECIMALS 4. DATA: prog ...
 - 运行Flutter时连接超时
			
这个墙不知道浪费了开发者多少的时间!!!!!!!!!!!!!!!!!!! 1.修改仓库地址为阿里仓库: 编辑android/build.gradle,把文件中的两处: google() jcenter ...
 - Java多线程交替打印
			
1. synchronized实现双线程交替打印 class Print implements Runnable{ static int i=0; static final int n=100; @O ...
 - labview入门到出家11(补充)——基于单片机和labview开发的虚拟示波器
			
 之前有小伙伴提到需要虚拟示波器的资料,有些库还有文件丢失了,直接给的工程跑不起来,这里我把关键的地方讲解一下,大家可以自行开发.其实开发不难,只是有些点会耗点时间.虚拟示波器,顾名思义就是非实物的 ...