CFround956

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();
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值