首页 > 其他分享 >Codeforces 1906L Palindromic Parentheses

Codeforces 1906L Palindromic Parentheses

时间:2024-02-27 14:57:07浏览次数:16  
标签:Parentheses frac Palindromic 左边 texttt Codeforces 括号 匹配 cases

考虑先判定有无解对应的 \(k\) 的范围。

首先若 \(k = n\) 一定无解,因为字符串开头是 \(\texttt{(}\) 结尾是 \(\texttt{)}\) 匹配不上。
下界因为各有 \(\frac{n}{2}\) 个 \(\texttt{()}\),所以可以先猜测下界就为 \(\frac{n}{2}\)。

考虑构造到这个下界。
能发现只需要形如 \(\texttt{(((...)))}\) 即可。

然后考虑增量法往上一个一个增加。
发现 \(\texttt{()(((...)))}\) 会使左边的小括号组的右括号与右边的大括号组的右括号匹配上,即匹配长度会增加 \(2\),且此时左边小括号组的左括号是未匹配的。
继续增加,\(\texttt{()(((...)))()}\),能发现最左边的左括号与右边的括号组的左括号匹配上了,\(+2\),且此时右括号组的右括号是未匹配的。
于是能发现再在左边加上 \(\texttt{()}\) 又能 \(+2\),然后又是右边加,左边加这样的。

放的数量可以考虑解方程,设最中间各有 \(x\) 个 \(\texttt{(}\) 和 \(\texttt{)}\),左右侧共有 \(y\) 个 \(\texttt{()}\),有方程 \(\begin{cases}2x + 2y = n\\ x + 2y = k\end{cases}\),解得 \(\begin{cases}x = n - k \\ y = k - \frac{n}{2}\end{cases}\)。
于是就可以中间放上 \(n - k\) 个 \(\texttt{(}\) 和 \(\texttt{)}\),然后依次在左边和右边来回放共 \(k - \frac{n}{2}\) 个 \(\texttt{()}\)。

#include<bits/stdc++.h>
int main() {
    int n, k; scanf("%d%d", &n, &k);
    int x = n - k, y = k - n / 2;
    if (x <= 0 || y < 0) return puts("-1"), 0;
    for (int i = 1; i <= (y + 1) / 2; i++) printf("()");
    for (int i = 1; i <= x; i++) printf("(");
    for (int i = 1; i <= x; i++) printf(")");
    for (int i = 1; i <= y / 2; i++) printf("()"); 
    return 0;
}

标签:Parentheses,frac,Palindromic,左边,texttt,Codeforces,括号,匹配,cases
From: https://www.cnblogs.com/rizynvu/p/18036863

相关文章

  • Educational Codeforces Round 162 (Rated for Div. 2)
    Preface开学了没时间组队训练就抽空把之前欠下的CF补一补这场当时玩《拔作岛》上头了忘记有比赛了,等想起来的时候已经快结束了就没现场打赛后补题发现A~E都很简单,F的话一个地方没太想清看了题解才会A.MovingChips签到,找一个极小的且包含了所有\(1\)的区间,这个区间中\(0\)......
  • Codeforces 1451F Nullify The Matrix
    因为保证了这个路径必须是向下和向右,就可以考虑每一条\(i+j=x\)的斜线上的点,因为一条路径经过的点对应的\(i+j\)一定是每次\(+1\)的。考虑到因为对于同一条直线,每个点是独立的,因为一条路径至多经过这条直线上的一个点。于是可以考虑用\(\text{Nim}\)的思想把这条......
  • CF1923 Educational Codeforces Round 162 (Rated for Div. 2)
    C.FindB给出一个数组A,对于q个询问,每个询问给出[l,r],对于A的子数组[l,r],问是否存在一个相同大小的数组B,使得两个数组的和相同,且任意相同下标的元素不同?Solution:A中任意一个大于1的元素,可以把他变成1,多余的那部分给到其他位置的元素上(如最后一个)对于等于1的元素,把......
  • CF1932 Codeforces Round 927 (Div. 3)
    E.FinalCountdown我愿称之为今年最傻逼的一次,思路很快想出来了,但是实现一直搞不对观察发现答案是n的所有前i位数相加(如12345,那么ans=12345+1234+123+12+1)要证明的话就是按照题目的Note那样算,(以12345为例,ans=(12345-1234-123-12-1)+21234+2123+212+21)然后傻逼的事情......
  • Educational Codeforces Round 162 (Rated for Div. 2)
    目录写在前面ABCDE写在最后写在前面比赛地址:https://codeforces.com/contest/1923。为唐氏儿的寒假带来了一个构式的结局,飞舞一个。天使骚骚不太行啊妈的,推了三条线了感觉剧情太白开水了,咖啡馆也是这个熊样子、、、A签到。显然最优的策略是不断地选择最右侧的1进行操作,每......
  • Codeforces Round 791 (Div. 2)
     C-RooksDefenders线段树模板,维护:1)v:个数,2)sum:v的个数是否大于0.//#include"bits/stdc++.h"#include"iostream"usingnamespacestd;constintN=2e5;structNode{intl,r,v,sum;}tr1[N*4],tr2[N*4];intn,q;voidbuild(Nodetr[],i......
  • Codeforces 587D Duff in Beach
    不难发现可以按长度为\(n\)分为段。考虑到\(l\)其实并没什么大用,只是说对于选出来的\(b_{1\simx}\)可以都整体移任意段,只需要保证在范围内就行了。进一步的,发现只需要看最后一个数的取值得到其最大可以在的段数即为\(d\),那么移动的方案数就为\(d-x+1\)。还有的一......
  • Codeforces Round 926 (Div. 2)
    A.升序排列再求和#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){intn;cin>>n;vector<int>a(n+1);for(inti=1;i<=n;i++)cin>>a[i];sort(a.b......
  • Educational Codeforces Round 162 (Rated for Div. 2)
    EducationalCodeforcesRound162(RatedforDiv.2)A-MovingChips解题思路:模拟一下,不难发现是\(1\)之间\(0\)的个数。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusin......
  • Codeforces 1025F Disjoint Triangles
    结论:如果两个三角形不相交,那么一定存在两条内公切线。于是可以考虑枚举这条内公切线的端点\(x,y\)。那么一个三角形的两个端点就会在\(x\toy\)这条线的同一侧,另外一个三角形的两个端点会在这条线的另一侧。同时这条线的一侧与其配对的端点可能是\(x\)也可能是\(y\)。......