【洛谷T89353 【BIO】RGB三角形】
这个题我一开始显然直接暴力
然后30分(但是应用数据分治的我通过复杂度判断并且其余输出0的能力硬生生的拿下了60分)
主要还是讲正解
这里有一个结论
这样一个图,红点的值可以通过两个黄点来判断
我们有数学归纳法可以推广到3k+1
这样我们就可以用类似于LCA的倍增思想写出代码
#include<cstdio> #include<iostream> #include<queue> #include<cstring> using namespace std; inline int read() { int ans=0; char last=' ',ch=getchar(); while(ch>'9'||ch<'0') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } int n,l; char a[10000010]; int three[15]= {2,4,10,28,82,244,730,2188,6562,19684,59050,177148,531442,1594324,4782970}; int main() { n=read(); scanf("%s",a+1); int len=strlen(a+1); while(len>0) { for(int i=14; i>=0; i--) if(three[i]<=len) { l=three[i]; break; } for(int i=1; i<=len-l+1; i++) { if(a[i]==a[i+l-1]) continue; if(a[i]=='B'&&a[i+l-1]=='G') { a[i]='R'; continue; } if(a[i]=='B'&&a[i+l-1]=='R') { a[i]='G'; continue; } if(a[i]=='G'&&a[i+l-1]=='B') { a[i]='R'; continue; } if(a[i]=='G'&&a[i+l-1]=='R') { a[i]='B'; continue; } if(a[i]=='R'&&a[i+l-1]=='B') { a[i]='G'; continue; } if(a[i]=='R'&&a[i+l-1]=='G') { a[i]='B'; continue; } } len=len-l+1; } printf("%c",a[1]); }