The Third Three Number Problem:
题意:
给你一个n,让你求满足的a,b,c
解:
- 显然任意a,b,c是不可能得到奇数
- 只考虑偶数可以得到一个特殊构造 n/2 , 0 , 0
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int n;
int t;
void solve()
{
if(n%2)
cout<<-1;
else
cout<<"0 0 "<<n/2;
cout<<endl;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n;
solve();
}
return 0;
}
B - Almost Ternary Matrix
题意:构造01矩阵,要求没个位置的相邻位置(上,下,左,右)有且只有2个相同。
解:
将该图形作为基本单位进行扩展
代码:
#include<bits/stdc++.h>
using namespace std;
int t;
int n,m;
const int N=60;
int e[N][N];
int main()
{
cin>>t;
e[1][1]=1,e[1][4]=1,e[4][1]=1,e[4][4]=1;
e[2][2]=1,e[2][3]=1,e[3][2]=1,e[3][3]=1;
while(t--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int tx=i%4;
if(!tx)
tx=4;
int ty=j%4;
if(!ty)
ty=4;
e[i][j]=e[tx][ty];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<e[i][j]<<" ";
cout<<endl;
}
}
return 0;
}
**
C - The Third Problem
**
题意:给定一个数组,内容是0~n-1,定义集合MEX{a1,a2,a3,…,an}为:该集合中没有出现的最小非负整数。
求一个整数集合bn,内容也是0~n-1,对任意[l,r]都有 MEX{al,al+1,al+2…br}=MEX{bl,bl+1,bl+2,…br};
解:
设F[i]:数i出现的位置
设是F[x]为 x 在a 中的位置
首先考虑0的位置,因为MEX[0]=1,所以0的位置只能是F[0],可以确定1的位置为s[1]。
接下来确定 2~n-1的方法相同,以 0 和 1 的索引确定区间 [L, R],如果下一个 数x 的索在入区间 [L, R],则更新ans为((区间长度)-(x-1))*ans, 如果 k 的索引位于区间之外则更新L或R增加区间长度。
代码:
#include<bits/stdc++.h>
using namespace std;
int t;
int n;
const int N=1e5+11;
typedef long long ll;
const int mod=1e9+7;
int e[N];
int f[N];
void solve()
{
int l=f[0],r=f[0];
ll ans=1;
for(int i=1;i<n;i++)
{
if(f[i]>r)
r=f[i];
else if(f[i]<l)
l=f[i];
else
ans=ans*(r-l+1-i)%mod;
}
cout<<ans<<endl;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>e[i];
f[e[i]]=i;
}
solve();
}
}
mood: