【传送门】

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 ;
}

最新文章

  1. Struts2配置Result(Struts2_result)
  2. (转载)编写高效的jQuery代码
  3. jQuery小技巧
  4. 2015-11-04 报表(c#部分)(Datatable 查询,弹出日期控件,输入是否整数)
  5. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码
  6. HTML5 中已经可以用 Ajax 上传文件了,而且代码非常简单,借助 FormData 类即可发送文件数据。
  7. SQL*Net more data from client
  8. 监听&lt;input/&gt;标签行为的方法总结
  9. boost的并发库
  10. EF的泛型封装 写的很好 转自Fly_Elephant http://www.cnblogs.com/xiaofeixiang/p/4188600.html?utm_source=tuicool
  11. C语言运算符运算顺序判断实例2
  12. 视频加载logo
  13. 种树 BZOJ2151 模拟费用流
  14. Android 开源框架Glide的使用
  15. 两个左连接SQL执行计划解析(Oracle和PGSQL对比):
  16. mysql数据库授权
  17. 极致21点开发DAY1
  18. 常用命令npm,gulp, node
  19. Codeforces 815C Karen and Supermarket 树形dp
  20. linux 查看系统负载:uptime

热门文章

  1. MySQL实战45讲学习笔记:第三十五讲
  2. Python 中的时间处理包datetime和arrow
  3. java虚拟机规范学习笔记之数据类型
  4. Uboot启动流程分析(三)
  5. vue自定义事件---拖拽
  6. Web页面精确定位
  7. [LeetCode#178]Rank Scores
  8. JVM的监控工具之jstat
  9. Beats Elastic中的Auditbeat使用介绍
  10. ExcelHelper based on NPOI