Codeforces Round 895 (Div. 3)
A.Two Vessels
与往常 div 3 的 A 题相比稍难了一些,但是把题意搞清楚之后就是一道简单的推式子题目。
设 \(a<b\),则答案为
B.The Corridor or There and Back Again
简单走路题
也是一道推式子,答案为
C.Non-coprime Split
还是推式子推出来的。
设 \(b>a\),对于满足 \(\gcd(a,b)\ne1\) 的 \(a\) 和 \(b\),则有 \(b=x\times a\),带入到第一个式子中就有 \(l\le a+x\times a\le r\),即 \(l\le (x+1)a\le r\)。
因此可以直接从小到大枚举所有的 \(a\),取 \(b\) 满足 \(b=xa\wedge l\le a+b\le r\) 即可。
代码
bool flag=0;
for(int i=2;i*i<=r&&!flag;i++)
for(int j=(l+i-1)/i;i*j<=r;j++)
if(i*j-i>1)
{
cout<<i<<' '<<i*j-i<<"\n";
flag=1;
break;
}
if(!flag)cout<<"-1\n";
D.Plus Minus Permutation
简单题。
不难看出在长度为 \(n\) 的排列中有 \(\left\lfloor\frac{n}{x}\right\rfloor\) 个为 \(x\) 倍数的位置,\(\left\lfloor\frac{n}{y}\right\rfloor\) 个为 \(y\) 倍数的位置,对于既是 \(x\) 的倍数也是 \(y\) 的倍数的重复部分不会对最终结果产生贡献,可以随便填,这样的位置有 \(\left\lfloor\frac{n}{lcm(a,b)}\right\rfloor\) 个。
设 \(g=\left\lfloor\frac{n}{lcm(a,b)}\right\rfloor\),会产生贡献的 \(x\) 的倍数有 \(cntx\) 个,会产生贡献的 \(y\) 的倍数有 \(cnty\) 个。则 \(cntx=\left\lfloor\frac{n}{x}\right\rfloor-g,cnty=\left\lfloor\frac{n}{y}\right\rfloor-g\),答案为 \(\frac{(n-cntx+1+n)*cntx}{2}-\frac{(1+cnty)*cnty}{2}\)。
E.Data Structures Fan
要求写一个处理区间异或和的东东,支持区间取反(其实描述的不完全正确,但是不想说的太啰嗦)。
可以用线段树维护。
代码
F.Selling a Menagerie
给定一个有向有环图。其中删除每个有出度的节点贡献为 \(2c_i\),删除每个没有出度的节点贡献为 \(c_i\),求最大贡献的删除方案。
先拓扑排序找环。对于不在环上的点,直接根据拓扑序记录到方案中;对于在环上的点,发现只有其中一个节点只能贡献 \(c_i\),因此贪心的将 \(c_i\) 最小的点最后放入,其他点依次放入即可。
G.Replace With Product
先统计所有不是 \(1\) 的位置,可以进行数据分治。
发现当这些数量足够大时,增长很快,选定一定更优,因此直接输出第一个出现的位置和最后一个出现的位置即可。如果不是很多,可以直接 \(O(n^2)\) 进行暴力统计找到最大值对应的情况即可。
注意一些特判情况即可。
我怎么WA了这么多发···