首页 > 其他分享 >题解 P9406【[POI2020-2021R3] Nawiasowania】

题解 P9406【[POI2020-2021R3] Nawiasowania】

时间:2023-08-02 20:11:31浏览次数:37  
标签:POI2020 int 题解 括号 Nawiasowania heap 最优 now define

一个显然的思路是:在排列 \(p\) 的括号串合法的基础上,使得左括号在原括号串中尽量靠左,这样答案更有可能合法。于是我们求出这个原括号尽量靠左的括号串(下文称为“最优括号串”),然后 check 合法性即可。

下文中 \(s\) 是排列 \(p\) 的括号串。

当 \(n=2\) 时,唯一的填法是令 \(s_1\gets\texttt{(},s_2\gets\texttt{)}\),这个填法显然是最优括号串。

如果我们找出了 \(n=n_0-2\) 的最优括号串,考虑如何找出 \(n=n_0\) 的最优括号串。显然已经填好的左括号是不能动的,因为 \(n=n_0-2\) 时已经是最优括号串,任何移动都会导致括号串不合法。我们先令多出的两位 \(s_{n_0-1}\gets\texttt{)},s_{n_0}\gets\texttt{)}\),只需要在这个括号串中改一个左括号为右括号,且括号串依然合法即可。

注意到除了 \(s_{n_0}\) 处的右括号,其他的右括号都可以改为左括号。这个性质可以通过 \(n=n_0-2\) 时的最优括号串性质易证。

于是我们用小根堆维护当前所有可以改为左括号的右括号的位置,进行增量构造。小根堆中初始有 \(p_1\),进行 \(\frac{n}{2}\) 次操作,每次取出小根堆堆顶并对应位置置为左括号,然后将新产生的可改动位置压入堆中即可。

最后 check 答案字符串的合法性并输出。

时间复杂度 \(O(n\log n)\)。

// Problem: P9406 [POI2020-2021R3] Nawiasowania
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P9406
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define per(x,y,z) for(int x=(y);x>=(z);x--)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do{freopen(s".in","r",stdin);freopen(s".out","w",stdout);}while(false)
#define likely(exp) __builtin_expect(!!(exp), 1)
#define unlikely(exp) __builtin_expect(!!(exp), 0)
using namespace std;
typedef long long ll;

mt19937 rnd(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
int randint(int L, int R) {
	uniform_int_distribution<int> dist(L, R);
	return dist(rnd);
}

template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}

const int N = 1e6+5;

int n, a[N];
char s[N];
priority_queue<int, vector<int>, greater<int>> heap;

int main() {
	scanf("%d", &n);
	rep(i, 1, n) {
		scanf("%d", &a[i]);
		s[i] = ')';
	}
	s[n+1] = 0;
	heap.push(a[1]);
	rep(i, 1, n/2) {
		s[heap.top()] = '(';
		heap.pop();
		if(i < n / 2) {
			heap.push(a[2*i]);
			heap.push(a[2*i+1]);
		}
	}
	int now = 0;
	rep(i, 1, n) {
		if(s[i] == '(') ++now;
		else --now;
		if(now < 0) return puts("NIE")&0;
	}
	puts(s+1);
	return 0;
}

标签:POI2020,int,题解,括号,Nawiasowania,heap,最优,now,define
From: https://www.cnblogs.com/ruierqwq/p/LG-P9406.html

相关文章

  • 题解 P9326
    前言数学符号约定\(n\):任意正整数。\(\#\):从未出现过的小写字母。\(\Sigma\):字符集,这里指小写字母集合。\(S\):最终答案的字符矩阵。其余符号同题目翻译中所写。如非特殊说明,将会按照上述约定书写符号。题目大意构造一个\(N\timesM\)的小写字母矩阵,使得其中有\(R\)行......
  • 题解
    大力相应teacher要求。正难则反,考虑求不合法的三元组的数量。对于一个不合法的三元组,可以发现条件等价于三元组中有一个点出度为2。记\(m\)次操作后每个点出度为\(d_i\),答案就是\(\dbinom{n}{3}-\sum\limits_{i=1}^n\dbinom{d_i}{2}\)。那么怎么统计?回忆\(\mathcal{O}(......
  • Lua script attempted to access a non local key in a cluster node 问题解决
    一、问题描述最近优化公司需要对不同的业务系统的缓存工具提供一个标准化的解决方案。各个业务系统将缓存数据通过map结构进行存储,然后在缓存系统中将这些map获取出来,然后保存在redis数据库中。技术经理想到的最好解决方案是将map集合直接存储在redis的hash表中。但是要求对hash......
  • CF1468N 题解
    洛谷链接&CF链接题目简述共有\(T\)组数据,对于每组数据:有三个桶,五种垃圾,每个桶有固定的容量。前三种垃圾分别放入三种桶中,第四种垃圾可以放进\(1,3\)桶中,第五种垃圾可以放进\(2,3\)桶中。问题:对于给定的桶容量和垃圾量,请问垃圾是否可以全部放入桶中?思路简单贪心题。......
  • CF479C 题解
    洛谷链接&CF链接题目简述一个人想要安排期末考试的时间。有\(n\)场考试,每场考试有两个时间\(x_i,y_i\),一个是老师规定的时间,另外一个是他与老师商量好的考试时间。如果错过了,那就只能按照原来的考试时间考试。规定:只能按照原定考试的日期顺序进行考试的情况下,输出考完试......
  • 饭票 题解
    1.题意简述某天小\(x\)去食堂吃饭,手里有\(n\)种饭票,面值分别为\(A_1~A_n\),数量分别为\(C_1~C_n\)请你计算小\(x\)的饭票能组成多少在\([1,m]\)区间内的面值。2.样例解释3101242118样例中,我们有两张一元,一张两元和一张四元,可以凑出\(1\)到\(8\)元中所......
  • 【题解】Luogu[P2296] [NOIP2014 提高组] 寻找道路
    Link很简单的一道图论题。要在一个有向图上找一条\(s\)到\(t\)的最短路,要求这条路径上的所有点都满足:该点的所有出边所连点都能到达终点\(t\)。看上去很乱,我们简单分解一下,先在所有点中找到与终点有路径的点集\(A\)进行标记,再再所有点中找到其所有出边所连点都被打上标......
  • 国标GB28181视频平台LntonGBS国标平台调用快照接口,未能正常返回快照图片的问题解决方
    LntonGBS国标视频云服务支持设备/平台通过国标GB28181协议注册接入,可实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。LntonGBS平台便捷、丰富、灵活、可拓展的视频能力,已经使其成为当前安防市场的主流需求视频平台,并且已经在大量的项目中落地......
  • 【题解】HDOJ 7329 [2023杭电多校] Touhou Red Red Blue
    题目传送门:HDOJ7329[2023杭电多校]TouhouRedRedBlue题意有两个口袋(口袋容量为1,初始均为空),有若干个UFO按顺序来到你的面前,每个UFO有一个颜色(GRB),你可以选择扔掉它或者把它装进口袋中,如果口袋1空着必须装进口袋1;如果口袋都满了,算上面前的UFO共有三个,有如下三种情况:如......
  • NOI2023 题解
    打的太shaber了,于是补补题。D1T1扫描线。首先我们可以容斥一下,答案为被一种操作覆盖到的减去被两种操作覆盖到的加上被三种操作覆盖到的。首先考虑只被一种操作覆盖到的,这很简单,直接上个区间颜色段推平就好了,顺便去了个重。接下来是有被斜线覆盖到的,这样的点数为\(O(nk)\)......