又寄了
T1 又是诈骗题,从n到1依次拆分即可,若k大于s[n-2]就将指针移动到n-1,然后k-=lenth(s[n-2]),否则移动到n-2,k值不变。直到k小于3就能直接得出答案。
T2 我原来用的dfs和bfs结合搞出来的奇葩搜索,时间复杂度是对的,然而赛时没调出来(学长的数据生成程序是从0开始读的我没注意导致炸了),然后ntscz再次吞了我的代码,由于太长久没再搞了,直接按正解来打了。
LuoguP2575
这题时博弈论,虽然题目看上去很奇怪,但实际上还是套Nim的模型,但是转换有点麻烦。我是在经(kan)过(le)思(ti)考(jie)后意思到可以将期转换成石子将空位转换成堆与堆之间的空隙的。然后就是快乐Nim了。
附上代码
#include<bits/stdc++.h>
using namespace std;
int t,n,m,a[1005],p,b[1005],num,sum;
int main()
{
cin>>t;
for(int ii=1;ii<=t;ii++)
{
cin>>n;
p=0;
for(int i=1;i<=n;i++)
{
cin>>m;
for(int j=0;j<=20;j++)
{
b[j]=0;
}
for(int j=1;j<=m;j++)
{
cin>>a[j];
b[a[j]]=1;
// cout<<a[j]<<" - "<<b[a[j]]<<endl;
}
sum=0;
num=0;
// cout<<" -- "<<b[19]<<endl;
for(int j=20;j>=0;j--)
{
if(b[j]==0&&sum!=0)
{
p^=sum;
sum=0;
num^=1;
}
else
{
if(b[j]==0)
{
num^=1;
}
else
if(num!=0)
{
sum++;
}
}/*
if(!b[j])
{
if(sum)
{
p^=sum;
sum=0;
}
num^=1;
}
else
{
if(num)
{
sum++;
}
}*/
// cout<<num<<" - "<<sum<<" "<<j<<" "<<b[j]<<endl;
}
if(sum!=0)
{
p^=sum;
}
}
// cout<<"D "<<p<<endl;
if(p==0)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
}
Good luck!