目录
AC情况
A | B | C | D | E | F | G |
AC | AC | AC | TLE | TLE | --------- | --------- |
A How Much Does Daytona Cost?
题意:
给定一个大小为n的数组a和一个整数k,判断a中是否存在一个非空子段,其中k是在该子段中出现的次数大于该子段中任何其他整数出现的次数的数。
题解:
本题只需要判断k是否在a数组中出现即可,因为只要k自己作为一个非空字段,则只有k一个
代码:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int maxn=1e6+10;
int a[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,k;
scanf("%d%d",&n,&k);
bool flag=false;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==k) flag=true;
}
if(flag==true) printf("YES\n");
else printf("NO\n");
}
return 0;
}
B Aleksa 和 Stack
题意:
给定一个大小为n的严格递增数组a,要求对于每个i(1<=i<=n-2),3*ai+2不能被ai+ai+1整除
最后输出这个序列
题解:
考虑一个序列,是序列为奇数,偶数,奇数,偶数,奇数..........每个都相差3,那么
3*ai+2不能被ai+ai+1整除
代码:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,k=1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
cout<<k<<" ";
k+=3;
}
cout<<"\n";
}
return 0;
}
C Vasilije in Cacak
题意:
给出三个整数 n 、k、x,判断是否能在 1 ∼ n 之间选出 k个不同的整数,使其和为x.
题解:
只要x在前k个数的和,还有后k个数的和中间,那么选出k个不同的整数,他们的和一定为x
代码:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
int main(){
ll t;
scanf("%lld",&t);
while(t--){
ll n,k,x;
scanf("%lld%lld%lld",&n,&k,&x);
ll sum2=0,sum=0;
ll q=(n-(n-k+1)+1)*(n+(n-k+1))/2;
ll p=k*(k+1)/2;
if((p<=x&&x<=q)){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}
D Reverse Madness
题意:
给你一个长度为n的字符串s,其中包含小写拉丁字母。
接下来会给你一个正整数k和两个长度为l的数组和r。
保证这两个数组满足以下条件:
l1=1 ,rk=n ,li<=ri 且1<=i<=k , li=ri-1+1且2<=i<=k
现在给你一个正整数q,表示你需要对s进行修改的次数。
每个修改都用一个正整数x来定义:
1.找出一个索引i,使li<=x<=ri
2.让a=min(x,ri+li-x),b=max(x,ri+li-x)
3.将s的子串从索引a反转到索引b。
题解:
利用 map 在输入右端点时,把 li到ri的所有元素都打上标记,这样可以快速查询x所在的区间,
然后运用差分进行翻转
代码:
注:这不是正解
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int maxn=2e5+10;
int l[maxn],r[maxn],d[maxn];
map<int,int> mp;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--){
memset(d,0,sizeof(d));
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
mp.clear();
int n,k;
cin>>n>>k;
string s;
cin>>s;
for(int i=1;i<=k;i++) cin>>l[i];
for(int i=1;i<=k;i++){
cin>>r[i];
for(int j=l[i];j<=r[i];j++){
mp[j]=i;
}
}
int q;
cin>>q;
while(q--){
int x;
cin>>x;
int a=min(x,l[mp[x]]+r[mp[x]]-x);
int b=max(x,l[mp[x]]+r[mp[x]]-x);
d[a]++;
d[b+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]>>1;j++){
if(d[j]%2==1){
swap(s[j-1],s[l[i]+r[i]-j-1]);
}
}
}
cout<<s<<"\n";
}
return 0;
}