A.Yet Another Tetris Problem
题意:看白了其实就是让你看看是否都为偶数,或者奇数,是的话输出YES,否则输出NO。

#include<bits/stdc++.h>

using namespace std;

int a[105];

int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		int flag = 0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			if(a[i] % 2 == 0) flag++;
		}
		if(flag == n||flag ==0) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
} 

B.Yet Another Palindrome Problem
题意:就是判断是否有至少三个数以上的子数组满足回文串问题。

思路:只要找到两个相同的数,并且之间的距离是大于1,及还能放一个数以上的数,那么就可以找到至少为3的子数组满足题目要求。

#include<bits/stdc++.h>
#define maxn 6005
using namespace std;

int t;
int n;
int a[maxn];
bool  flag;
		
int main(){
	cin>>t;
	while(t--){
		flag =0; 
		cin>>n;
		for(int i=0;i<n;i++)
			cin>>a[i];
			
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(a[j]==a[i]&&j-i>=2){
                    flag=1;
                    break;
                }
            }
            if(flag)  break;
        }


		if(flag) 
		cout<<"YES"<<endl;
		else 
		cout<<"NO"<<endl;
	}
	return 0;
 }

C.其实结合样例看比较好懂一些。就是求相邻R之间得最大距离,其中把开头跟n+1,也当作是R,那么小青蛙就是能一直跳。跳到最后。

#include<bits/stdc++.h>
using namespace std;

string s;
int main(){
    int t;
	cin>>t;
	while(t--)
	{
		cin>>s;
		int res=0,ans=0;
		for(int i=0;i<s.size();i++)
			if(s[i]=='R')
			{
				ans=max(i+1-res,ans);
				res=i+1;
			}
		ans=max(ans,s.size()1-res);
		cout<<ans<<endl;;
	}
	return 0;
 }

D.Pair of Topics
题意:就是对公式进行变形,然后用二分减少复杂度就行了

一开始想了个O(n*n)复杂度得,明知道过不去,却还是试了试。然后就超时卡12了。

代码如下:

#include<bits/stdc++.h>
#define maxn 200005 
using namespace std;
typedef long long ll;

ll a[maxn],b[maxn];
ll c[maxn];
ll d[maxn];


int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	 cin>>a[i];
	for(int i=1;i<=n;i++) 
	 cin>>b[i];
	for(int i=1;i<=n;i++){
		c[i] = a[i]-b[i];
		d[i] = b[i]-a[i];
	}
	int ans = 0;
	for(int i=2;i<=n;i++){
		for(int j=1;j<i;j++){
			if(c[i] > d[j])
			 ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
}

其实之前做过ICPC沈阳A题跟这个十分相似,但是这个是在那个签到提得基础上又稍微增加了点难度,算了,我不配说这话,还是太菜了。

AC代码
思路:就是我们如果变形一下得话就会变成ai-bi>bj-aj;那么首先我们先求得ai-bi得差给存起来,然后得话我们给其进行排序,然后一个for循环,找到第一个大于当前得bj-aj得位置,那么后面得肯定都大于,然后就这样就行了。

#include<bits/stdc++.h>
#define maxn 200005 
using namespace std;
typedef long long ll;

ll a[maxn],b[maxn];
ll c[maxn];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	 cin>>a[i];
	for(int i=1;i<=n;i++)
	 cin>>b[i];
	for(int i=1;i<=n;i++)
	 c[i] = a[i] - b[i];
	sort(c+1,c+n+1);
	ll ans = 0;
	for(int i=1;i<=n;i++){
		ll res = b[i]-a[i];
		ans += (c+n+1)-upper_bound(c+1,c+n+1,res);
		if(res<0) ans--;
		//cout<<ans<<endl;
 	}
 	cout<<ans/2<<endl;
} 

E.