DTOJ#5206. 序列

传送门

H 有一个长度为 2 n 2n 2n 的数列 C C C,但是他想拥有两个数列。于是他想从原数列中取出 n n n 个数作为数列 A A A,剩下 n n n 个数作为数列 B B B,这样就将一个数列拆分成了两个。

H 决定乱序的数组不够优美,因此他决定将数列 A A A 中的数从小到大排序,将数列 B B B 中的数从大到小排序,这样,数列看上去就十分整齐了。

H 认为拆分成数列 A A A 和数列 B B B 的优美程度为 ∑ i = 1 n ∣ A i − B i ∣ \sum_{i=1}^{n}{|A_i-B_i|} i=1nAiBi

H 原来想选出最优美的两个数列,但是他发现有选择困难症,所以他想知道,如果他随机拆分,数列 A A A 和数列 B B B 的期望优美程度是多少。

第一个一正整数 n n n

第二个 2 n 2n 2n 正整数,第 i i i 个数表示 c i c_i ci

一个数表示数列 A A A 和数列 B B B 的期望优美程度   m o d     998244353 \bmod ~ 998244353 mod 998244353

样例输入1
3 2 1 3 2 1 4
样例输出1
5
样例输入1
5 13 8 35 94 9284 34 54 69 123 846
样例输出1
10272

对于 20 % 20 \% 20% 的数据, n ≤ 10 n \le 10 n10

对于 40 % 40 \% 40% 的数据, n ≤ 100 n \le 100 n100

对于 60 % 60 \% 60% 的数据, n ≤ 5000 n \le 5000 n5000

对于 80 % 80 \% 80% 的数据, n ≤ 1 0 5 n \le 10^5 n105

对于 100 % 100 \% 100% 的数据, 1 ≤ n ≤ 1 0 6 , 1 ≤ c i ≤ 1 0 9 1 \le n \le 10^6, 1 \le c_i \le 10^9 1n106,1ci109
可以发现,前 n n n 大的数一定被减,后 n n n 大一定作减数。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll mod=998244353;
ll read(){
	ll op=1,sum=0;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') op=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+ch-'0',ch=getchar();
	return op*sum;
}
ll a[2000005];
int main(){
	int n=read();
	for(int i=1;i<=2*n;++i)a[i]=read();
	sort(a+1,a+1+2*n);
	ll ans=0;
	for(int i=1;i<=n;++i)ans=(ans+a[i+n]-a[i])%mod;
	printf("%lld\n",(ans+mod)%mod);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值