P11838 [USACO25FEB] Printing Sequences B题解
题目描述
Bessie 正在学习使用一种简单的编程语言进行编程。她首先定义一个合法的程序,然后执行该程序以产生一些输出序列。
定义:
一个程序是一个非空的语句序列。
一个语句的形式或者是 "PRINT c",其中 c 是一个整数,或者是 "REP o",随后是一个程序,随后是 "END",其中 o 是一个不小于 1 的整数。
执行:
执行一个程序将依次执行其语句。
执行语句 "PRINT c" 将使 c 追加到输出序列中。
执行以 "REP o" 开始的语句将依次执行内部程序共 o 次。
Bessie 知道如何编写的一个程序示例如下。
REP 3
PRINT 1
REP 2
PRINT 2
END
END
该程序输出序列 [1,2,2,1,2,2,1,2,2]。
Bessie 想要输出一个包含 N(1≤N≤100)个正整数的序列。Elsie 挑战她使用不超过 K(1≤K≤3)个 "PRINT" 语句。注意,Bessie 可以使用任意数量的 "REP" 语句。同时注意,序列中的每个正整数都不超过 K。
对于 T(1≤T≤100)个独立的测试用例中的每一个,求 Bessie 是否可以编写一个程序,使用至多 K 个 "PRINT" 语句输出给定的序列。
输入格式
输入的第一行包含 T。
每一个测试用例的第一行包含空格分隔的两个整数 N 和 K。
每一个测试用例的第二行包含一个由 N 个空格分隔的正整数组成的序列,每个数都不超过 K,为 Bessie 想要产生的序列。
输出格式
对于每一个测试用例输出一行,包含 "YES" 或 "NO"(大小写敏感)。
输入输出样例
输入 #1复制
2 1 1 1 4 1 1 1 1 1
输出 #1复制
YES YES
输入 #2复制
11 4 2 1 2 2 2 4 2 1 1 2 1 4 2 1 1 2 2 6 2 1 1 2 2 1 1 10 2 1 1 1 2 2 1 1 1 2 2 8 3 3 3 1 2 2 1 2 2 9 3 1 1 2 2 2 3 3 3 3 16 3 2 2 3 2 2 3 1 1 2 2 3 2 2 3 1 1 24 3 1 1 2 2 3 3 3 2 2 3 3 3 1 1 2 2 3 3 3 2 2 3 3 3 9 3 1 2 2 1 3 3 1 2 2 6 3 1 2 1 2 2 3
输出 #2复制
YES NO YES NO YES YES YES YES YES NO NO
说明/提示
样例 1 解释:
对于第二个测试用例,以下代码使用了 1 个 "PRINT" 语句输出了序列 [1,1,1,1]。
REP 4
PRINT 1
END
样例 2 解释:
对于第一个测试用例,以下代码使用了 2 个 "PRINT" 语句输出了序列 [1,2,2,2]。
PRINT 1
REP 3
PRINT 2
END
对于第二个测试用例,答案是 "NO",因为使用不超过 2 个 "PRINT" 语句输出序列 [1,1,2,1] 是不可能的。
对于第六个测试用例,以下代码使用了 3 个 "PRINT" 语句输出了序列 [3,3,1,2,2,1,2,2]。
REP 2
PRINT 3
END
REP 2
PRINT 1
REP 2
PRINT 2
END
END
- 测试点 3:K=1。
- 测试点 4∼7:K≤2。
- 测试点 8∼13:没有额外限制。
思路
分类讨论即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long t,n,k,a[105],b[555],d[555],c[105],a1=0,a2=0,a3=0,rs=0,bn=0,ck[105],ck2[105],ck3[105],ckur=0;
int main(){
cin>>t;
while(t--){
cin>>n>>k;
b[1]=b[2]=b[3]=0;
d[1]=d[2]=d[3]=0;
for(int i=1;i<=n;i++){
cin>>a[i];
b[a[i]]++;
d[a[i]]=1;
}
a1=0;
a2=0;
a3=0;
rs=0;
if(k==1||d[1]+d[2]+d[3]==1){
if(d[1]+d[2]+d[3]==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
else if(k==2){
if(a[1]==1){
for(int i=1;i<=n;i++){
if(a[i]!=1){
a1=i-1;
break;
}
}
for(int i=a1+1;i<=n;i++){
if(a[i]!=2){
a2=i-1-a1;
break;
}
if(i==n) a2=n-a1;
}
//cout<<a1+a2<<endl;
if(n%(a1+a2)!=0){
cout<<"NO"<<endl;
}
else{
for(int i=a1+a2+1;i<=n;i+=(a1+a2)){
for(int j=i;j<=i+a1-1;j++){
if(a[j]!=1){
rs=1;
}
}
for(int j=i+a1;j<=i+a1+a2-1;j++){
if(a[j]!=2){
rs=1;
}
}
}
if(rs==1){
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
}
else{
for(int i=1;i<=n;i++){
if(a[i]!=2){
a1=i-1;
break;
}
}
for(int i=a1+1;i<=n;i++){
if(a[i]!=1){
a2=i-1-a1;
break;
}
if(i==n) a2=n-a1;
}
if(n%(a1+a2)!=0){
cout<<"NO"<<endl;
}
else{
for(int i=a1+a2+1;i<=n;i+=(a1+a2)){
for(int j=i;j<=i+a1-1;j++){
if(a[j]!=2){
rs=1;
//cout<<j<<endl;
}
}
for(int j=i+a1;j<=i+a1+a2-1;j++){
if(a[j]!=1){
rs=1;
//cout<<j<<endl;
}
}
}
if(rs==1){
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
}
}
else{
if(d[1]+d[2]+d[3]==3){
long long djsk=0;
ckur=0;
for(int i=1;i<=n;i++){
if(i!=1&&a[i]!=a[i-1]){
ck[ckur+1]=i-1-ck3[ckur];
ck2[++ckur]=a[i-1];
ck3[ckur]=i-1;
}
}
ck[ckur+1]=n-ck3[ckur];
ck2[++ckur]=a[n];
ck3[ckur]=n;
//cout<<ckur<<endl;
if(ckur%2==1){
for(int i=5;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
djsk=1;
//cout<<1432435<<endl;
break;
}
}
for(int i=4;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
djsk=1;
//cout<<6432435<<endl;
break;
}
}
}
else{
djsk=1;
}
//cout<<djsk<<endl;
if(djsk==0){
cout<<"YES"<<endl;
}
if(djsk==1){
djsk=0;
ckur=0;
for(int i=1;i<=n;i++){
if(i!=1&&a[i]!=a[i-1]){
ck[ckur+1]=i-1-ck3[ckur];
ck2[++ckur]=a[i-1];
ck3[ckur]=i-1;
}
}
ck[ckur+1]=n-ck3[ckur];
ck2[++ckur]=a[n];
ck3[ckur]=n;
if(ckur%2==1){
for(int i=3;i<=ckur-1;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
djsk=1;
break;
}
}
for(int i=4;i<=ckur-1;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
djsk=1;
break;
}
}
}
else{
djsk=1;
}
//cout<<ckur<<endl;
if(djsk==0){
cout<<"YES"<<endl;
}
}
if(djsk==1){
djsk=0;
ckur=0;
for(int i=1;i<=n;i++){
if(i!=1&&a[i]!=a[i-1]){
ck[ckur+1]=i-1-ck3[ckur];
ck2[++ckur]=a[i-1];
ck3[ckur]=i-1;
}
}
ck[ckur+1]=n-ck3[ckur];
ck2[++ckur]=a[n];
ck3[ckur]=n;
long long t21=0,t22=0,t23=0;
//cout<<ckur<<endl;
for(int i=3;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
t21=i/2;
break;
}
if(i==ckur+ckur%2-1){
t21=(i+2)/2;
}
}
for(int i=4;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
t22=(i-1)/2;
break;
}
if(i==ckur-ckur%2){
t22=(i+1)/2;
}
}
//cout<<t21<<" "<<t22<<endl;
if(t21!=t22||ckur%(t21*2+1)!=0){
djsk=1;
}
else{
for(int i=t21*2+2;i<=ckur;i++){
if(ck2[i]!=ck2[i-(t21*2+1)]||ck[i]!=ck[i-(t21*2+1)]){
djsk=1;
//cout<<i<<endl;
break;
}
}
}
//cout<<djsk<<endl;
if(djsk==0){
cout<<"YES"<<endl;
}
}
if(djsk==1){
djsk=0;
ckur=0;
for(int i=1;i<=n;i++){
if(i!=1&&a[i]!=a[i-1]){
ck[ckur+1]=i-1-ck3[ckur];
ck2[++ckur]=a[i-1];
ck3[ckur]=i-1;
}
}
ck[ckur+1]=n-ck3[ckur];
ck2[++ckur]=a[n];
ck3[ckur]=n;
long long t21=0,t22=0,t23=0;
//cout<<ckur<<endl;
for(int i=4;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
t21=(i-1)/2;
break;
}
if(i==ckur-ckur%2){
t21=(i+1)/2;
}
}
for(int i=5;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
t22=(i-2)/2;
break;
}
if(i==ckur+ckur%2-1){
t21=(i)/2;
}
}
if(t21!=t22||ckur%(t21*2+1)!=0){
djsk=1;
}
else{
for(int i=t21*2+2;i<=ckur;i++){
if(ck2[i]!=ck2[i-(t21*2+1)]||ck[i]!=ck[i-(t21*2+1)]){
djsk=1;
//cout<<i<<endl;
break;
}
}
}
//cout<<djsk<<endl;
if(djsk==0){
cout<<"YES"<<endl;
}
}
if(djsk==1){
cout<<"NO"<<endl;
}
}
if(d[1]+d[2]+d[3]==2){
long long djsk=0;
if(d[3]==1){
if(d[2]==0){
d[3]=0;
d[2]=1;
b[2]=b[3];
b[3]=0;
for(int i=1;i<=n;i++){
if(a[i]==3){
a[i]=2;
}
}
}
if(d[1]==0){
d[3]=0;
d[1]=1;
b[1]=b[3];
b[3]=0;
for(int i=1;i<=n;i++){
if(a[i]==3){
a[i]=1;
}
}
}
}
//cout<<14257457<<endl;
long long fg=0;
// for(int i=1;i<=n;i++){
// cout<<a[i]<<" ";
// }
//cout<<endl;
if(a[1]==1){
for(int i=1;i<=n;i++){
if(a[i]!=1){
a1=i-1;
break;
}
}
for(int i=a1+1;i<=n;i++){
if(a[i]!=2){
a2=i-1-a1;
break;
}
if(i==n) a2=n-a1;
}
//cout<<a1+a2<<endl;
if(n%(a1+a2)!=0){
fg=1;
}
else{
for(int i=a1+a2+1;i<=n;i+=(a1+a2)){
for(int j=i;j<=i+a1-1;j++){
if(a[j]!=1){
fg=1;
}
}
for(int j=i+a1;j<=i+a1+a2-1;j++){
if(a[j]!=2){
fg=1;
}
}
}
if(fg==0){
cout<<"YES"<<endl;
}
}
}
else{
for(int i=1;i<=n;i++){
if(a[i]!=2){
a1=i-1;
break;
}
}
for(int i=a1+1;i<=n;i++){
if(a[i]!=1){
a2=i-1-a1;
break;
}
if(i==n) a2=n-a1;
}
if(n%(a1+a2)!=0){
fg=1;
}
else{
for(int i=a1+a2+1;i<=n;i+=(a1+a2)){
for(int j=i;j<=i+a1-1;j++){
if(a[j]!=2){
fg=1;
//cout<<j<<endl;
}
}
for(int j=i+a1;j<=i+a1+a2-1;j++){
if(a[j]!=1){
fg=1;
//cout<<j<<endl;
}
}
}
if(fg==0){
cout<<"YES"<<endl;
}
}
}
//cout<<2222222222<<endl;
long long rs2=0;
if(fg==1){
djsk=0;
ckur=0;
for(int i=1;i<=n;i++){
if(i!=1&&a[i]!=a[i-1]){
ck[ckur+1]=i-1-ck3[ckur];
ck2[++ckur]=a[i-1];
ck3[ckur]=i-1;
}
}
ck[ckur+1]=n-ck3[ckur];
ck2[++ckur]=a[n];
ck3[ckur]=n;
long long t21=0,t22=0,t23=0;
//cout<<ckur<<endl;
for(int i=3;i<=ckur-1;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
djsk=1;
break;
}
}
for(int i=4;i<=ckur-1;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
djsk=1;
break;
}
}
if(ck[ckur]<ck[ckur-2]&&ckur%2==0){
djsk=1;
}
//cout<<djsk<<endl;
if(djsk==0){
cout<<"YES"<<endl;
}
}
//long long djsk=0;
//cout<<11111111<<endl;
if(djsk==1&&fg==1){
djsk=0;
ckur=0;
for(int i=1;i<=n;i++){
if(i!=1&&a[i]!=a[i-1]){
ck[ckur+1]=i-1-ck3[ckur];
ck2[++ckur]=a[i-1];
ck3[ckur]=i-1;
}
}
ck[ckur+1]=n-ck3[ckur];
ck2[++ckur]=a[n];
ck3[ckur]=n;
for(int i=5;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
djsk=1;
break;
}
}
for(int i=4;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
djsk=1;
break;
}
}
if(ck[1]<ck[3]&&ckur%2==0){
djsk=1;
}
//cout<<ckur<<endl;
if(djsk==0){
cout<<"YES"<<endl;
}
}
if(djsk==1&&fg==1){
djsk=0;
ckur=0;
for(int i=1;i<=n;i++){
if(i!=1&&a[i]!=a[i-1]){
ck[ckur+1]=i-1-ck3[ckur];
ck2[++ckur]=a[i-1];
ck3[ckur]=i-1;
}
}
ck[ckur+1]=n-ck3[ckur];
ck2[++ckur]=a[n];
ck3[ckur]=n;
long long t21=0,t22=0,t23=0,t24=0;
//cout<<ckur<<endl;
for(int i=3;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
t21=i/2;
break;
}
if(i==ckur+ckur%2-1){
t21=(i+2)/2;
}
}
for(int i=4;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
t22=(i-1)/2;
break;
}
if(i==ckur-ckur%2){
t22=(i+1)/2;
}
}
if(t21!=0&&t22!=0){
if(t22>=t21+1){
t22=t21;
t24=t21*ck[1]+t22*ck[2]+ck[t21*2+1]-ck[t21*2-1];
}
if(t21>=t22+1){
t21=t22+1;
t22++;
t24=t21*ck[1]+t22*ck[2]+ck[t22*2]-ck[t22*2-2];
}
}
//cout<<t21<<" "<<t22<<endl;
if(t24==0||n%t24!=0||t22==0||t21==0){
djsk=1;
}
else{
for(int i=t24+1;i<=n;i++){
if(a[i]!=a[i-t24]){
djsk=1;
//cout<<i<<endl;
break;
}
}
}
//cout<<djsk<<endl;
if(djsk==0){
cout<<"YES"<<endl;
}
}
if(djsk==1&&fg==1){
djsk=0;
ckur=0;
for(int i=1;i<=n;i++){
if(i!=1&&a[i]!=a[i-1]){
ck[ckur+1]=i-1-ck3[ckur];
ck2[++ckur]=a[i-1];
ck3[ckur]=i-1;
}
}
ck[ckur+1]=n-ck3[ckur];
ck2[++ckur]=a[n];
ck3[ckur]=n;
long long t21=0,t22=0,t23=0,t24=0;
//cout<<ckur<<endl;
for(int i=5;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
t21=(i-2)/2;
break;
}
if(i==ckur+ckur%2-1){
t21=(i)/2;
}
}
for(int i=4;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
t22=(i-1)/2;
break;
}
if(i==ckur-ckur%2){
t22=(i+1)/2;
}
}
if(t21!=0&&t22!=0){
if(t22>=t21+1){
t22=t21+1;
t21++;
t24=t21*ck[3]+t22*ck[2]+ck[t21*2+1]-ck[t21*2-1];
}
}
//cout<<t21<<" "<<t22<<endl;
if(t24==0||n%t24!=0||t22==0||t21==0){
djsk=1;
}
else{
for(int i=t24+1;i<=n;i++){
if(a[i]!=a[i-t24]){
djsk=1;
//cout<<i<<endl;
break;
}
}
}
//cout<<djsk<<endl;
if(djsk==0){
cout<<"YES"<<endl;
}
}
if(djsk==1&&fg==1){
djsk=0;
ckur=0;
for(int i=1;i<=n;i++){
if(i!=1&&a[i]!=a[i-1]){
ck[ckur+1]=i-1-ck3[ckur];
ck2[++ckur]=a[i-1];
ck3[ckur]=i-1;
}
}
ck[ckur+1]=n-ck3[ckur];
ck2[++ckur]=a[n];
ck3[ckur]=n;
long long t21=0,t22=0,t23=0,t24=0;
//cout<<ckur<<endl;
for(int i=5;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
t21=(i-2)/2;
break;
}
if(i==ckur+ckur%2-1){
t21=(i)/2;
}
}
for(int i=4;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
t22=(i-1)/2;
break;
}
if(i==ckur-ckur%2){
t22=(i+1)/2;
}
}
if(t21!=0&&t22!=0){
if(t22>=t21+1){
t22=t21+1;
t21++;
t24=t21*ck[3]+t22*ck[2]+ck[t21*2+1]-ck[t21*2-1];
}
}
//cout<<t21<<" "<<t22<<endl;
if(t24==0||n%t24!=0||t22==0||t21==0){
djsk=1;
}
else{
for(int i=t24+1;i<=n;i++){
if(a[i]!=a[i-t24]){
djsk=1;
//cout<<i<<endl;
break;
}
}
}
//cout<<djsk<<endl;
if(djsk==0){
cout<<"YES"<<endl;
}
}
if(djsk==1&&fg==1){
djsk=0;
ckur=0;
for(int i=1;i<=n;i++){
if(i!=1&&a[i]!=a[i-1]){
ck[ckur+1]=i-1-ck3[ckur];
ck2[++ckur]=a[i-1];
ck3[ckur]=i-1;
}
}
ck[ckur+1]=n-ck3[ckur];
ck2[++ckur]=a[n];
ck3[ckur]=n;
if(a[1]==a[n]){
ck[1]+=ck[ckur];
ckur--;
if(ckur%2==0){
for(int i=3;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
djsk=1;
break;
}
}
for(int i=4;i<=ckur;i+=2){
if(ck2[i]!=ck2[i-2]||ck[i]!=ck[i-2]){
djsk=1;
break;
}
}
}
else{
djsk=1;
}
}
else{
djsk=1;
}
if(djsk==1){
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
}
}
}
return 0;
}

浙公网安备 33010602011771号