# 题意
多组数据,给定行数n和列数m,对其中单元格进行染色,1为黑色或0为白色,要求相邻0的1的数量是相邻1的0的数量+1,输出染色方案
1 ≤ t ≤ 20
2 ≤ n,m ≤ 100
# 题解
想最极端情况,第一行和第一列染成黑色,其余全白色即可,不需要分类讨论
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 int t; 5 cin>>t; 6 while(t--){ 7 int n,m; 8 cin>>n>>m; 9 for(int i=1;i<=n;i++) { 10 for (int j = 1; j <= m; j++) { 11 if (i == 1 || j == 1) 12 cout << 'B'; 13 else 14 cout << 'W'; 15 } 16 puts(""); 17 } 18 } 19 }
# 题意
多组数据,给定一个n,给定长度为n的数组a,b其中a只由{-1 , 0 , 1}构成,a中可以进行任意次的操作:
对于aj=ai+aj (i < j),若a能变化至b,输出YES否则NO
1 ≤ t ≤ 104
1 ≤ n ≤ 2 · 105
-109 ≤ bi ≤ 109
# 题解
对a分别用p1,p2累计到当前位置的-1、1个数,对b从后往前枚举,枚举到b的时候先把a[i]的值的累计-1,
如果a[i]<b[i],1的个数=0那么直接输出NO,如果a[i]>b[i],-1的个数=0也直接输出NO
第一项前没有任何项,所以第一个不相等直接输出NO
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=2e5+10; 4 int a[N],b[N]; 5 int n; 6 void work(){ 7 cin>>n; 8 int p1=0,p2=0; 9 for(int i=1;i<=n;i++){ 10 cin>>a[i]; 11 if(a[i]==-1) p1++; 12 if(a[i]==1) p2++; 13 } 14 for(int i=1;i<=n;i++) 15 cin>>b[i]; 16 if(a[1]!=b[1]) {puts("NO");return;} 17 for(int i=n;i>1;i--){ 18 if(a[i]==1) p2--; 19 if(a[i]==-1) p1--; 20 if(a[i]>b[i] && p1<=0){ 21 puts("NO"); 22 return; 23 } 24 if(a[i]<b[i] && p2<=0) { 25 puts("NO"); 26 return; 27 } 28 } 29 puts("YES"); 30 } 31 int main(){ 32 int t; 33 cin>>t; 34 while(t--){ 35 work(); 36 } 37 }
# 题意
给定一个长度n的序列,一个序列是好的当他所有的子序列包括自身的子序列和不为0,
例如[2, -2, 2]中只有3个好的序列,即3个长度为1的子序列,长度为2的和都是0,
长度为3所包含的长度为2的子序列中有和为0的。
1 ≤ n ≤ 2 · 105
-109 ≤ ai ≤ 109
# 题解