首页 > 其他分享 >P8430 题解

P8430 题解

时间:2023-05-14 10:46:10浏览次数:47  
标签:int 题解 合法 P8430 括号 text 序列

前言

题目传送门!

更好的阅读体验?

比较妙的交互题。

思路

题意就是每次可以询问 \([l, r]\) 的括号子序列是否为合法,\((n-1)\) 次询问后,需要求出整个括号序列。

括号序列,自然想到栈。考虑每次进行一个 \([\text{top}, i]\) 的询问。如果是合法,那么 \(a_{\text{top}}=\text{LEFT}, a_i = \text{RIGHT}\)。

考虑将不确定的位置组成一个新的括号序列。这个序列有一个很强的特性:任意区间都不能组成合法匹配

进行一个反证。

假设序列形如 \(\text{(S)}\) 的样子。若 \(\text{S}\) 的首位是右括号,必然可以和左边那个组成合法匹配,所以 \( \text{S}\) 的首位是左括号。同理 \(\text{S}\) 的末位是右括号。
\(\\\)
所以序列会进一步被固定成 \(\text{((S-2))}\),\(\text{(((S-4)))}\),以此类推,最后会组合成 \(\text{((((}\cdots\text{))))}\) 的形式,而这整个序列就是合法的,与我们强大的特性矛盾。寄!

综上,序列一定是形如 \(\text{)S(}\) 的形式的,类似于上方分析,整个序列可以被逐步扩大成 \(\text{))))}\cdots\text{((((}\) 的形式。

按照这个形式填充回原序列即可拿下。

代码

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5 + 5;
int n, q; char a[N];
namespace Mutual {
	int ask(int l, int r)
	{
		cout << "? " << l << ' ' << r << endl;
		int tmp; cin >> tmp; return tmp;
	}
	void answer()
	{
		cout << "! ";
		for (int i = 1; i <= n; i++) cout << a[i];
		cout << endl;
	}
}; using namespace Mutual;
int stk[N], top;
int solve()
{
	int cnt = n;
	stk[++top] = 1; //现在是寻找合法子串 
	for (int i = 2; i <= n; i++)
	{
		if (top && ask(stk[top], i))
			a[stk[top]] = '(', a[i] = ')', cnt -= 2,
			top--; //匹配成功 
		else stk[++top] = i;
	}
	return cnt;
}
int main()
{
	ios::sync_with_stdio(false);
	cin >> n >> q;
	
	for (int i = 1; i <= n; i++) a[i] = '%';
	int cnt = solve();
	for (int i = 1, cur = 0; i <= n; i++)
		if (a[i] == '%')
		{
			cur++;
			if (cur <= cnt / 2) a[i] = ')'; else a[i] = '(';
		}
	answer();
	return 0;
}

希望能帮助到大家!

标签:int,题解,合法,P8430,括号,text,序列
From: https://www.cnblogs.com/liangbowen/p/17398854.html

相关文章

  • CF543D 题解
    前言题目传送门!更好的阅读体验?比较有趣的换根DP。思路FirstDFS按照换根DP套路,先钦定\(1\)为首都(即根节点),并计算。显然是树形DP。设\(dp_{u}\)表示以\(u\)为根的子树全部满足的方案数。对于一条树边\((u,v)\):如果\((u,v)\)修,就意味着\(v\)对应子树的所......
  • ABC254F 题解
    前言题目传送门!更好的阅读体验?这题trick就是更相减损术:\(\gcd\{a_1,a_2,a_3,\cdots,a_n\}=\gcd\{a_1,a_2-a_1,a_3-a_2,\cdots,a_n-a_{n-1}\}\)。思路有了这个trick之后这题就好做了。并不需要其他题解一样画表格,化简式子就行,过程并没有难点。\[\begin{a......
  • UVA12096 题解
    这道题虽然被评黄,但个人感觉不止普及组难度,而且是一道很有价值的题目。题解区里全是\(O(n^2logn)\)的STL大法,我来发一篇\(O(n^2)\)哈希做法。目前0ms喜提最优解。这道题是codeforcesgym的题目,本质上就是模拟栈中集合插入,复制,相加,取交集,取并集的过程。注意,这些集合都是......
  • [AGC001E] BBQ Hard题解
    Problem[AGC001E]BBQHard计算:\[\sum_{i=1}^{n}\sum_{j=i+1}^n\binom{a_i+b_i+a_j+b_j}{a_i+a_j}\]其中\(n\leq2\times10^5\),\(a_i,b_i\leq2000\)Solution以\(a_i\)代\(a_i+b_i\)则等价于求\[\sum_{i=1}^{n}\sum_{j=i+1}^n\binom{a_i+a_j}{b_i+b_j}......
  • 【题解】Luogu[P3750] [六省联考 2017] 分手是祝愿
    Link→小清新dp题,纪念自己的700ac(一个点只有两个状态开和不开,且按两下相当于没按,我们可以从大到小有亮的就按一下,如果我们按到了不需要按的键,就需要再按一下使他变回来。设\(f_i\)表示\(i\)个正确选择变为\(i-1\)个的期望操作次数。则有\(\dfrac{i}{n}\)概率按到......
  • 【题解】Luogu[P4900] 食堂
    一到推柿子题。题意即求\(\sum\limits^{n}_{i=1}\sum\limits^{i}_{j=1}\left\{\frac{i}{j}\bmodP\right\}\)对于\(\frac{i}{j}\bmodP\)我们知道即为\(i\)乘上\(j\)的逆元,即为\(i\cdot\mathrm{inv}(j)\)故:\[\begin{aligned}\sum^{n}_{i=1}\sum^{i}_{j=1}\l......
  • 【题解】Luogu[P6003] USACO20JAN Loan Repayment S
    模拟赛第一题(9pts考虑暴力。枚举\(x\),对于每个\(x\),模拟\(k\)天,判断其是否合法,找出最大的\(x\)。时间复杂度:\(O(n^2)\)36pts考虑优化先前暴力算法。我们不难发现当\(x\)合法时,必然有合法\(x_1\),当且仅当\(x_1<x\)。故\(x\)具有单调性,考虑二分答案。对于\(x......
  • 【题解】Luogu[P8818] CSP-S 2022 策略游戏
    一道简单区间rmq分类讨论题,考场上最后5分钟想出来,没写出来,退役了……给定两个序列\(A_{1},\dots,A_{n}\);\(B_1,\dots,B_n\)规定\(C_{i,j}=A_i\timesB_i\)。题目说小L和小Q必定选择最优策略,而小L先选,小Q后选,小L要使得\(C_{i,j}\)尽可能大,小Q要使得\(C_{i,j}\)......
  • 【题解】Luogu[P1879] [USACO06NOV]Corn Fields G
    Link→状压dp典题,看数据范围就能多半猜到是状压。\(M\)行\(N\)列很不舒服,本篇题解规定为\(N\)行\(M\)列。因为说没有哪两块草地相连,我们不妨一行一行考虑,一行中每格只可能是\(0\)或\(1\),所以一行的总不同状态数是\(2^M\)。我们用二进制表示每一行的状态,对于每一行,暴......
  • 【题解】Luogu[P1967] NOIP2013 提高组 货车运输
    Link→很容易想到一个暴力做法,就是跑一遍Floyd,\(F_{i,j}\)表示\(i\)到\(j\)最大载重量,转移\(F_{i,j}=\max\{F_{i,j},\min\{F_{i,k},F_{k,j}\}\}\)。显然时间复杂度\(O(n^3)\)是过不了的。我们发现,因为是求两点路径中使得最小值最大,实际上有一些较小的路径是不会走......