首页 > 其他分享 >「TAOI-2」Break Through the Barrier 题解

「TAOI-2」Break Through the Barrier 题解

时间:2023-08-20 19:55:33浏览次数:36  
标签:node int 题解 texttt Break mm Through ans drct

前言:比赛前去做牙齿矫正,回来晚了 10 分钟……做比赛的运气全用在了一路绿灯上了(无语)。第二题切了两个半小时。决定写篇题解来抒发一下再记得愤怒愉悦之情。

AC 的想法很简单,就是表示出每一串连续的 \(\texttt{T}\),其长度分别为 \(l_1 \lim l_m\)。明显的,对于任何一个 \(l_i\),在一系列操作后,它的长度顶多加 \(2\),也就是左边多一个,右边多一个。明显的贪心,将 \(\texttt{T}\) 子串按长度从大到小排,然后只要枚举到 \(l_i < ans-1\),就可以结束了。因为它既是加两个,也只能等于 \(ans\)。然后每次更新 \(ans\)。

对于判断左右是否能增加一个,不是只判断有没有 \(\texttt{BTTB}\) 那么简单。拿左边来说,他可能长这样:

\[\texttt{(BTTBTBTBTB)TTTTTTT} \]

他可以一路猛操作变成:

\[\texttt{(TBBTBTBTBT)TTTTTTT} \]

我吗,蠢蠢地使用了暴力,然后喜提 \(2\mathcal{WA}+4\mathcal{TLE}\)。加个记忆化,喜提 \(2\mathcal{WA}\)。

两次的翻车记录在这里:4TLE+2WA2WA

为什么呢?因为这个样例:\(1 \texttt{B}\),要特判一下。(大概也只有我会漏掉这个样例的情况吧,悲。)

\(\mathcal{AC} \texttt{CODE}\):

#include <bits/stdc++.h>
using namespace std;

int T,n,cnt;
struct Node {
	int l,r,mm;
	Node(int L=0,int R=0,int m=0) {
		l=L,r=R,mm=m;
		return ;
	}
	friend bool operator <(const Node a,const Node b) {
		return a.mm>b.mm;
	}
};
const int MS=100005;
Node node[MS];
char s[MS];
int pr[MS][2];
bool GO(int p,int drct) {
	if(p<1||p>n-1) return 0;
	if(pr[p][drct-1]!=-1) return pr[p][drct-1];
	if(drct&1) {
		if(p>2&&s[p]=='B'&&s[p-1]=='T'&&s[p-2]=='T'&&s[p-3]=='B') return pr[p][drct-1]=true;
		if(s[p]=='B'&&s[p-1]=='T') return pr[p][drct-1]=GO(p-2,drct);
	}
	else {
		if(p<n-3&&s[p]=='B'&&s[p+1]=='T'&&s[p+2]=='T'&&s[p+3]=='B') return pr[p][drct-1]=true;
		if(s[p]=='B'&&s[p+1]=='T') return pr[p][drct-1]=GO(p+2,drct);
	}
	return pr[p][drct-1]=false;
}

int main() {
	scanf("%d",&T);
	while(T--) {
		memset(pr,-1,sizeof(pr));
		scanf("%d%s",&n,s);
		int l=-1;
		cnt=0;
		for(int i=0;i<n;i++) {
			if(s[i]=='B'&&l>=0) node[++cnt]=Node(l,i-1,i-l),l=-1;
			if(s[i]=='T'&&l<0) l=i;
		}
		if(l>=0) node[++cnt]=Node(l,n-1,n-l);
		if(cnt==0) {
			printf("0\n");
			continue;
		}
		sort(node+1,node+1+cnt);
		int ans=node[1].mm;
		for(int i=1;i<=cnt&&node[i].mm>=ans-1;i++) {
			if(GO(node[i].l-1,1)) node[i].mm++;
			if(GO(node[i].r+1,2)) node[i].mm++;
			ans=max(ans,node[i].mm);
		}
		printf("%d\n",ans);
	}
	return 0;
}

为什么辣么简单的暴力题要切两个半小时呢?因为我一直往 DP 和暴搜上考虑,浪费了两个小时。警钟长鸣。

标签:node,int,题解,texttt,Break,mm,Through,ans,drct
From: https://www.cnblogs.com/TimelessWelkinBlog/p/17644484.html

相关文章

  • P1345 [USACO5.4] 奶牛的电信Telecowmunication 题解
    P1345[USACO5.4]奶牛的电信Telecowmunication题目描述农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流。这些机器用如下的方式发送电邮:如果存在一个由\(c\)台电脑组成的序列\(a_1,a_2,\cdots,a_c\),且\(a_1\)与\(a_2\)相连,\(a_2\)与......
  • P9556 [SDCPC2023] A-Orders 题解
    题目传送门一道模拟题。可以命名一个订单的结构体,然后将订单的结束时间进行排序。用一个变量模拟货物的数量,每遇到一个订单,货物的数量就会加上距离上一个订单的天数乘上\(k\)。即对于第\(i\)个订单,距离第\(i-1\)订单货物数量增加了\((a_{i}-a_{i-1})\timesk\)。如果在模......
  • CSP模拟赛题解
    目录CSP模拟16T1:糖果CSP模拟17T1:弹珠游戏T2:晚会CSP模拟18T1:TheThirdLetterT2:InaoftheMountainCSP模拟19T1:StrangeFunctionT2:DZYLovesModificationCSP模拟21T1:[CEOI2016]kangarooT2:[JOI2023Final]Advertisement2T3:YourCSP模拟22T1:TheChildandToyCSP模拟16T1:......
  • JS习题解析
    1、页面有一个id为button1的按钮,如何通过原生的js禁用?(IE考虑IE8.0以上版本)A、document.getElementById("button1").readonly=true;B、document.getElementById("button1").setAttribute('readonly','true');C、document.getElementById("button1&quo......
  • 题解 Cow and Snacks
    被黄题创死了2333题目链接首先肯定有一个贪心的想法:尽量使得人们拿的花重复,即尽量使得每个人都拿一束花。当然第一个人必须拿两束。接着思考:如何找出有几个人是必须拿两束花的。其实很简单,当\(A,B\)两人不能通过其他人使得他们的花有联系,比如\(A\)喜欢\(1,2\),\(B\)喜欢......
  • 8.20题解
    T1sun暴力枚举即可时间复杂度分析:\((lnx)'=\frac{1}{x}\)根据牛顿-莱布尼茨公式可得:\(\sum_{x=1}^{n}{\frac{1}{x}}=\int_{1}^{n}{\frac{1}{x}}=ln(n)-ln{1}=ln(n)\)令\(ln(n)=k\)可得:\(n=e^{k}<=e^{15}\approx3269017\)T2order首先需要理解题意......
  • CF1656D K-good 题解
    CF1656DK-good题解题目大意给出\(t\)个整数\(n\),对于每一个\(n\)找出一个大于等于\(2\)的整数\(k\),使得\(n\)可以表示成\(k\)个mod\(k\)的结果互不相同的正整数之和。\(1\let\le10^5,2\len\le10^{18}\)。题解我们先将题意再次化简,可以得到,我们实际......
  • P9571 Horizon Blue 题解
    P9571HorizonBlue题解这个题拿平衡树写是不是小题大做了咳咳咳进入正题。首先转化一下题意。第一个操作是加入直线,第二个操作就是求所有斜率不等于\(k\)的直线的数量,第三个操作就是删掉所有斜率不等于\(k\)的和所有与该直线重合的直线。感觉这题完全就是FHQ_Treap的......
  • P9572 Colorful Days♪ 题解
    原题链接题目大意:有两个数组\(S\),\(T\),你可以把\(S\)进行复制并接到其后面形成\(S^k\),如\(S\)=123,则\(S^2\)=123123,\(S^3\)=123123123。让你求出\(S^k\)与\(T\)的最长公共子序列以及在最长公共子序列最长时\(k\)的最小值。首先思考如果无视\(k\)最小的要求,最......
  • P4197 Peaks 题解
    P4197Peaks题解题目描述在Bytemountains有\(n\)座山峰,每座山峰有他的高度\(h_i\)。有些山峰之间有双向道路相连,共\(m\)条路径,每条路径有一个困难值,这个值越大表示越难走。现在有\(q\)组询问,每组询问询问从点\(v\)开始只经过困难值小于等于\(x\)的路径所能到达的......