首页 > 其他分享 >【题解】[2023牛客多校] Distance

【题解】[2023牛客多校] Distance

时间:2023-08-04 20:14:08浏览次数:51  
标签:Distance set min int 题解 sum 牛客 binom define

题目传送门:[2023牛客多校] Distance

题意

对于任意两个元素个数相同的set:A、B,每次可以执行以下两种操作之一:

  • 将A中的任意元素加一
  • 将B中的任意元素加一

\(C(A, B)\) 含义为将 \(A、B\) 改变为完全相同的 set 所需要花费的最小次数;

初始给你两个set:\(S、T\) ,计算 \(\sum_{A \subseteq S} \sum_{B \subseteq T} C(A,B)\)

其中 \(1 \leq n \leq 2 \times 10^3\)

分析

数据量不大,可以暴力枚举,但是如果枚举每一种集合划分方式不太现实;

有个简单的一目了然的性质:在将两个集合 \(sort\) 之后,任意两个集合的 \(C\) 一定是对应位置的元素弄成相同所需要的花费;利用这个性质我们可以枚举每个点对会在多少种划分方式中出现即可,对答案的贡献就是点对的差

题解

\(sort\) 之后暴力枚举每两个点 \(x,y\),计算其会被几次划分进集合,公式如下:

\[\sum_{i=0}^{min(x-1,y-1)}\binom{x-1}{i}\binom{y-1}{i} \times \sum_{i=0}^{min(n-x,n-y)}\binom{n-x}{i}\binom{n-y}{i} \]

由组合数学定理,该公式可简化为:

\[\binom{x+y-2}{min(x-1,y-1)} \times \binom{2n-x-y}{min(n-x,n-y)} \]

再乘上一个点对差的绝对值即可,时间复杂度 \(O(n^2)\)

AC代码

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
#define cin std::cin
#define cout std::cout
#define fastio ios::sync_with_stdio(0), cin.tie(nullptr)
using namespace std;
const int N = 2e5 + 10;
const int mod = 998244353;
const int inf = 0x3fffffffffffffff;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
    int ret = 0,f = 0;char ch = getc();
    while (!isdigit (ch)){
        if (ch == '-') f = 1;
        ch = getc();
    }
    while (isdigit (ch)){
        ret = ret * 10 + ch - 48;
        ch = getc();
    }
    return f?-ret:ret;
}
int frac[N], inv[N];
int qpow(int a, int b) {
    int s = 1;
    for (; b; a = 1ll * a * a % mod, b >>= 1) if (b & 1) s = 1ll * s * a % mod;
    return s;
}
void set_up() {
    frac[0] = inv[0] = 1;
    for (int i = 1; i <= N - 5; i++) frac[i] = 1ll * frac[i - 1] * i % mod;
    inv[N - 5] = qpow(frac[N - 5], mod - 2);
    for (int i = N - 6; i; i--)
    inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
}
inline int C(int n, int m) {
    if (n < m) return 0;
    return 1ll * frac[n] * inv[m] % mod * inv[n - m] % mod;
}
inline int calc(int x, int y) {
    return C(x + y, min(x, y));
}
int n, m;
int s[N], t[N];
inline void solve() {
    n = read();
    for(int i = 1; i <= n; ++i) {
        s[i] = read();
    }
    for(int i = 1; i <= n; ++i) {
        t[i] = read();
    }
    sort(s + 1, s + n + 1);
    sort(t + 1, t + n + 1);
    int ans = 0;
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= n; ++j) {
            ans += calc(i - 1, j - 1) % mod * calc(n - i, n - j) % mod * abs(s[i] - t[j]) % mod;
            ans %= mod;
            // cout << ans << endl;
        }
    }
    printf("%lld\n", ans);
}
signed main() {
    // fastio;
    set_up();
    int T;
    // cin >> T;
    T = 1;
    while(T --) {
        solve();
    }
    return 0;
}

标签:Distance,set,min,int,题解,sum,牛客,binom,define
From: https://www.cnblogs.com/marti88414/p/17606879.html

相关文章

  • P4795 [BalticOI 2018] 基因工程 题解
    题目传送门:Click。蒟蒻看见这道题,想了足足一个小时,过后顿有所悟,故作此篇。首先,看到题目,光是数据就已经达到了\(\operatorname{O}(nm)\)的级别,再看一看数据范围:\(3\leqn,m\leq4,100\)。显然是一道时间复杂度为\(\operatorname{O}(n,m)\)级别的题目。本蒟蒻首先观察了样......
  • 暑期竞赛培训 Day 16 <继续写题解>
    -[1][蓝桥杯2013省A]剪格子洛谷P8601题目描述如图\(1\)所示,\(3\times3\)的格子中填写了一些整数。我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是\(60\)。本题的要求就是请你编程判定:对给定的\(m\timesn\)的格子中的整数,是否可以分割为两个部分,使......
  • P4169 题解
    题意二维平面上有\(n\)个点,给你\(m\)次操作,每次操作可以插入一个点或者询问所有点中距离给定点最近的哈密顿距离。\(n,m\le3\times10^5.\)分析这是一道K-DTree的裸题。而对于这道题,我们还需要考虑插入操作。我们给出两种方式:按很多题解的思路,在这棵树上直接按普通......
  • AT_ttpc2015_g 题解
    洛谷的RMJ总是UKE,所以这一题是在ATcoder上做的,记录一,记录二。思路一首先字符串长度一定是\(6\)的倍数,然后判断是否只有\(t\)、\(i\)、\(e\)、\(c\)、\(h\)这五个字符,最后统计一下字符个数就行了。代码(错误):#include<iostream>#include<string>usingnamespacestd;......
  • UVA333 题解
    ##大意:给定一个字符串$s$判断$s$是否符合要求。1.由数字,`-`和大写英文数字`X`,空格组成,`X`代表$10$且只能在最后出现。2.依次相加前面的数字的总和可以被$11$整除,也就是前缀和,而且刚好$s$只有$10$个数字。---##坑点:1.`\r`换行与空格。你写完代码在洛谷......
  • Python爬虫遇到重定向问题解决办法汇总
    在进行Python爬虫任务时,遇到重定向问题是常见的问题之一。重定向是指在发送请求时,服务器会返回一个新的URL,将请求重新定向到该URL。为了帮助您解决这个问题,本文将提供一些实用的解决办法,并给出相关的代码示例,希望能对您的爬虫任务有所帮助。了解重定向问题重定向问题通常是由于网......
  • T1的题解
    一道小清新的思维题!和\(bocchi\)酱一样可爱的喵30pts首先典中典套路:破环成链,数组复制一份。设\(to[i]=\max(\mathbbj)(j\geqi\wedge\sum_{i\leql\leqj}a_l\leqk)\)枚举起始下标,容易想到贪心,考虑前\(i\)个已经确定好怎样分段了,下一个段一定是\([i,to[i]]......
  • P4826 [USACO15FEB] Superbull S题解
    SuperbullS题解题目传送门(可点击)题面题目描述\(Bessie\)和她的朋友们正在一年一度的\(Superbull\)锦标赛中打球,而\(Farmer\)\(John\)负责让比赛尽可能激动人心。总共有N支队伍(\(1\leN\le2000\))参加了\(Superbull\)锦标赛。每个团队都有一个\(1...2^{30}−1\)的团队ID......
  • java 同一个对象之间赋值后添加入List中,属性值相互覆盖的问题解决方案
    1、for循环中NEW对象,因为List中存的是对象的引用地址。2、BeanUtils是属于spring框架下beans包下的工具类BeanUtils它提供了对java反射和自省API的包装。它里面还有很多工具类,这篇文章我们介绍一下copyProperties这个方法使用情景一般当我们有两个具有很多相同属性的JavaBean......
  • RTSP流媒体服务器LntonNVR(源码版)平台前端打包出现“UglifyJsPlugin”报错的问题解决
    LntonNVR既有软件版也有硬件版,平台基于RTSP/Onvif协议将前端设备接入,可实现的视频能力有视频监控直播、录像、视频转码分发、检索与回放、云存储、智能告警、国标级联等。平台可将接入的视频流进行转码分发,对外输出的视频流格式包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等。......