【传送门】

FFT第三题!

其实就是要求有多少三元组满足两短边之和大于等于第三边。

考虑容斥,就是枚举最长边,另外两个数组里有多少对边之和比它小,然后就是 $n^3$ 减去这个答案。

当 $n \leq 1000$ 时,直接暴力,因为如果继续 FFT 的话复杂度是 $O(slogs)$,$s$ 表示值域,值域都到 $10^5$,$100$ 组吃不消。

比 $1000$ 大就 FFT 做即可。

#include <bits/stdc++.h>

struct Complex {
double r, i;
void clear() { r = i = 0.0; }
Complex(double r = , double i = ): r(r), i(i) {}
Complex operator + (const Complex &p) const { return Complex(r + p.r, i + p.i); }
Complex operator - (const Complex &p) const { return Complex(r - p.r, i - p.i); }
Complex operator * (const Complex &p) const { return Complex(r * p.r - i * p.i, r * p.i + i * p.r); }
}; const double pi = acos(-1.0);
const int N = 5e5 + ;
int n, limit, l, r[N]; void FFT(Complex *a, int n, int pd) {
for (int i = ; i < n; i++)
if (i < r[i])
std::swap(a[i], a[r[i]]);
for (int mid = ; mid < n; mid <<= ) {
Complex wn(cos(pi / mid), pd * sin(pi / mid));
for (int l = mid << , j = ; j < n; j += l) {
Complex w(1.0, 0.0);
for (int k = ; k < mid; k++, w = w * wn) {
Complex u = a[k + j], v = w * a[k + j + mid];
a[k + j] = u + v;
a[k + j + mid] = u - v;
}
}
}
if (pd < )
for (int i = ; i < n; i++)
a[i] = Complex(a[i].r / n, a[i].i / n);
} #define ll long long int A[N], B[N], C[N];
ll cntA[N], cntB[N], cntC[N]; void init(int val) {
for (int i = ; i <= val; i++)
cntA[i] = cntB[i] = cntC[i] = ;
} void solve1() {
int val = * std::max(A[n], std::max(B[n], C[n])) + ;
for (int i = ; i <= val; i++)
cntA[i] += cntA[i - ], cntB[i] += cntB[i - ], cntC[i] += cntC[i - ];
ll ans = ;
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++) {
int cur = A[i] + B[j];
ans += cntC[val] - cntC[cur];
cur = A[i] + C[j];
ans += cntB[val] - cntB[cur];
cur = B[i] + C[j];
ans += cntA[val] - cntA[cur];
}
ans = 1LL * n * n * n - ans;
assert(ans >= );
printf("%lld\n", ans);
} Complex a[N], b[N], c[N], res[N]; void solve2() {
limit = , l = ;
int val = * std::max(A[n], std::max(B[n], C[n])) + ;
while (limit <= val) limit <<= , l++;
for (int i = ; i < limit; i++)
r[i] = r[i >> ] >> | ((i & ) << (l - ));
for (int i = ; i < limit; i++)
a[i] = Complex((double)cntA[i], 0.0), b[i] = Complex((double)cntB[i], 0.0), c[i] = Complex((double)cntC[i], 0.0);
for (int i = ; i <= val; i++)
cntA[i] += cntA[i - ], cntB[i] += cntB[i - ], cntC[i] += cntC[i - ];
FFT(a, limit, ); FFT(b, limit, ); FFT(c, limit, );
for (int i = ; i < limit; i++)
res[i] = a[i] * b[i];
FFT(res, limit, -);
ll ans = ;
for (int i = ; i < limit; i++) {
ll temp = (ll)(res[i].r + 0.5);
ans += (cntC[val] - cntC[i]) * temp;
}
for (int i = ; i < limit; i++)
res[i] = b[i] * c[i];
FFT(res, limit, -);
for (int i = ; i < limit; i++) {
ll temp = (ll)(res[i].r + 0.5);
ans += (cntA[val] - cntA[i]) * temp;
}
for (int i = ; i < limit; i++)
res[i] = a[i] * c[i];
FFT(res, limit, -);
for (int i = ; i < limit; i++) {
ll temp = (ll)(res[i].r + 0.5);
ans += (cntB[val] - cntB[i]) * temp;
}
ans = 1LL * n * n * n - ans;
assert(ans >= );
printf("%lld\n", ans);
} int main() {
int T;
scanf("%d", &T);
for (int kase = ; kase <= T; kase++) {
scanf("%d", &n);
int x = ;
for (int i = ; i <= n; i++)
scanf("%d", A + i), x = std::max(x, A[i]);
for (int i = ; i <= n; i++)
scanf("%d", B + i), x = std::max(x, B[i]);
for (int i = ; i <= n; i++)
scanf("%d", C + i), x = std::max(x, C[i]);
init(N - );
std::sort(A + , A + + n);
std::sort(B + , B + + n);
std::sort(C + , C + + n);
for (int i = ; i <= n; i++)
cntA[A[i]]++, cntB[B[i]]++, cntC[C[i]]++;
printf("Case #%d: ", kase);
if (n <= ) solve1();
else solve2();
}
return ;
}

The Preliminary Contest for ICPC Asia Shanghai 2019 C. Triple的更多相关文章

  1. The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力)

    The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力) 传送门:https://nanti.jisuanke.com/ ...

  2. The Preliminary Contest for ICPC Asia Shanghai 2019

    传送门 B. Light bulbs 题意: 起初\(n\)个位置状态为\(0\),\(m\)次操作,每次操作更换区间状态:\(0\)到\(1\),\(1\)到\(0\). 共有\(T,T\leq 1 ...

  3. 01背包方案数(变种题)Stone game--The Preliminary Contest for ICPC Asia Shanghai 2019

    题意:https://nanti.jisuanke.com/t/41420 给你n个石子的重量,要求满足(Sum<=2*sum<=Sum+min)的方案数,min是你手里的最小值. 思路: ...

  4. 给定进制下1-n每一位数的共享(Digit sum)The Preliminary Contest for ICPC Asia Shanghai 2019

    题意:https://nanti.jisuanke.com/t/41422 对每一位进行找循环节规律就行了. #define IOS ios_base::sync_with_stdio(0); cin ...

  5. The Preliminary Contest for ICPC Asia Shanghai 2019 A. Lightning Routing I

    传送门 因为某些原因,所以我就去学了 $LCT$ 维护直径, $LCT$ 维护直径我上一个博客讲得很详细了:传送门 这里维护虚儿子用的是 $multiset$ ,没写可删堆 #include<i ...

  6. The Preliminary Contest for ICPC Asia Shanghai 2019 L. Digit sum

    题目:https://nanti.jisuanke.com/t/41422 思路:预处理 #include<bits/stdc++.h> using namespace std; ][]= ...

  7. The Preliminary Contest for ICPC Asia Shanghai 2019 J. Stone game

    题目:https://nanti.jisuanke.com/t/41420 思路:当a(a∈S′)为最小值 如果Sum(S′)−a≤Sum(S−S′)成立 那么(∀t∈S′,Sum(S′)−t≤Sum ...

  8. The Preliminary Contest for ICPC Asia Shanghai 2019 D. Counting Sequences I

    题目:https://nanti.jisuanke.com/t/41412思路:dfs           先取ai>2  2^12>3000 因此至多取11个 其余用1补        ...

  9. The Preliminary Contest for ICPC Asia Shanghai 2019 B. Light bulbs

    题目:https://nanti.jisuanke.com/t/41399 思路:差分数组 区间内操作次数为奇数次则灯为打开状态 #include<bits/stdc++.h> using ...

随机推荐

  1. Luogu P4585 [FJOI2015]火星商店问题

    颓文化课作业到很晚写篇博客清醒一下 首先我们仔细阅读并猜测了题意之后,就会想到一个暴力的线段树套可持久化0/1Trie的做法,但是它显然是过不去的 由于最近再做线段树分治的题,我们可以想到用线段树分治 ...

  2. [NewLife.XCode]百亿级性能

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  3. 解决python 缺少os.fspath

    在python3.6下运行pandas会报错缺少os.fspath 升级到python3.7 3.7 安装参考:https://www.cnblogs.com/jifeng/p/11221469.ht ...

  4. python-2-条件判断

    前言 python3当中的条件语句是非常简单简洁的,说下这两种:if 条件.while 条件. 一.if 条件语句 1.if 语句: # 如果条件成立,打印666 if True: print(666 ...

  5. 手风琴效果 animate

    animate的手风琴效果 <style type="text/css"> * { margin: 0; padding: 0; } ul{ list-style: n ...

  6. tensorflow之tf.shape()

    tf.shape()这个方法就相当于numpy当中shape属性. 下面通过列子来了解: 具体而言,tf.shape是用来获取张量的维度(shape).

  7. dubbo入门教程-从零搭建dubbo服务

    [原创 转载请注明出处] 本文是学习了dubbo之后自己手动写的,比较通俗,很多都是自己学习之后的理解,写的过程中没有参考任何文章. 另外dubbo也有官方文档,但是比较官方,也可以多看看dubbo的 ...

  8. 短的 Guid 帮助类

    直接贴代码了: /// <summary> /// 短的 Guid 帮助类 /// </summary> public class ShortGuidHelper { #reg ...

  9. Navicat Premium 12.0.22 安装与破解

    一.安装 Navicat Premium 12.0.22的下载链接:https://pan.baidu.com/s/1swRY_fwIZfufdxDZj3hDyw 密码:09k8 安装步骤就是一路向下 ...

  10. dedecms用runphp功能,写for循环,@me输出不出来

    今天在{dede:field name='typeid' runphp='yes'}中写for循环,出现@me输出不了内容,把for循环删掉之后,就可以输出.死了几十万脑细胞,没有解决,后来把循环 f ...