CF2094CDE题解

C

题解:CF2094C Brr Brrr Patapim - 洛谷专栏 (luogu.com.cn)
我们只需要看边上的,然后看看边上哪个没有先输出哪个,然后从 (1,1) 点开始,先往左到头这一排是 2n+1 的,然后再往下这一排是 n+12n 的。

#include<bits/stdc++.h>
using namespace std;
const int N=805;
int t,n,a[N][N];
bool vis[2*N];
int main()
{
	cin>>t;
	while(t--)
	{
		memset(vis,0,sizeof(vis));
		cin>>n;
		for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j) cin>>a[i][j];
		for(int i=1;i<=n;++i) vis[a[1][i]]=1;
		for(int i=2;i<=n;++i) vis[a[i][n]]=1;
		for(int i=1;i<=2*n;++i)
		if(!vis[i])
		{
			cout<<i<<" ";
			break;
		}
		for(int i=1;i<=n;++i) cout<<a[1][i]<<" ";
		for(int i=2;i<=n;++i) cout<<a[i][n]<<" ";
		cout<<"\n";
	}
	return 0;
}

D

题解:CF2094D Tung Tung Sahur - 洛谷专栏 (luogu.com.cn)
如果他们的第一个音符不同,肯定不对。

然后统计出,这些串有几段,把每段音符个数计入下来。

如果段数不同不合法。

然后枚举每一段如果实际比弹得少不合法,如果如果实际比弹的两倍多也不合法。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int t,cnt,cntx,cnty,X[N],Y[N];
string s,p;
int main()
{
	cin>>t;
	while(t--)
	{
		cntx=cnty=0;
		cin>>s>>p;
		if(s[0]!=p[0])
		{
			cout<<"NO\n";
			continue;
		}
		for(int i=0;i<=p.size();++i) X[i]=Y[i]=0;
		cnt=1;
		for(int i=1;i<s.size();++i)
		{
			if(s[i]!=s[i-1])
			{
				X[++cntx]=cnt;
				cnt=1;
			}
			else cnt++;
		}
		X[++cntx]=cnt;
		cnt=1;
		for(int i=1;i<p.size();++i)
		{
			if(p[i]!=p[i-1])
			{
				Y[++cnty]=cnt;
				cnt=1;
			}
			else cnt++;
		}
		Y[++cnty]=cnt;
		if(cntx!=cnty)
		{
			cout<<"NO\n";
			continue;
		}
		bool flag=1;
		for(int i=1;i<=cntx;++i)
		{
			if(Y[i]<X[i])
			{
				flag=0;
				cout<<"NO\n";
				break;
			}
			if(Y[i]>X[i]*2)
			{
				flag=0;
				cout<<"NO\n";
				break;
			}
		}
		if(flag) cout<<"YES\n";
	}
	return 0;
}

E

题解:CF2094E Boneca Ambalabu - 洛谷专栏 (luogu.com.cn)
首先将这些数转化成二进制,然后遍历每一个数,枚举每一个二进制位,先看自己这一位是几,如果是 1,那么看有几个 0,如果是 0,那么看有几个 1

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int t,n,Max,ans,a[N],sum[35][2];
signed main()
{
	cin>>t;
	while(t--)
	{
		Max=0;
		memset(sum,0,sizeof(sum));
		cin>>n;
		for(int i=1;i<=n;++i)
		{
			cin>>a[i];
			int x=a[i],cnt=0;
			for(int j=0;j<32;++j)//转二进制
			{
				sum[cnt++][x%2]++;//统计这一位几个0,几个1
				x/=2;
			}
		}
		for(int i=1;i<=n;++i)
		{
			ans=0;
			for(int j=0;j<32;++j)
			{
				if((1<<j)&a[i]) ans+=sum[j][0]*(1<<j);
				else ans+=sum[j][1]*(1<<j);
			}
			Max=max(Max,ans);
		}
		cout<<Max<<"\n";
	}
	return 0;
}
2 个赞

摩拜

%%%%orz

jhd dalao orz%%%

mod