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 ...
随机推荐
- ZendStudio如何汉化
点击工具栏的help,看图 点击 Install New Sofaware... 看图 然后.... 在地址(12.0的版本):http://download.eclipse.org/techno ...
- supersr--打电话/短信分享/邮件分享
// Created by apple on 15/6/17. // Copyright (c) 2015年 Super All rights reserved. // #import " ...
- Spetember 5th 2016 Week 37th Monday
No matter how far you may fly, never forget where you come from. 无论你能飞多远,都别忘了你来自何方. Stay true to you ...
- 20145206《Java程序设计》第9周学习总结
20145206 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作 ...
- mysql里表以及列的增删改查
在一个表里插入数据(增) insert into 表名 (需要插入的列名如 id,name,age)values (1,'张三',20), (2,'李四',30): 查询表内容(查 ...
- C#学习笔记---协变和逆变
http://www.cnblogs.com/alphafly/p/4048608.html 协变是指方法能从委托的返回类型派生的一个类型. 逆变之方法获取的参数可以是委托参数类型的基类.
- 【数据库】 Sqlserver 2008 error 40出现连接错误的解决方法
经常要连接到远程数据库上,因此常常碰到这个错误,然后又屡次忘记解决方法,所以今天坐下笔迹,好下次能快速回忆起来. 一.首先检查数据库的TCP/TP是否启动 1.启动Sql server配置管理器 2. ...
- javascript 面向对象编程小记
虽然平常用jquery用的很熟,但是基本都是面向过程的写法.一个事件一个function,很少有面向对象的写法.今天得写一个日期控件,不得不用上面向对象编程. 刚开始我的想法是: var datepi ...
- PostgreSQL的时间/日期函数使用
PostgreSQL的常用时间函数使用整理如下: 一.获取系统时间函数 1.1 获取当前完整时间 select now(); david=# select now(); now ----------- ...
- log4j设置日志格式为UTF-8
想要log4j输出的日志文件的编码格式为UTF-8.正常情况下只需要添加下述的代码即可: log4j.appender.appender_name.Encoding=UTF-8 但是在spring与l ...