CF1878 补题报告

https://codeforces.com/contest/1878

A. How Much Does Daytona Cost?

判断 a 中是否存在一个非空子段使得 k 在这个子段中出现的次数严格大于其它数字的出现次数。存在输出 YES,否则输出 NO。

思路

判断输入的a[i]中是否有值为k的数即可

代码

#include<bits/stdc++.h>
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;
}

B.Aleksa and Stack

构造一个长度为 n 的数组,使得该数组满足 ( a [ i − 1 ] + a [ i − 2 ) ) ∤ ( 3 × a [ i ] ) (a[i-1]+a[i-2))∤ (3×a[i]) (a[i1]+a[i2))(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[i1]+a[i2))(3×a[i])

代码

#include<bits/stdc++.h>
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;
}

C.Vasilije in Cacak

判断能否在 1∼n 中不重复的恰好选出 k 个数使得这 k 的数的和为 x。

思路

除去两种特殊情况(1 ~ k的和大于x,n-k+1 ~ n的和小于x),都满足题意

代码

#include<bits/stdc++.h>
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;
}

D.Reverse Madness

给定一个长度为n的仅包含小写拉丁字母的字符串s,以及两个长度为k的正整数序列l,r
给定q次操作,每次给定一个正整数x
找到值 i使得 l i ≤ x ≤ r i l i ≤ x ≤ r i lixri

a = m i n ⁡ ( x , r i + l i − x ) a=min ⁡(x ,r i + l i − x ) a=min(x,ri+lix) ,令 b = m a x ⁡ ( x , r i + l i − x ) b = max ⁡ ( x , r i + l i − x ) b=max(x,ri+lix)
翻转 s [ a , b ] s[a,b] s[a,b]
最后一次操作后,输出 s

​思路

当翻转次数为偶数时,没有任何改变,所以需要用数组记录需要翻转的区间(判断是否被抵消)

代码

#include<bits/stdc++.h>
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;
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值