首页 > 其他分享 >CF1413C Perform Easily 题解

CF1413C Perform Easily 题解

时间:2024-02-07 10:12:34浏览次数:21  
标签:Easily CF1413C Perform 题解 int include define

解题思路

其实是很简单的一道题,考虑计算出所有 \(b_i\) 在减去每一个 \(a_j\) 后所有可能的值,将这个值按照从小到大的顺序排序,那么我们可以考虑固定最小值,查找最大值,这个时候从最小值到最大值的区间内应该每一种 \(b_i\) 都出现了一次。那么,我们可以使用一个桶或者 map 搭配双指针来维护。

该种做法时间复杂度 \(O(6\times n\log n)\)。

其实可以再优化一点的。显然,上面的做法会计算一些重复的值,我们考虑去除这些重复的值。不难想到,两个相同的 \(b_i\),删去一个后答案不变,同理,两个相同的 \(a_j\),删除一个后答案不变,那么我们可以把 \(a\) 和 \(b\) 去重后再进行计算,时间复杂度 \(O(1)\sim O(6\times \log n)\)。

AC 代码

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include <set>
#include <valarray>
#include <map>
#define N 100005
#define M 800
int n,a[10],b[N];
struct Point{
    int val;
    int pos;
}A[N<<3];int m;
inline bool cmp(Point x,Point y){
    return x.val<y.val;
}
signed main(){
    scanf("%d%d",&a[1],&a[2]);
    scanf("%d%d",&a[3],&a[4]);
    scanf("%d%d",&a[5],&a[6]);
    scanf("%d",&n);
    std::sort(a+1,a+6+1);
    int t=std::unique(a+1,a+7)-a-1;
    for(register int i=1;i<=n;++i)
        scanf("%d",&b[i]);
    std::sort(b+1,b+n+1);
    n=std::unique(b+1,b+n+1)-b-1;
    for(register int i=1;i<=n;++i)
    for(register int j=1;j<=t;++j)
        A[++m]={b[i]-a[j],i};
    std::sort(A+1,A+m+1,cmp);
    int r=0,ans=2e9+7,res=0;
    std::map<int,int> cnt;
    for(register int i=1;i<=m;++i){
        while(r<m&&res<n){++r;
            if(!cnt[A[r].pos]) 
                ++res;
            ++cnt[A[r].pos];
        }if(res<n) break;
        if(A[r].val-A[i].val<ans)
            ans=A[r].val-A[i].val;
        --cnt[A[i].pos];
        if(!cnt[A[i].pos]) --res;
    }printf("%d",ans);
}

标签:Easily,CF1413C,Perform,题解,int,include,define
From: https://www.cnblogs.com/UncleSamDied6/p/18010670

相关文章

  • 洛谷P10135 暨 USACOJan2024S T2 题解
    题意简述给点一棵有\(n\)个节点的树,在每个时间点都会在某个节点出现一瓶药水,记\(p_i\)为第\(i\)个时间点出现药水的节点,定义一次遍历为从\(1\)号节点走到任意节点,要求在遍历次数最少的情况下拾取最多数量的药水。思维路径首先我们要探讨遍历次数最少的状态是怎样的。由......
  • CF1922B Forming Triangles 题解
    解题思路显然,有以下两种选择的方法:所有边一样长;两条一样长的边,第三条边小于这两条边。然后组合数计算即可。AC代码#include<stdio.h>#include<stdlib.h>#include<algorithm>#include<vector>#definelllonglong#defineN300005intn,a[N];inlinellC3(llx){......
  • CF1922C Closest Cities 题解
    解题思路贪心,能走距离最短的城市就一定走。分别考虑\(x>y\)和\(x<y\)的情况,两种情况分别是从后向前转移和从前往后转移,分别预处理一个前缀和和后缀和即可。AC代码#include<stdio.h>#include<stdlib.h>#include<valarray>#defineN100005#definelllonglongintn......
  • CF1338B Edge Weight Assignment 题解
    解题思路一种不需要树形dp的做法。因为是一颗无根树,所以我们不妨以重心为根。首先考虑边权最少的情况。可以发现这个时候对于任意两个叶子节点,我们可以分别考虑其到根节点的路径,这样对于求其路径的异或值是没有影响的,但是在这种情况下我们可以很方便的讨论其路径的奇偶性。令......
  • ABC335 A~E 题解
    A题目大意输入一个字符串,把这个字符串的最后一位改成4后输出这个字符串。解题思路直接模拟即可AC代码#include<iostream>#include<math.h>#include<time.h>#include<stdio.h>#include<algorithm>#definelllonglonginlinevoidwork(){std::strings;s......
  • P6025 线段树 题解
    解题思路暴力做法从\(l\)到\(r\)枚举每一个数,然后建线段树,记录最大下标,然后计算答案。代码略。时间\(O(n^2)\),期望得分:\(10\)分。优化暴力我们考虑每次枚举不遍历整棵线段树。显然,贪心的,最深的最右边的节点编号最大。那么我们可以发现,如果两颗子树大小相同,那么最大节......
  • csp-j题解
    csp-j题解第一题:小苹果原题洛谷P9748题目描述小Y的桌子上放着\(n\)个苹果从左到右排成一列,编号为从\(1\)到\(n\)。小苞是小Y的好朋友,每天她都会从中拿走一些苹果。每天在拿的时候,小苞都是从左侧第\(1\)个苹果开始、每隔\(2\)个苹果拿走\(1\)个苹果。随后小苞......
  • AT_ddcc2019_final_a 题解
    原题传送门题目描述:企鹅经过$1$个雪地方格需要$1$秒,经过$1$个冰地方格需要$\frac{1}{(k+2)}$秒。$k$是紧接着冰雪方格之前的冰雪方格数。在企鹅开始之前,高桥可以把$1$个雪方块变成冰方块。问企鹅离开起点后到达终点最少需要多少时间?思路分析:这道题是模拟+贪心......
  • P10125 「Daily OI Round 3」Simple题解
    原题传送门题目概述:给我们一个字符串,不区分大小写,让我们判断此字符串是与Acoipp等价,还是与Svpoll等价,或者是与前两者都不等价,并按题目条件输出。思路分析:我们只需要把此字符串的第一个字符转成大写,其他字符转成小写,并与那两个字符串进行比较就行了代码:#include<bits/st......
  • 2024牛客寒假算法基础集训营1个人补题题解(I)
    比赛链接:2024牛客寒假算法基础集训营1I、It'sbertrandparadox.Again!这么抽象的东西出得很好,下次别再出了。从bit和buaa不同的抽数规则可以得出一个结论:bit抽取具体坐标点的次数会明显小于buaa,甚至只有在几乎不可能的理想范围内两者抽取的次数才相近,因此因为样本量极大(1e5次......