AtCoder Beginner Contest 442
JPRS Programming Contest 2026#1 (AtCoder Beginner Contest 442)
A Count .
统计字符串中字母 \(i\) 和 \(j\) 的个数。
string s;
cin>>s;
int len=s.size(),ans=0;
for(int i=0;i<len;i++)
if(s[i]=='i'||s[i]=='j') ans++;
printf("%d\n",ans);
B Music Player
用 \(flag\) 标记音乐是否正在播放,\(cnt\) 统计当前音乐的音量。
如果执行一次操作之后 flag==true&&cnt>=3 就输出 \(Yes\),否则输出 \(No\)。
scanf("%d",&q);
while(q--)
{
int x;
scanf("%d",&x);
if(x==1)
{
cnt++;
if(flag&&cnt>=3) printf("Yes\n");
else printf("No\n");
}
else if(x==2)
{
if(cnt>=1) cnt--;
if(flag&&cnt>=3) printf("Yes\n");
else printf("No\n");
}
else
{
if(!flag) flag=true;
else flag=false;
if(flag&&cnt>=3) printf("Yes\n");
else printf("No\n");
}
}
C Peer Review
统计每位研究人员与多少个研究人员没有利益冲突。
设第 \(i\) 位研究人员与 \(cnt[i]\) 位研究人员没有利益冲突,从中随机抽三位作为审稿人,有 \(C_{cnt[i]}^3\) 有可能性。
自定义 calc 函数计算 \(C_b^a\):
LL calc(int a,int b)
{
LL sum=1;
for(int i=b;i>=b-a+1;i--)
sum=(LL)sum*i;
for(int i=1;i<=a;i++)
sum=(LL)sum/i;
return sum;
}
for(int i=1;i<=n;i++)
{
if(cnt[i]<3) printf("0 ");
else printf("%lld ",calc(3,cnt[i]));
}
如何统计没有利益冲突的人数?
如果两人之间存在利益冲突,两人相应的 \(cnt\) 都 \(-1\) 即可。
for(int i=1;i<=n;i++)
cnt[i]=n-1;
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
cnt[a]--;
cnt[b]--;
}
D Swap and Range Sum
前缀和
题单:第2单元 前缀和与差分
看到统计 \(\sum\limits_{l\leq i\leq r} A_i\),想到前缀和,设前 \(i\) 个数的和为 \(s[i]\)。
每次进行交换 \(A_x,A_{x+1}\) 的操作,只有前 \(x\) 个数的和发生变化。
将 \(s[x]\) 变为 \(s[x]-a[x]+a[x+1]\),交换 \(s[x],s[x+1]\) 即可。
while(q--)
{
int k,x,l,r;
scanf("%d",&k);
if(k==1)
{
scanf("%d",&x);
s[x]-=a[x];
s[x]+=a[x+1];
swap(a[x],a[x+1]);
}
else
{
scanf("%d%d",&l,&r);
printf("%d\n",s[r]-s[l-1]);
}
}
如果交换的两个数字不是相邻的,就不能 \(O(1)\) 修改前缀和数组了。
再次沿用这道题的解法,一定会 \(\text{TLE}\)。
这时需要用到一些进阶数据结构,树状数组、线段树……
感兴趣的同学自行了解相关内容,这里提供一些参考资料。
- 树状数组:
一篇博客:树状数组总结,从入门到进阶,涵盖了许多例题
- 线段树:
一些模板题:【模板】线段树 1、【模板】线段树 2、【模板】线段树 1.5

浙公网安备 33010602011771号