「BalkanOI 2018 Day2」Parentrises

part1

显然可以直接贪心。

右括号记-1,左括号记1。

默认起始全部绿色,不染色。

策略如下:

  1. 从左往右扫,如果右括号个数大于左括号,那么去除目前未被染色的且在最前面的两个右括号(染成红,蓝色)。(如果没有无解)。

  2. 若此时恰好匹配,有解。

  3. 若此时左括号多出\(sum\)个,记录上一个括号完全匹配的地方,显然该位置往后是没有点被染色的。从右往左扫到该点,染色\(2*sum\)个点,如果到达某个点时候,左括号在染色后仍旧多于右括号,那么无解。

  4. 染完色输出即可。

part2

推论:一个括号串能够满足条件当且仅当所有前缀中右括号数量小于等于左括号×2,所有后缀中,左括号个数小于等于右括号数×2。

一段括号串的值为括号的和。

可以记录左括号×2-右括号数\(j\),而 后缀中右括号×2-左括号的最小值 = \(min(总括号值- 某前缀中左括号×2-右括号)\),相当于记录前缀中\(j\)的最大值\(k\)。

那么可以定义出\(dp\)状态\(dp[i][j][k]\),表示当前已经有\(i\)个括号,\(j,k\)如上。

之后转移时保证\(j \geq 0\),对于一个状态,如果它后缀中右括号×2-左括号的最小值 \(\geq 0\),那么计入答案。

转移直接枚举放左括号还是右括号。

复杂度\(o(n^3)\)。

当然由于n比较小,直接打表也行。

#include<bits/stdc++.h>
#define rep(q,a,b) for(int q=a,q##_end_=b;q<=q##_end_;++q)
#define dep(q,a,b) for(int q=a,q##_end_=b;q>=q##_end_;--q)
#define mem(a,b) memset(a,b,sizeof a )
#define debug(a) cerr<<#a<<' '<<a<<"___"<<endl
using namespace std;
void in(int &r){
static char c;
r=0;
while(c=getchar(),!isdigit(c));
do r=(r<<1)+(r<<3)+(c^48);
while(c=getchar(),isdigit(c));
}
int T;
namespace p_1{
const int mn=1e6+5;
char as[mn];
int sum[mn];
queue<int> had;
int cor[mn],tot[mn];
bool get(int len){
while(!had.empty())had.pop();
rep(q,1,len)cor[q]=0;
int last_zero=0;
rep(q,1,len){
int v=as[q]=='('?1:-1;
if(v==-1)had.push(q);
sum[q]=sum[q-1]+v;
if(sum[q]<0){
sum[q]=0;
if(had.size()<2){
return 0;
}
cor[had.front()]=1;
had.pop();
cor[had.front()]=2;
had.pop();
}
if(sum[q]==0)last_zero=q;
}
if(sum[len]>0){
tot[len+1]=0;
dep(q,len,last_zero+1)tot[q]=tot[q+1]+(as[q]==')');
int td=sum[len]<<1;
dep(q,len,last_zero+1)if(as[q]=='('){
if(td&1)cor[q]=1;
else cor[q]=2;
--td;
if((len-q+1-tot[q] +1)/2>tot[q])return 0;
if(!td)break;
}
return !td;
}
return 1;
}
void solve(){
in(T);
while(T--){
scanf("%s",as+1);
int len=strlen(as+1);
if(get(len)){
rep(q,1,len){
if(cor[q]==0)putchar('G');
else if(cor[q]==1)putchar('B');
else putchar('R');
}
putchar('\n');
}else puts("impossible");
}
}
}
namespace p_2{ int ans[305]={0,0,1,2,2,6,12,18,43,86,148,326,652,1194,2531,5062,9578,19884,39768,76680,157236,314472,613440,1248198,2496396,4906266,9932707,19865414,39237478,79165646,158331292,313801154,631634323,263268639,509707998,43257469,86514938,72895660,288290012,576580024,551498904,962513721,925027435,204521844,634307677,268615347,287719520,559111350,118222693,578936427,105459291,210918582,360752402,920849461,841698915,421349166,985137176,970274345,96196738,666703791,333407575,448451120,71192847,142385694,391328273,82210164,164420328,697441626,75399225,150798450,177655189,77725370,155450740,578770998,806452500,612904993,342317187,437431531,874863062,166780006,649351541,298703075,764861307,105948983,211897966,169754380,332500687,665001374,648783808,296688714,593377428,43060831,684124175,368248343,973819030,849070862,698141717,982308804,88186365,176372730,959772055,320975583,641951166,825442333,311190079,622380158,765671696,14446067,28892134,262223145,966556598,933113189,520941027,287565710,575131420,666019185,263936054,527872108,39283492,877846547,755693087,433079969,737806887,475613767,203965075,701508060,403016113,922600280,277710517,555421034,408729101,377397802,754795604,250532053,528340400,56680793,124734442,232656836,465313672,714603167,631625056,263250105,52648990,389536240,779072480,641256163,302398795,604797590,697370162,632833340,265666673,626109777,298187773,596375546,406717000,515830626,31661245,524137426,667633864,335267721,338047842,390892123,781784246,93415445,65330389,130660778,151215664,822766849,645533691,833650616,380489231,760978462,54775313,491923347,983846694,322809267,940997512,881995017,596258099,507985218,15970429,557503950,859869218,719738429,474482700,767988978,535977949,635491203,387005395,774010790,702061186,253594815,507189630,31838831,822372294,644744581,231777149,215914547,431829094,482869402,576014681,152029355,369499245,244741222,489482444,95772722,952809165,905618323,304323137,304632041,609264082,102336119,335070266,670140532,858231094,960619772,921239537,859847032,56893721,113787442,360033502,982628521,965257035,849451750,439416129,878832258,991939394,464496385,928992770,267785589,802816545,605633083,763528731,474974661,949949322,864267253,946087508,892175009,476000768,273171027,546342054,550581443,469352643,938705286,624000951,673806443,347612879,434823692,233016716,466033432,103642988,440059594,880119188,788176043,40656596,81313192,286602731,202636014,405272028,733717711,472596468,945192936,553096598,892385168,784770329,912447619,707646096,415292185,526477156,861291715,722583423,111861393,588150125,176300243,301383510,244253166,488506332,629844702,421869639,843739278,290375226,384946885,769893770,95673275,473895679,947791358,891751001,164209639,328419278,62075416,175112411,350224822,934621064,806088783,612177559,897003764,948394637,896789267,953901352,418921686,837843372};
int dp[2][305][605];
const int mod=1e9+7;
void add(int &a,int b){
a=(a+b)%mod;
}
void calc(){
int ed=300;
dp[0][0][0]=1;
bool ok=0;
rep(q,0,ed){
ok=!ok;
mem(dp[ok],0);
rep(l,0,q){
int r=q-l;
rep(w,0,2*q){
if(r*2-l -w>=0)add(ans[q],dp[!ok][l][w]); if(l*2-r-1>=0)add(dp[ok][l][max(w,(r+1)*2-l)],dp[!ok][l][w]);
add(dp[ok][l+1][max(w,r*2-l-1)],dp[!ok][l][w]);
}
}
}
}
void solve(){
in(T);
int n;
while(T--){
in(n);
printf("%d\n",ans[n]);
}
}
}
int main(){
freopen("parentrises.in","r",stdin);
freopen("parentrises.out","w",stdout);
int P;
in(P);
if(P==1)p_1::solve();
else p_2::solve();
return 0;
}

「BalkanOI 2018 Day2」Parentrises的更多相关文章

  1. 「BalkanOI 2018 Day1」Election

    「BalkanOI 2018 Day1」Election 记C为1,T为-1,\(sum[i]\)为\(i\)点的前缀和. 对于询问\([l,r]\),分两步计算答案. 要求所有点的\(sum[i]- ...

  2. 「BalkanOI 2018 Day1」Minmaxtree

    「BalkanOI 2018 Day1」Minmaxtree 每个点都有一个最大和最小权值的限制. 然后每一个权值的限制都必须要取到. 每个点显然可以直接让他取到最大或最小权值. 可以想到每个点匹配一 ...

  3. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  4. 【LOJ】#3034. 「JOISC 2019 Day2」两道料理

    LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...

  5. 【LOJ】#3033. 「JOISC 2019 Day2」两个天线

    LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...

  6. 「雅礼集训 2018 Day2」农民

    传送门 Description  「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却 ...

  7. LOJ6500. 「雅礼集训 2018 Day2」操作(哈希+差分)

    题目链接 https://loj.ac/problem/6500 题解 区间取反 \(01\) 串的经典套路是差分.我们令 \(b_i = a_i\ {\rm xor}\ a_{i - 1}\)(\( ...

  8. 【卡常 bitset 分块】loj#6499. 「雅礼集训 2018 Day2」颜色

    好不容易算着块大小,裸的分块才能过随机极限数据:然而这题在线的数据都竟然是构造的…… 题目描述 有 $n$ 个数字,第 $i$ 个数字为 $a_i$. 有 $m$ 次询问,每次给出 $k_i$ 个区间 ...

  9. #6499. 「雅礼集训 2018 Day2」颜色 [分块,倍增,bitset]

    bitset压位,因为是颜色数,直接倍增,重合部分不管,没了. // powered by c++11 // by Isaunoya #include <bits/stdc++.h> #d ...

随机推荐

  1. 小白自制Linux开发板(第二季 V3s篇) 一. 换个核心再来一次

    1.前言 大家心心念念(个人认为)的小白自制开发板全新系列正式来了,之前我们使用全志的F1C200s芯片制作了一个小电脑,众所周知,调试很艰难,坑也很多,以至于墨云到现在还是没找到对应的补救方案,为了 ...

  2. vue为什么要设计成异步队列渲染

    异步队列渲染 上一篇文章是在vue2.0 中通过Object.defineProperty去拦截并监听数据变化的响应式原理,这篇文章将会沿着图谱继续深入探索,在依赖被通知变化了之后,会触发vue当中的 ...

  3. Java初学者作业——编写Java程序,根据输入的某个班级的学员成绩,计算该班级学员的平均成绩,要求输入班级的人数。

    返回本章节 返回作业目录 需求说明: 编写Java程序,根据输入的某个班级的学员成绩,计算该班级学员的平均成绩,要求输入班级的人数. 实现思路: 声明变量sum.count以及avg用于存储总成绩.班 ...

  4. 智慧巨鹿使用Rainbond落地实践,一个平台管理所有应用系统

    背景 大家好,我是北京数立通科技有限公司的李栋.最近几年,我一直负责"智慧巨鹿"这一智慧城市项目的运行与维护工作.这个项目涉及到10多家供应商开发的 30 多套智慧城市应用的运维管 ...

  5. JMeter_使用正则和JSON提取器参数化(常用于提取token)

    一.使用正则表达式提取器提取token 查看登录响应参数找出token.图中token为 "ticketString": "ccf26b17-a96f-4913-8925 ...

  6. [Beyond Compare] 排除/忽略 .svn 文件夹

    [Beyond Compare] Exclude .svn folders Beyond Compare 3 Session >> Session Settings... >> ...

  7. spring cloud --- config 从git 获取文件【 可能是yml或 properties】遇到有相同字段的取值规则

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 昨天做了 spring cloud config 配置中心 获取存在gi ...

  8. css 垂直居中技巧

    CSS垂直居中技巧,我只会23个,你会几个?自古以来(是有多?~),网页CSS的垂直居中需求始终没有停过,而其困难度也始终没有让人轻松过,经过了每位开发先烈的研究后,据说CSS的垂直居中技巧已达到近十 ...

  9. LabVIEW生成.NET的DLL——C#下调用NI数据采集设备功能的一种方法 [原创www.cnblogs.com/helesheng]

    LabVIEW是NI公司的数据采集设备的标准平台,在其上调用NI-DAQmx驱动和接口函数能够高效的开发数据采集和控制程序.但作为一种图形化的开发语言,使用LabVIEW开发涉及算法和流程控制的大型应 ...

  10. python分支结构与循环结构

    python分支结构 一.if 单条件形式 # 年轻人的世界都不容易 age > 18 age = int(input("请输入您的年龄:")) # input()函数 模拟 ...