Codeforces Round #632 (Div. 2)

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;
}
原文地址:https://www.cnblogs.com/neflibata/p/12871757.html