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;
}

posted @ 2025-10-24 20:49  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源