Codeforces Round #731 (Div. 3)
Posted zjj0624
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #731 (Div. 3)相关的知识,希望对你有一定的参考价值。
A. Shortest Path with Obstacle
题意
给你三个点,
a
x
,
a
y
,
b
x
,
b
y
,
f
x
,
f
y
a_x,a_y,b_x,b_y,f_x,f_y
ax,ay,bx,by,fx,fy从a点到b点,f点是障碍物,问最少需要多少步。
思路
直接模拟就可以了。
代码
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
int main()
{
int t;
cin>>t;
while(t--)
{
int xa,ya,xb,yb,xf,yf;
cin>>xa>>ya>>xb>>yb>>xf>>yf;
int ans=abs(xa-xb)+abs(ya-yb);
//cout<<xa<<" "<<xb<<" "<<xf<<endl;
if(xa==xb&&xb==xf)
{
int maxx=max(ya,yb);
int minn=min(ya,yb);
if(minn<=yf&&yf<=maxx) ans+=2;
}
if(ya==yb&&yb==yf)
{
int maxx=max(xa,xb);
int minn=min(xa,xb);
if(minn<=xf&&xf<=maxx) ans+=2;
}
cout<<ans<<endl;
}
return 0;
}
B - Alphabetical Strings
题意
给你一个字符串,让你判断是不是由题目中的条件拼接出来的。
条件:
思路
找到字母a,然后从这个点用两个指针向两边看是否有满足条件的字母。
代码
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
int main()
{
int t;
cin>>t;
while(t--)
{
string s;
cin>>s;
bool flag=true;
int id=-1;
int len=s.length();
for(int i=0 ; i<len ; i++)
if(s[i]=='a')
{
id=i;
break;
}
if(id==-1) flag=false;
if(!flag)
{
cout<<"NO"<<endl;
continue;
}
int l=id-1,r=id+1;
char c='b';
int cnt=1;
while(cnt<len)
{
//cout<<l<<" "<<r<<" "<<c<<endl;
bool flag1=false;
if(l>=0&&l<len)
{
if(s[l]==c)
{
l--,cnt++,c++;
flag1=true;
continue;
}
}
if(r<len&&r>=0)
{
if(s[r]==c)
{
r++,cnt++,c++;
flag1=true;
continue;
}
}
if(!flag1)
{
flag=false;
break;
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
C - Pair Programming
题意
给你两个数组a和b,如果
a
i
=
0
∣
∣
b
i
=
0
a_i=0||b_i=0
ai=0∣∣bi=0是相当于加一行代码,如果
a
i
>
0
或
者
b
i
>
0
a_i>0或者b_i>0
ai>0或者bi>0就表明修改
a
i
或
b
i
a_i或b_i
ai或bi行的代码,但是要确定这一行有代码。
把两个数组拼接在一起,尽量使
a
i
>
0
∣
∣
b
i
>
0
a_i>0||b_i>0
ai>0∣∣bi>0的时候有代码。
思路
让两个数组中为0的排在前面,如果没有0就把两个较小的放在前面。
代码
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
int a[110],b[110],ans[110];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(ans,0,sizeof ans);
int k,n,m;
cin>>k>>n>>m;
for(int i=1 ; i<=n ; i++) cin>>a[i];
for(int i=1 ; i<=m ; i++) cin>>b[i];
int i=1,j=1;
bool flag=true;
for(int z=1 ; z<=n+m ; z++)
{
if(a[i]==0&&i<=n)
{
ans[z]=a[i],i++,k++;
continue;
}
if(b[j]==0&&j<=m)
{
ans[z]=b[j],j++,k++;
continue;
}
if(k>=a[i]&&i<=n)
{
ans[z]=a[i],i++;
continue;
}
else if(k>=b[j]&&j<=m)
{
ans[z]=b[j],j++;
continue;
}
else flag=false;
}
if(flag)
{
for(int z=1 ; z<=n+m ; z++) cout<<ans[z]<<" ";
cout<<endl;
}
else cout<<"-1"<<endl;
}
return 0;
}
D. Co-growing Sequence
题意
定义一种递增序列,如果
a
i
a_i
ai&
a
i
+
1
=
a
i
a_{i+1}=a_i
ai+1=ai那就说明这个序列是递增的。
现在给你一个序列x,让你对x进行构造,使成为递增序列,构造的方式是
x
i
x_i
xi=
x
i
x_i
xi^
y
i
y_i
yi,让你找出最小的y的序列。
思路
直接模拟就可以了。
代码
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
int a[N],ans[N];
int qmi(int n,int k)
{
int res=1;
while(k)
{
if(k&1) res*=n;
n*=n;
k>>=1;
}
return res;
}
int f(int x,int y) {
int x_b[35];
int y_b[35];
int x_b1[35];
int y_b1[35];
memset(x_b,0,sizeof x_b);
memset(y_b,0,sizeof y_b);
int cnt_x=0,cnt_y=0;
while(x)
{
x_b[++cnt_x]=x%2;
x/=2;
}
while(y)
{
y_b[++cnt_y]=y%2;
//cout<<y_b[cnt_y]<<endl;
y/=2;
}
for(int i=1 ; i<=cnt_x ; i++)
{
x_b1[i]=x_b[cnt_x-i+1];
}
for(int i=1 ; i<=cnt_y ; i++)
{
y_b1[i]=y_b[cnt_y-i+1];
}
int ans=0;
/*for(int i=1 ; i<=30 ; i++) cout<<x_b[i]<<" ";
cout<<endl;
for(int i=1 ; i<=30 ; i++) cout<<y_b[i]<<" ";
cout<<endl;*/
for(int i=1 ; i<=30 ; i++)
{
if(x_b[i]==1&&y_b[i]==0) ans+=qmi(2,i-1);
}
return ans;
}
int main()
{
以上是关于Codeforces Round #731 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #731 (Div. 3)
Codeforces Round #731 (Div. 3) E题解
Codeforces Round #731 (Div. 3) B. Alphabetical Strings
Codeforces Round #731 (Div. 3) E. Air Conditioners
Codeforces Round #731 (Div. 3) F. Array Stabilization (GCD version)
Codeforces Round #731 (Div. 3) F. Array Stabilization (GCD version)