Codeforces Round #829 (Div. 2)
A. Technical Support
题目大意:
判断每个问题(Q)是否被回答(A)。
根据题意判断即可,注意多个可以对于一个。
#include <bits/stdc++.h>
using namespace std;
inline void _main(){
int n;
string s;
cin>>n>>s;
int ans=0;
for(int i=0;i<s.size();++i){
if(s[i]=='Q'){
if(ans>=0) ans++;
else ans=1;
}
else{
ans--;
}
}
if(ans>0) puts("No");
else puts("Yes");
}
int main(){
int t;
cin>>t;
while(t--) _main();
return 0;
}
B. Kevin and Permutation
题目大意:
构造一个长度为的排列,使其最大。
不难发现(实在发现不了可以打表),,考虑构造一个满足条件的排列。
只需要保证相邻两项之差大于等于即可。
#include <bits/stdc++.h>
using namespace std;
inline void _main(){
int n;
static int vis[1000 + 5],a[1000 + 5];
cin>>n;
for(int i=1;i<=n;++i) vis[i]=0;
int k=n/2;
if(n%2==0){
int l=k,r=n;
for(int i=1;i<=k;++i) printf("%d %d ",l,r),l--,r--;
}
else{
for(int i=1;i<=n;i+=k) if(!vis[i]) printf("%d ",i),vis[i]=1;
for(int l=k;l>=2;--l)
for(int i=l;i<=n;i+=k) if(!vis[i]) printf("%d ",i),vis[i]=1;
}
printf("\n");
}
int main(){
int t;
cin>>t;
while(t--) _main();
return 0;
}
C1. Make Nonzero Sum (easy version)
题目大意:给出一个包含的序列,分成若干段,第段的权值为交替和,使得之和为,求划分方案。
不难发现,为奇数无解。(因为对于一个区间长度,若是偶数,则取值也为偶,若为奇数,则取值也为奇,要使之和等于,则必须有偶数个为奇数)
题目对分成的段数没有要求,于是两项两项的考虑,若同号,则可以划分为一组,权值为,若异号,则分别划分成一组,两组权值和为
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 200000 + 5;
int n,a[MAX_N];
pair<int,int> ans[MAX_N];
inline void _main(){
int tot=0;
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
if(n&1){
puts("-1");
return;
}
for(int i=1;i<=n;i+=2){
if(a[i]*a[i+1]>0){
ans[++tot]=make_pair(i,i+1);
}
else{
ans[++tot]=make_pair(i,i);
ans[++tot]=make_pair(i+1,i+1);
}
}
sort(ans+1,ans+1+tot);
printf("%d\n",tot);
for(int i=1;i<=tot;++i) printf("%d %d\n",ans[i].first,ans[i].second);
}
int main(){
int t;
cin>>t;
while(t--) _main();
return 0;
}
C2. Make Nonzero Sum (hard version)
题目大意:给出一个包含的序列,分成若干段,第段的权值为交替和,使得之和为,求划分方案。
考虑在的方法上进行修改。
发现对于题目只有更换正负号的作用。
于是,对于,我们考虑的情况:发现将一个变成会使得,同理。
所以为奇数的时候,无解。
然后再处理个变的情况即可。
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 200000 + 5;
int n,a[MAX_N];
pair<int,int> ans[MAX_N];
inline void _main(){
int tot=0;
cin>>n;
int cnt=0;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i) cnt+=(a[i]!=0);
if(cnt&1){
puts("-1");
return;
}
int sum=0;
for(int i=1;i<=n;++i) sum+=a[i];
if(sum>=0){
static bool vis[MAX_N];
for(int i=1;i<=n;++i) vis[i]=0;
for(int i=1;i<=n;++i){
if(a[i]==1 && sum>0){
if(i>1 && !vis[i-1]){
ans[++tot]=make_pair(i-1,i);
vis[i-1]=1,vis[i]=1;
sum-=2;
}
}
}
for(int i=1;i<=n;++i){
if(!vis[i]) ans[++tot]=make_pair(i,i);
}
sort(ans+1,ans+1+tot);
printf("%d\n",tot);
for(int i=1;i<=tot;++i) printf("%d %d\n",ans[i].first,ans[i].second);
}
else{
static bool vis[MAX_N];
for(int i=1;i<=n;++i) vis[i]=0;
for(int i=1;i<=n;++i){
if(a[i]==-1 && sum<0){
if(i>1 && !vis[i-1]){
ans[++tot]=make_pair(i-1,i);
vis[i-1]=1,vis[i]=1;
sum+=2;
}
}
}
for(int i=1;i<=n;++i){
if(!vis[i]) ans[++tot]=make_pair(i,i);
}
sort(ans+1,ans+1+tot);
printf("%d\n",tot);
for(int i=1;i<=tot;++i) printf("%d %d\n",ans[i].first,ans[i].second);
}
}
int main(){
int t;
cin>>t;
while(t--) _main();
return 0;
}
D. Factorial Divisibility
题面大意:给出一个长度为的序列,求是否能被整除。
发现题目求的是,从到需要个相加,所以判断是否所有能像那样变成即可。
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 500000 + 5;
int n,x,a[MAX_N],cnt[MAX_N];
int main(){
cin>>n>>x;
for(int i=1;i<=n;++i) cin>>a[i],cnt[a[i]]++;
for(int i=1;i<x;++i) while(cnt[i]>=(i+1)) cnt[i+1]++,cnt[i]-=(i+1);
bool flag=1;
for(int i=1;i<x;++i) if(cnt[i]) flag=false;
if(flag) puts("Yes");
else puts("No");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧