hdu 4000Fruit Ninja 树状数组
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2048 Accepted Submission(s): 805
题意:给出1~N的一种排列,问存在多少个三元组(x,y,z) x < z < y 其中x y z 的位置递增
可先求出满足 x < y < z 和x < z < y的总数tot, 总数为:对于每一个数 x, 从x后面的位置中比x大的num个数中选择任意两个, 即 tot += comb[ num ][2]
再从总数tot中减去 x < y < z的数量即为答案, x < y < z 的个数为: 对于一个数y, 在y的前面比 y小的个数为 low, 在y的后面比y大的个数为 high, 根据组合原理,在low中选一个x, 在high中选一个z,共有low × high中情况
如何求 每个数的low值和high值, 就用树状数组来统计
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#define Lowbit(x) ((x) & (-x))
using namespace std;
typedef long long LL;
const int N = 100005;
const int M = 100000007;
int c[N], a[N];
LL low[N], high[N], comb[N][5];
int n;
void pre_c()
{
for(int i = 0; i < N; ++i)
for(int j = 0; j <= min(i,2); ++j)
comb[i][j] = (i == 0 || j == 0) ? 1:((comb[i - 1][j] % M + comb[i - 1][j - 1]) % M);
}
void update(int pos)
{
while(pos <= n) {
c[pos]++;
pos += Lowbit(pos);
}
}
LL sum(int pos)
{
LL res = 0;
while(pos) {
res += c[pos];
pos -= Lowbit(pos);
}
return res;
}
int main()
{
int _, v, cas = 1;
pre_c();
scanf("%d", &_);
while(_ --)
{
scanf("%d", &n);
memset(c, 0, sizeof c);
for(int i = 1; i <= n; ++i) {
scanf("%d", &v);
a[i] = v;
low[i] = sum(v); update(v);
high[i] = (n - v) - (i - 1 - low[i]);
} // for(int i = 1; i <= n; ++i) printf("%lld %lld\n", low[i], high[i]);
LL tot = 0;
for(int i = 1; i <= n; ++i) {
tot = tot % M + comb[ high[i] ][2];
tot = (tot - (low[i] % M * high[i] % M) + M) % M;
}
printf("Case #%d: %lld\n",cas++, tot % M ); }
}
hdu 4000Fruit Ninja 树状数组的更多相关文章
- HDU 2838 (DP+树状数组维护带权排序)
Reference: http://blog.csdn.net/me4546/article/details/6333225 题目链接: http://acm.hdu.edu.cn/showprobl ...
- HDU 2689Sort it 树状数组 逆序对
Sort it Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 4046 Panda 树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4046 When I wrote down this letter, you may have been ...
- hdu 5497 Inversion 树状数组 逆序对,单点修改
Inversion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5497 ...
- HDU 5493 Queue 树状数组
Queue Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5493 Des ...
- POJ 2352 && HDU 1541 Stars (树状数组)
一開始想,总感觉是DP,但是最后什么都没想到.还暴力的交了一发. 然后開始写线段树,结果超时.感觉自己线段树的写法有问题.改天再写.先把树状数组的写法贴出来吧. ~~~~~~~~~~~~~~~~~~~ ...
- hdu 1541 (基本树状数组) Stars
题目http://acm.hdu.edu.cn/showproblem.php?pid=1541 n个星星的坐标,问在某个点左边(横坐标和纵坐标不大于该点)的点的个数有多少个,输出n行,每行有一个数字 ...
- hdu 4031(树状数组+辅助数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Attack Time Limit: 5000/3000 MS (Java/Others) ...
- HDU 4325 Flowers 树状数组+离散化
Flowers Problem Description As is known to all, the blooming time and duration varies between differ ...
随机推荐
- 【XLL API 函数】xlCoerce
将 XLOPER/XLOPER12 转换为另一种类型,或是查询表格中的单元格值. 函数原型 Excel12(xlCoerce, LPXLOPER12 pxRes, 2, LPXLOPER12 pxSo ...
- Windows Form 中快捷键设置
在Windows Form程序中使用带下划线的快捷键只需要进行设置: 就能够工作.
- [Android] 关于getinstalledpackages参数的分析
reference to : http://blog.csdn.net/luojiusan520/article/details/47696891 getinstalledpackages()的方法 ...
- 内核中用于数据接收的结构体struct msghdr(转)
内核中用于数据接收的结构体struct msghdr(转) 我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,pin ...
- 数据结构和算法 – 5.模式匹配和文本处理
了使用正则表达式,需要把 RegEx 类引入程序.大家可以在 System.Text.RegularExpression 名字域中找到这种类.一旦把这种类导入了程序,就需要决定想要用 RegEx 类来 ...
- Hibernate的ORM原理和实现
>>Hibernate和ORM ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样 ...
- 理解理解python中的'*','*args','**','**kwargs'
http://blog.csdn.net/callinglove/article/details/45483097 讲了一大堆, 我也是用来理解类继承当中的参数行为的. =============== ...
- SQL分组和聚合(Grouping and Aggregates)
这章应该是难点,也是成为SQL高手的必经之路. 注意有GROUP 语句时,WHERE和HAVING的场合. 前者用于检索前的条件过滤 . 后者用于检索出来结果之后的条件过滤. ========== ; ...
- git branch用法总结
git branch git branch 不带参数:列出本地已经存在的分支,并且在当前分支的前面加“*”号标记,例如: #git branch* master newbranch ...
- hdu 4277 2012长春赛区网络赛 dfs+hashmap ***
hashmap判重大法好 #include<cstdio> #include<iostream> #include<algorithm> #include<c ...