博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LightOJ 1372 (枚举 + 树状数组)
阅读量:4968 次
发布时间:2019-06-12

本文共 1435 字,大约阅读时间需要 4 分钟。

题目

输出序列中有多少个组合 {
a1,a2,a3,a4,a5,a6}可以构成一个六边形。

分析

序列每个数都不相等。

所以可以设 a1<a2<a3<a4<a5<a6
把六边形分解为 4 个三角形, 又可以得出
a1+a2+a3+a4+a5>a6:
a1+a2+a3>a6a5a4
a4 固定的情况下, a3[a3,a4)
所以我们枚举 , 用树状数组维护。

Code

#include 
using namespace std;const int maxn = 5000000 + 131;int C[maxn];int lowbit(int x) { return x &(-x);}int Sum(int x) { int ret = 0; while(x) { ret += C[x]; x -= lowbit(x); } return ret;}void Add(int pos) { while(pos < maxn) { C[pos] ++; pos += lowbit(pos); }}int Num[105];int main() { int T; scanf("%d",&T); for(int kase = 1; kase <= T; ++kase) { memset(C, 0, sizeof(C)); int N; scanf("%d",&N); for(int i = 0; i < N; ++i) scanf("%d",Num+i); sort(Num, Num+N); int Ans = 0, LowZ = 0; //小于0的情况用LowZ 统计 for(int i = N-1; i >= 0; --i) { for(int j = 0; j < i; ++j) for(int k = j+1; k < i; ++k) { int sum = Num[i] + Num[j] + Num[k]; Ans += Sum(sum-1); Ans += LowZ; } for(int j = i + 1; j < N; ++j) for(int k = j + 1; k < N; ++k) { int sub = Num[k] - Num[j] - Num[i]; if(sub > 0) Add(sub); else LowZ ++; } } printf("Case %d: %d\n",kase, Ans); } return 0;}

转载于:https://www.cnblogs.com/aoxuets/p/5506824.html

你可能感兴趣的文章
每次阅读外文技术资料都头疼,终于知道原因了。
查看>>
zabbix短信网关调用问题总结
查看>>
130242014034-林伟领-实验一
查看>>
Forbidden You don't have permission to access / on this server.
查看>>
Windows server 2008 R2中安装MySQL !
查看>>
Intellij Idea新建web项目(转)
查看>>
raspberry 安装apache2,使其支持ssl ,并创建自签名证书
查看>>
Trie树:应用于统计和排序
查看>>
C语言结构体和函数
查看>>
用JAVA编写浏览器内核之实现javascript的document对象与内置方法
查看>>
linux 命令之top
查看>>
洛谷 [P3033] 牛的障碍
查看>>
centos iptables
查看>>
unity3d 移动与旋转 2
查看>>
寻找二叉查找树中比指定值小的所有节点中最大的那个节点
查看>>
如何设置输入框达到只读效果
查看>>
RT3070 USB WIFI 在连接socket编程过程中问题总结
查看>>
MIS外汇平台荣获“2013年全球最佳STP外汇交易商”
查看>>
LeetCode 题解之Add Digits
查看>>
Xml处理工具类(Jdom)
查看>>