codeforce #632 div2
A. Little Artem
多组数据,给定行数\(n\)和列数\(m\),对其中单元格进行染色,1为黑色或0为白色,要求相邻0的1的数量是相邻1的0的数量+1,输出染色方案
想最极端情况,第一行和第一列染成黑色,其余全白色即可,不需要分类讨论
Code
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n, m; cin >> n >> m;
string black_row(m, 'B');
vector<string> result(n, black_row);
result[0][0] = 'W';
for (int i = 0; i < n; ++i) {
cout << result[i] << '\n';
}
}
int main() {
int t; cin >> t;
while(t--) solve();
}
B. Kind Anton
多组数据,给定一个\(n\),给定长度为\(n\)的数组\(a\),\(b\)其中\(a\)只由{-1 , 0 , 1}构成,a中可以进行任意次的操作:
对于\(a_{j} = a_{i}+a_{j} (i < j)\),若\(a\)能变化至\(b\),输出YES否则NO
对\(a\)分别用\(p_{1},p_{2}\)累计到当前位置的-1、1个数,对\(b\)从后往前枚举,枚举到\(b\)的时候先把\(a[i]\)的值的累计-1,
如果\(a[i]<b[i]\),1的个数=0那么直接输出NO,如果\(a[i]>b[i]\),-1的个数=0也直接输出NO
第一项前没有任何项,所以第一个不相等直接输出NO
Code
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N];
int n;
void work(){
cin>>n;
int p1=0,p2=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==-1) p1++;
if(a[i]==1) p2++;
}
for(int i=1;i<=n;i++)
cin>>b[i];
if(a[1]!=b[1]) {puts("NO");return;}
for(int i=n;i>1;i--){
if(a[i]==1) p2--;
if(a[i]==-1) p1--;
if(a[i]>b[i] && p1<=0){
puts("NO");
return;
}
if(a[i]<b[i] && p2<=0) {
puts("NO");
return;
}
}
puts("YES");
}
int main(){
int t;
cin>>t;
while(t--){
work();
}
}
C. Eugene and an array
给定一个长度n的序列,一个序列是好的当他所有的子序列包括自身的子序列和不为0,
例如[2, -2, 2]中只有3个好的序列,即3个长度为1的子序列,长度为2的和都是0,
长度为3所包含的长度为2的子序列中有和为0的。
当\(sum[i]=sum[j]\)时,就必定\(a[i+1]\sim a[j]\)的和为0,所以子序列只能取到内部并且内部不能有为0的,
用map记录每个sum值的最后一次出现的下标+1即为
Code
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
map<ll,ll>m;
int main()
{
int n;
cin>>n;
ll sum=0,x,temp=-1,ans=0;
m[0]=0;
for(ll i=1;i<=n;i++)
{
scanf("%lld",&x);
sum+=x;
if(m.count(sum))//与前面的一个地方前缀和相同
{
temp=max(temp,m[sum]);
}
ans+=i-temp-1;
m[sum]=i;
}
cout<<ans<<endl;
return 0;
}
D. Challenges in school №41
Code
E. Road to 1600
Code
F. Kate and imperfection
Code