https://codeforces.com/contest/1878
判断 a 中是否存在一个非空子段使得 k 在这个子段中出现的次数严格大于其它数字的出现次数。存在输出 YES,否则输出 NO。
判断输入的a[i]中是否有值为k的数即可
#include
using namespace std;
int t,a,n,k;
bool flag;
int main(){
scanf("%d",&t);
while(t--){
flag=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a);
if(a==k&&!flag){
printf("YES\n");
flag=1;
}
}
if(!flag){
printf("NO\n");
}
}
return 0;
}
构造一个长度为 n 的数组,使得该数组满足 ( a [ i − 1 ] + a [ i − 2 ) ) ∤ ( 3 × a [ i ] ) (a[i-1]+a[i-2))∤ (3×a[i]) (a[i−1]+a[i−2))∤(3×a[i])
任何偶数无法整除奇数,而奇数加上奇数一定为偶数,奇数乘上偶数一定为偶数,只需令 a [ i ] a[i] a[i] 全为奇数就可以实现 ( a [ i − 1 ] + a [ i − 2 ) ) ∤ ( 3 × a [ i ] ) (a[i-1]+a[i-2))∤ (3×a[i]) (a[i−1]+a[i−2))∤(3×a[i])
#include
using namespace std;
int t,a,n,k;
bool flag;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
printf("%d ",2*i-1);
}
printf("\n");
}
return 0;
}
判断能否在 1∼n 中不重复的恰好选出 k 个数使得这 k 的数的和为 x。
除去两种特殊情况(1 ~ k的和大于x,n-k+1 ~ n的和小于x),都满足题意
#include
using namespace std;
long long t,n,k,x;
int main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld%lld",&n,&k,&x);
if(k*(1+k)/2>x){
printf("NO\n");
}
else if(k*(n-k+1+n)/2<x){
printf("NO\n");
}
else{
printf("YES\n");
}
}
return 0;
}
给定一个长度为n的仅包含小写拉丁字母的字符串s,以及两个长度为k的正整数序列l,r
给定q次操作,每次给定一个正整数x
找到值 i使得 l i ≤ x ≤ r i l i ≤ x ≤ r i li≤x≤ri
令 a = m i n ( x , r i + l i − x ) a=min (x ,r i + l i − x ) a=min(x,ri+li−x) ,令 b = m a x ( x , r i + l i − x ) b = max ( x , r i + l i − x ) b=max(x,ri+li−x)
翻转 s [ a , b ] s[a,b] s[a,b]
最后一次操作后,输出 s
当翻转次数为偶数时,没有任何改变,所以需要用数组记录需要翻转的区间(判断是否被抵消)
#include
using namespace std;
int l[200005],r[200005],d[200005],n,k,q,x,t;
map<int,int> mp;
string s;
int main(){
scanf("%d",&t);
while(t--){
mp.clear();
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
memset(d,0,sizeof(d));
scanf("%d%d",&n,&k);
cin>>s;
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;
}
}
cin>>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]>>1;j++){
if(d[j]%2){
swap(s[j-1],s[l[i]+r[i]-j-1]);
}
}
}
cout<<s<<"\n";
}
return 0;
}