B. Corner Twist
这题其实挺巧妙的,你那个mod3,对于每一个数,如果结果加2再mod3其实相当于减一,即x+2=x-1;那么相邻(非对角)就是加1,,若是加1再mod3,同理即x+1=x-2那么意思就是,横着和竖着来,你mod三的值永远是不会变的,既然这样代码就好办了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
int n,m;cin>>n>>m;
string v1[n],v2[n];vector<vector<int>>a1(n+1,vector<int>(m+1));vector<vector<int>>a2(n+1,vector<int>(m+1));
for(int i=0;i<n;i++)
{
cin>>v1[i];//cout<<v1[i];
}
for(int i=0;i<n;i++)
{
cin>>v2[i];
}
vector<int>r1(n+1),r2(n+1),l1(m+1),l2(m+1);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
a1[i][j]=v1[i][j]-'0';//cout<<a1[i][j]<<" ";
a2[i][j]=v2[i][j]-'0';
r1[i]=(r1[i]+a1[i][j])%3;
r2[i]=(r2[i]+a2[i][j])%3;
l1[j]=(l1[j]+a1[i][j])%3;
l2[j]=(l2[j]+a2[i][j])%3;
}
}
int flag=1;
for(int i=0;i<n;i++)
{
if(r1[i]!=r2[i]){flag=0;}
}
for(int j=0;j<m;j++)
{if(l1[j]!=l2[j]){flag=0;}}
cout<<(flag? "YES":"no")<<endl;
}
int main()
{
int t;cin>>t;
while(t--)
{
solve();
}
}
C. Have Your Cake and Eat It Too
纯粹的模拟,分6类,abc,acb,bac,bca,cab,cba.
那就按从a开头的两种,b开头的两种,c开头的两种。其实最大的问题是每次判断的时候都需要重新赋值,而且都要赋值超级大的数,不知道为什么,不这样就会数组越界,一直WA,气死了,WA了十几发。先放代码再这里。ok我有点明白了,请看代码注释
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+6;
typedef long long ll;
void solve()
{
ll n;cin>>n;vector<ll>a(n+10,0);vector<ll>b(n+10,0);vector<ll>c(n+10,0);a[0]=0;b[0]=0;c[0]=0;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
a[i]+=a[i-1];
}
ll k=a[n]/3;
if(a[n]%3)k++;
//cout<<k<<endl;
for(ll i=1;i<=n;i++)
{
cin>>b[i];
b[i]+=b[i-1];
}
for(ll i=1;i<=n;i++)
{
cin>>c[i];
c[i]+=c[i-1];
}
//abc or acb
if(a[n]<k){cout<<-1<<endl;return;}
ll l2=100005,l1=100005,l3=100005;/*为什么要重复设置成指针初值,每次你看l1,l2,l3都是连续使用的,是有概率第一个举例,第一个的第一个for循环,如果到最后也没有>=k
那就直接延续上一个l2到下面的for循环去了。至于为什么设置这么大的数,其实原理还是同上面的,如果设置成0,或1这种,他在第二个for循环就还是
0或者1,那就寄了*/
for(l1=1;l1<n-1;l1++)
{
if(a[l1]>=k)
{
l2=l1+1;
//cout<<1<<" "<<l<<" ";
break;
}
}
//l3=l2;
for(l3=l2;l3<n;l3++)
{
if(b[l3]-b[l2-1]>=k&&c[n]-c[l3]>=k)
{
cout<<1<<" "<<l1<<" "<<l2<<" "<<l3<<" "<<l3+1<<" "<<n<<endl;
return ;
}
if(c[l3]-c[l2-1]>=k&&b[n]-b[l3]>=k)
{
cout<<1<<" "<<l1<<" "<<l3+1<<" "<<n<<" "<<l2<<" "<<l3<<endl;
return ;
}
}
//bac or bca;
l2=100005,l1=100005,l3=100005;//超级重要,不知道为什么,但这是我改变的关键。
for(l1=1;l1<n-1;l1++)
{
if(b[l1]>=k)
{
l2=l1+1;
//cout<<1<<" "<<l<<" ";
break;
}
}
//l3=l2;
for(l3=l2;l3<=n;l3++)
{
if(a[l3]-a[l2-1]>=k&&c[n]-c[l3]>=k)
{
cout<<l1+1<<" "<<l3<<" "<<1<<" "<<l1<<" "<<l3+1<<" "<<n<<endl;
return;
}
if(c[l3]-c[l2-1]>=k&&a[n]-a[l3]>=k)
{
cout<<l3+1<<" "<<n<<" "<<1<<" "<<l1<<" "<<l1+1<<" "<<l3<<endl;
return;
}
}
//cab or cba;
l2=100005,l1=100005,l3=100005;//重要
for(l1=1;l1<n;l1++)
{
if(c[l1]>=k)
{
l2=l1+1;
//cout<<1<<" "<<l<<" ";
break;
}
}
//l3=l2;
for(l3=l2;l3<n;l3++)
{
if(a[l3]-a[l2-1]>=k&&b[n]-b[l3]>=k)
{
cout<<l2<<" "<<l3<<" "<<l3+1<<" "<<n<<" "<<1<<" "<<l1<<endl;
return;
}
if(b[l3]-b[l2-1]>=k&&a[n]-a[l3]>=k)
{
cout<<l3+1<<" "<<n<<" "<<l2<<" "<<l3<<" "<<1<<" "<<l1<<endl;
return;
}
}
cout<<-1<<endl;return;
}
int main()
{
int t;cin>>t;
while(t--)
{
solve();
}
}