一.赛中情况
没做...
二.解题报告
A. How Much Does Daytona Cost?
题意:
给定一个大小为n 的数组a 和一个整数k ,判断 中是否存在一个非空子段,其中k 是最常见整数。
思路:
只要 a数组中含有k这一个数字,那么k为最常见的整数的子段就是这一个数字的字段,所以我们把题目转化成a数组中有没有k。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int n,k,t,x;
int main(){
cin>>t;
while(t--){
cin>>n>>k;
int flag=0;
for(int i=1;i<=n;i++){
cin>>x;
if(x==k){
flag=1;
}
}
if(flag==1) cout<<"YES";
else cout<<"NO";
cout<<"\n";
}
return 0;
}
B.Aleksa 和 Stack
题意:
一个正整数 n,让他构造一个大小为 的正整数严格递增数组,使得对于每个 3a[i+2]不能被a[i]+a[i+1]整除.
思路:
奇数一定不能被偶数整除,所以只要满足3a[i+2]是奇数,也就是a[i+2]是奇数,a[i]+a[i+1]是偶数,也就是a[i]和a[i+1]要么都是奇数要么都是偶数,但是为了满足a[i+2]是奇数,所以a[i]和a[i+1]也一定是奇数,那么只要输出一个从1开始的奇数序列就可以了。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int t,n;
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<n*2;i+=2){
cout<<i<<" ";
}
cout<<"\n";
}
return 0;
}
C.Vasilije in Cacak
题意:
给定三个正整数n,k和x,他必须判断能否在1 和 n之间选择 k个不同的整数,使它们的和等于x 。
思路:
选定k个数的话那么最小就是从1开始连续加k个数,也就是(1+k)k/2;最大的话就是从n 开始往前连续加k个数,也就是 (2n-k+1)k/2),只要x在这个范围以内,都可以实现。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
long long t,n,k,x;
int main(){
cin>>t;
while(t--){
cin>>n>>k>>x;
if(x<(1+k)*k/2||x>(2*n-k+1)*k/2){
cout<<"NO";
}else{
cout<<"YES";
}
cout<<"\n";
}
return 0;
}
D.Reverse Madness
题意:
给你一个长度为 n的字符串s ,其中包含小写拉丁字母。一个正整数k 和两个长度为k 的数组 l和r 。给你一个正整数1 ,表示你需要对 s进行修改的次数。
代码如下:
#include<iostream>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
const int N=2e5+5;
int t;
int l[N],r[N],n,k,q,x;
map<int,int> mp;
int d[N];
void solve(){
memset(r,0,sizeof r);
memset(d,0,sizeof d);
memset(l,0,sizeof l);
mp.clear();
string s;
scanf("%d%d",&n,&k);
scanf("%s",s.c_str());
for(int i=1;i<=k;i++){
scanf("%d",&l[i]);
}
for(int i=1;i<=k;i++){
scanf("%d",&r[i]);
for(int j=l[i];j<=r[i];j++){
mp[j]=i;
}
}
scanf("%d",&q);
while(q--){
scanf("%d",&x);
d[min(x,l[mp[x]]+r[mp[x]]-x)]++;
d[max(x,l[mp[x]]+r[mp[x]]-x)+1]--;
}
for(int i=1;i<=n;i++){
d[i]+=d[i-1];
}
for(int i=1;i<=k;i++){
for(int j=l[i];j<=(l[i]+r[i])/2;j++){
if(d[j]%2==1){
swap(s[j-1],s[l[i]+r[i]-j-1]);
}
}
}
printf("%s\n",s.c_str());
}
int main(){
scanf("%d",&t);
while(t--){
solve();
}
return 0;
}