字符串&&dp
罪不可赦,上周两个div都不满意,两个半洛谷字符串
上周做的不好,感觉超级忙
两个考试和竞赛过去了,今天开始补
Div.2
Codeforces Round #752 (Div. 2)B题
周末忙着竞赛抱佛脚,div.2结束了才开始做它时间超级匆忙
题解题过程和题解 别家博客讲得很清楚了
大家可以直接忽略下面我寄己做题的心路历程:
那就话的意思是:(那句话就不放这儿了,少儿英语)
这些相对应子串的最长上升子序列的长度分别是…
读题着急啦,下次长个心眼儿
读懂了可能对我来说也没思路,上一次Div.2还总结了直接找规律的题型,any one(任何一种方式,任何一种输出都可以)这种情况就可以去考虑极端找解(简单易实现)
但这个题没有,它是对最后子串中最长上升子序列的长度进行异或。写到这儿我回去又读了一遍~发现了秘密!
YouKn0wWho wonders if it is possible to split the sequence a in such a way that the bitwise XOR of h1,h2,…,hk is equal to 0. You have to tell whether it is possible.
秘密:in such a way
潜台词:任何方式分离子串都可以,就要能让最后异或结果为0,就是YES
所以我彻悟了 (菜鸟的彻悟就在一瞬间)
Maybe,解题才刚刚开始…
分析:
只要我们要找出0来就输出YES,
再结合异或这个运算,会联系到奇数和偶数的要讨论(一开始不确定没关系,先试试)
那么偶数一定可以分为偶数个1,偶数个1异或一定是0,那么偶数情况一定是YES
奇数一定可以分为奇数个1,异或结果是1,但
一种特殊情况:存在两个相邻的数不递增,将他们放在一组,如(7,6)长度是1不是2。
这样就解决了,就可以用偶数个1异或为0了
#include <iostream>
#define ll long long
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
ll a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
if(n%2==0)
cout<<"YES"<<endl;
else
{
int f=0;
for(int i=1;i<n;i++)
{
if(a[i-1]>=a[i]) {f=1;break;}
}
if(f==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}
其实是从十一点写到了一点钟,这个题我以为会了其实不是超级理解,现在我明白啦!很简单!