A 点(1,1)填W,其他点全部填B就可以了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;
int t,n,m;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
if(i==1&&j==1) cout<<'W';
else cout<<'B';
cout<<endl;
}
}
return 0;
}
B 每个位置只可以加它前面的数字,所以当bi大于ai前面就需要有1,反之就需要有-1,没有就无法完成。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;
int t,n,m;
int a[N],b[N];
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++) cin>>b[i];
int num[3]={0};
bool flag=1;
for(int i=1;i<=n;i++)
{
if(b[i]>a[i]&&!num[2])
{
flag=0;
break;
}
else if(b[i]<a[i]&&!num[0])
{
flag=0;
break;
}
num[a[i]+1]++;
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
补:
C 如果一个数组的所有非空子数组的和都不为0那么这个数组就称为是好的,
已知一个数组问该数组有多少非空子数组是好的。
我们可以依次枚举每个点,计算以该点为结尾的子数组的数量这样可以做到不重不漏,假设点i之前有一段区间[l,r]的区间和是0,那么好数组就不能包括这个区间,最多只能从l+1到i了,如果有多个区间呢,对l取最值就好了,然后会发现数据范围很大,怎么判断区间和是否为0呢,前缀和就行,如果sum[i]==sum[j]那么区间[i+1,j]的区间和就是0,需要特判sum[0]。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,m;
int a[N],b[N];
ll sum[N];
map<ll,ll> mp;
int main()
{
cin>>n;
ll ans=0,l=0;
mp[0]=1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum[i]=a[i]+sum[i-1];
if(mp[sum[i]]) l=max(l,mp[sum[i]]);
ans+=(i-l);
mp[sum[i]]=i+1;
}
cout<<ans;
return 0;
}