首页 > 其他分享 >CF297C Splitting the Uniqueness 题解

CF297C Splitting the Uniqueness 题解

时间:2024-06-11 09:57:46浏览次数:22  
标签:lfloor ai 题解 32n rfloor Uniqueness CF297C dfrac 2n

CF297C Splitting the Uniqueness 题解

非常好构造题,使我的草稿纸旋转。

解法

我们记输入的数组为 a a a,需要输出的两个数组为 b , c b,c b,c(因为当时起变量名起的)。

考虑利用 a i a_i ai​ 互不相同的性质。

先将 a i a_i ai​ 升序排序。因为题中保证 a i a_i ai​ 互不相同,所以相邻两数的差至少为 1 1 1,从而 a i ≥ i − 1 a_i \ge i - 1 ai​≥i−1。

考虑到最多有 ⌈ n 3 ⌉ \lceil \dfrac{n}{3} \rceil ⌈3n​⌉ 个重复数字,即为需要至少有 ⌊ 2 n 3 ⌋ \lfloor \dfrac{2n}{3} \rfloor ⌊32n​⌋ 种不同数字。我们可以将整个数组等分为 3 3 3 段,分别是 [ 1 , ⌊ n 3 ⌋ ] [1,\lfloor \dfrac{n}{3} \rfloor ] [1,⌊3n​⌋], ( ⌊ n 3 ⌋ , ⌊ 2 n 3 ⌋ ] (\lfloor \dfrac{n}{3} \rfloor,\lfloor \dfrac{2n}{3} \rfloor] (⌊3n​⌋,⌊32n​⌋], ( ⌊ 2 n 3 ⌋ , n ] (\lfloor \dfrac{2n}{3} \rfloor,n] (⌊32n​⌋,n]。具体构造如下图。

图片

为什么这么构造是对的?

显然对于 c c c 数组,第二段和第三段的数互不相同,满足至少有 ⌊ 2 n 3 ⌋ \lfloor \dfrac{2n}{3} \rfloor ⌊32n​⌋ 种不同数字。考虑为什么 b b b 数组至少有 ⌊ 2 n 3 ⌋ \lfloor \dfrac{2n}{3} \rfloor ⌊32n​⌋ 种不同数字。

观察第一段和第三段,因为 a i ≥ i − 1 a_i \ge i-1 ai​≥i−1,所以第三段的第一个 a i a_i ai​ 满足 a i ≥ 2 n 3 a_i \ge \dfrac{2n}{3} ai​≥32n​,而 n − ⌊ 2 n 3 ⌋ − 1 = ⌈ n 3 ⌉ − 1 n - \lfloor \dfrac{2n}{3} \rfloor -1 = \lceil \dfrac{n}{3} \rceil - 1 n−⌊32n​⌋−1=⌈3n​⌉−1,所以 c i c_i ci​ 满足 c i ≥ n 3 c_i \ge \dfrac{n}{3} ci​≥3n​,而在第三段 a a a 单调上升, c c c 单调下降,所以 b b b 单调上升,所以 b b b 数组在第一段和第三段互不相同。

代码

#include<bits/stdc++.h>
namespace fast_IO
{
    /**
     * 没啥用的快读快写
    */
};
using namespace fast_IO;
int n,b[100010],c[100010],fir,sec;
struct node
{
    int val,ord;
    inline bool operator<(const node rhs) const
    {
        return val<rhs.val;
    }
};
node a[100010];
int main()
{
    in>>n,fir=n/3,sec=n*2/3;
    for(int i=1;i<=n;i++) in>>a[i].val,a[i].ord=i;
    std::sort(a+1,a+n+1);
    for(int i=1;i<=fir;i++) b[a[i].ord]=i-1,c[a[i].ord]=a[i].val-b[a[i].ord];
    for(int i=fir+1;i<=sec;i++) c[a[i].ord]=i-1,b[a[i].ord]=a[i].val-c[a[i].ord];
    for(int i=n;i>sec;i--) c[a[i].ord]=n-i,b[a[i].ord]=a[i].val-c[a[i].ord];
    out<<"YES\n";
    for(int i=1;i<=n;i++) out<<b[i]<<' ';
    out<<'\n';
    for(int i=1;i<=n;i++) out<<c[i]<<' ';
    fwrite(Ouf,1,p3-Ouf,stdout),fflush(stdout);
    return 0;
}

标签:lfloor,ai,题解,32n,rfloor,Uniqueness,CF297C,dfrac,2n
From: https://blog.csdn.net/luogu_553625/article/details/139590444

相关文章

  • Atcoder357D题解(求解等比数列求和公式的推导)
    解题思路设连接之后的N等于Nlast,w=10^(N在10进制下的长度,例如N=5,那么w=10)Nlast=N+N*w+N*(w^2)+N*(w^3)+.....+N*(w^n)举个例子N=5,因为510进制的长度是1,所以w=10,那么Nlast=5+5*10(w)^1+5*10(w)^2+5*10(w)^3+......
  • Luogu P1784 数独 [ 模板 ] / P1074 靶形数独 题解 [ 蓝 ] [ 深搜 ] [ 剪枝 ] [ 卡常
    数独模板,靶形数独卡了2h,再也不想写数独了。思路显然是对每个格子进行枚举,类似八皇后的方法去做,朴素方法是由\((1,1)\)到\((9,9)\)遍历过去。优化我们人在做数独时,会优先选择已填格数多的行、列、区域,这样可以保证尝试次数少。同样,这一点在本题中也可以应用,但是有两......
  • [题解]P9432 [NAPC-#1] rStage5 - Hard Conveyors
    P9432[NAPC-#1]rStage5-HardConveyors题意简述给定一个\(N\)个节点的树形结构,其中有\(k\)个关键节点。接下来有\(q\)次询问,每次询问给定\(x,y\),请输出\(x\)到\(y\)至少经过一个关键点的最短路径。解题思路我们发现,这道题相当于让我们从\(x\)到\(y\)的简单路径上,额外扩展......
  • P10572 [JRKSJ R8] +1-1 题解
    样例给了我们一个很好的提示。观察样例中\(1\rightarrow4\)的路径,发现\(4\rightarrow5\)这条边走了两遍,再结合题目描述中不需要保证是简单路径的提示,我们发现:如果路径两侧分别是(\(\rightarrow\)(和)\(\rightarrow\))的话,那么中间不管怎么走都可以通过左右横跳来......
  • LibreOJ #10131. 「一本通 4.4 例 2」暗的连锁 题解 树上差分
    暗的连锁题目描述Dark是一张无向图,图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark有N−1条主要边,并且Dark的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark还有M条附加边。你的任务是把Dark斩为不连通的两部分。一开始Da......
  • [题解]P9433 [NAPC-#1] Stage5 - Conveyors
    P9433[NAPC-#1]Stage5-Conveyors题意简述给定一个\(N\)个节点的树形结构,每条边有边权,树上有\(k\)个关键点。接下来有\(q\)次询问,每次询问给定\(x,y\)两点,请计算从\(x\)开始经过这\(k\)个关键点(可以重复经过)再到\(y\)的最短路程。解题思路我们可以发现,如果\(x\)与\(y\)都......
  • 牛客周赛 Round 46 题解 C++
    目录 A 乐奈吃冰B 素世喝茶C 爱音开灯D 小灯做题E 立希喂猫F 祥子拆团 A 乐奈吃冰#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<vector>#include<unordered_map>......
  • 斜率优化DP简单总结&&“土地购买”题解
    今天刚刷完了斜率优化DP,简单从头回顾一下。\[首先,能写出DP方程应该是最重要的,毕竟斜率只是用来优化的\]那么一个DP方程能用斜率优化,具备一种形式:\[f[i]+s1[i]+A[i]*B[j]=f[j]+s2[j]\]其中,f[i]表示所求值,(s1[i]、A[i])与(s2[j]、B[j])分别表示只与i或j有关的一个表达式(可以是只有常......
  • Codeforces Round 837题解(A、B)
    A.HossamandCombinatorics\(|a_i-a_j|\)最大的就是最大值和最小值,注意要开longlong。intn;inta[N];voidsolve(){cin>>n;intmin_v=INF,max_v=0;for(inti=1;i<=n;i++){cin>>a[i];min_v=min(min_v,a[i......
  • CF1970F1 Playing Quidditch (Easy) 题解
    一道大模拟题。这道题可以用一个 map 记录球员及鬼飞球当时的坐标,用一个数组 a 记录是否有人进球,用另一个数组 b 记录每位球员是否有鬼飞球。当球员抓住鬼飞球后,鬼飞球跟着这个球员移动,直到这个球员投球。话不多说,直接上代码。MyCode:#include<bits/stdc++.h>#de......