Codeforces Round 895 (Div. 3)

A.Two Vessels

与往常 div 3 的 A 题相比稍难了一些,但是把题意搞清楚之后就是一道简单的推式子题目。
\(a<b\),则答案为

\[\left\lceil\frac{\left\lceil\frac{b-a}{2}\right\rceil}{c}\right\rceil=\left\lfloor\frac{\left\lfloor\frac{b-a+1}{2}\right\rfloor+c-1}{c}\right\rfloor \]

B.The Corridor or There and Back Again

简单走路题
也是一道推式子,答案为

\[\min\{d_i+\left\lceil\frac{s_i}{2}\right\rceil-1\}=min\{d_i+\left\lfloor\frac{s_i+1}{2}\right\rfloor-1\} \]

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了这么多发···

代码

posted @ 2023-09-08 11:55  week_end  阅读(75)  评论(0编辑  收藏  举报