Codeforces Round 764 (Div. 3)
A. Plus One on the Subset
简单题,直接求极差即可。
B. Make AP
简单分讨:
- 当选定 \(a\) 有 \(ma<b<c\)。为等差序列时,有 \(c-b=b-ma\),即 \(ma+c=2b\)。对于合法的正整数 \(m\),有 \((2b-c)\mod a=0\wedge\frac{2b-c}{a}>0\)
- 当选定 \(b\),有 \(a<mb<c\),为等差序列时,有 \(c-mb=mb-a\),即 \(a+c=2mb\),对于合法的正整数 \(m\),有 \((a+c)\mod 2b=0\wedge\frac{a+c}{2b}>0\)
- 当选定 \(c\),有 \(a<b<mc\),为等差序列时,有 \(mc-b=b-a\),即 \(mc+a=2b\),对于合法的正整数 \(m\),有 \((2b-a)\mod c=0\wedge\frac{2b-a}{c}>0\)
C. Division by Two and Permutation
简单性质题,由于最后一定是一个排列,因此对于所有大于 \(n\) 的数,我们可以先贪心的将它们除到不比 \(n\) 大,维护一下所有值。
再从大到小遍历所有排列中的数,如果有多个相同值,就将多余的部分除下去,如果没有当前值,说明无解。
代码
for(int i=1;i<=n;i++)
{
while(a[i]>n)a[i]/=2;
st[a[i]]++;
}
bool flag=1;
for(int i=n;i;i--)
{
if(!st[i])
{
flag=0;
break;
}
while(st[i]>1)
{
st[i/2]++;
st[i]--;
}
}
puts(flag?"YES":"NO");
D. Palindromes Coloring
首先可以直接统计一下所有出现的字母个数。
不难看出,当选定的所有字符组成回文串是,选定的字符除了中间的一定是成对出现的,因此可以直接统计一下所有成对出现的字符个数和单独出现的字符个数。
要求拼成 \(k\) 对回文串中最短回文串的最大长度,可以先从所有成对出现的回文串中选尽量多的出来,再考虑剩下的单字符数量能否足够插在在这 \(k\) 个字符串中的中间位置。
代码
for(int i=1;i<=n;i++)num[s[i]-'a']++;
int cnt=0,sum=0;//cnt统计成对出现的字符个数,sum统计单独出现的字符个数
for(int i=0;i<26;i++)
{
cnt+=num[i]/2;
num[i]%=2;
sum+=num[i];
}
int res=cnt/k*2;
if(cnt%k*2+sum>=k)res++;//注意算上没有用上的成对字符
cout<<res<<"\n";
E. Masha-forgetful
题目要求找相同的字符串,因此考虑用哈希实现。
首先找性质发现,如果存在合法方案,模式串一定可以通过若干个长度为 \(2\) 或 \(3\) 的字符串拼成。因此可以考虑将所有匹配串中长度为 \(2\) 或 \(3\) 的字符串都记录到哈希表中,在通过 dp 求答案。
具体来说,在将所有匹配串的所有合法字符加入哈希表中后,设 \(f_i\) 表示到 \(i\) 这一位能否通过长度为 \(2\) 或 \(3\) 的字符串表示,初始时 \(f_0=1\),当 \(f_m=0\) 时无解。
如果能够在哈希表中找到 \(s_{i-2}+s_{i-1}+s_i\) 的字符串,并且之前可以转移到 \(f_{i-3}\),就有 \(f_i=3\)。
同理当哈希表中找到 \(s_{i-1}+s_i\) 的字符串,并且之前可以转移到 \(f_{i-2}\),就有 \(f_i=2\)。
F.Interacdive Problem
神奇的二分。
每次选定一个当前确定的合法范围内的中间值 \(mid\) 进行询问,每次减少一半的合法范围。由于 \(2^10=1024>1000\),在 \(10\) 次询问内一定能保证有解。
代码
int l=1,r=n-1,res=0,cnt=0;
while(l<=r)
{
int mid=n-(l+r>>1)%n,x;
l+=mid,r+=mid,res+=mid;
cout<<"+ "<<mid<<endl;
cin>>x;
if(x!=cnt)res=n*x,l=n*x+1;
else r=n*(x+1)-1;
cnt=x;
}
cout<<"! "<<res<<endl;
G. MinOr Tree
求最小或运算生成树
由于是或运算,因此一般策略一定是最高位能小就小,能没有的数就不要有。因此可以从大到小贪心的考虑每一位,不考虑对于当前位为 \(1\) 的所有边,用并查集维护能否形成一颗生成树即可。