题意:给定n个数,求包含最大值和最小值的子集(数字连续)和子序列(数字不连续)的个数。

分析:

1、如果n个数都相同,则子集个数为N * (N + 1) / 2,子序列个数为2N-1。

2、将序列从头到尾扫一遍,每当找到一个最大值和最小值的位置maxid,minid,就以这两个位置的区间为基准,计算集合数。

例如:3 1 4 3 1

当i=2时,此时maxid=2,minid=1,因此由最大值和最小值---1和4能形成两个子集:3 1 4 和 1 4,即min(minid + 1, maxid + 1)个

当i=3时,此时maxid=2,minid=1,因此由最大值和最小值---1和4继续扩展,又能形成两个子集:3 1 4 3 和 1 4 3,

当i=4时,此时maxid=2,minid=4,因此由新的最大值和最小值---1和4继续扩展,又能形成三个子集:3 1 4 3 1 ,1 4 3 1,4 3 1。

3、记录序列中最大值和最小值的个数,分别为maxnum,minnum。

子序列个数为,只由最小值形成的集合数a*只由最大值形成的集合数b*不是最小值和最大值的数形成的集合数c

因为子序列中必须有最大值和最小值,因此a和b不能为空集,所以a=2minnum-1,b=2maxnum-1。

而c可以为空集,所以c=2n-minnum-maxnum

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-9;
inline int dcmp(double a, double b){
if(fabs(a - b) < eps) return 0;
return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const LL MOD = 1000000007;
const double pi = acos(-1.0);
const int MAXN = 100000 + 10;
const int MAXT = 1000 + 10;
using namespace std;
LL a[MAXN];
LL POW[MAXN];
void init(){
POW[0] = 1;
for(int i = 1; i < MAXN; ++i){
POW[i] = (POW[i - 1] * 2) % MOD;
}
}
int main(){
init();
int T;
scanf("%d", &T);
while(T--){
int N;
scanf("%d", &N);
LL _min = LL_INF;
LL _max = 0;
for(int i = 0; i < N; ++i){
scanf("%lld", &a[i]);
_max = max(_max, a[i]);
_min = min(_min, a[i]);
}
if(_max == _min){
LL sum1 = N * (N + 1) / 2;
LL sum2 = POW[N] - 1;
printf("%lld %lld\n", sum1, sum2);
continue;
}
int maxnum = 0;
int minnum = 0;
int minid = -1, maxid = -1;
LL sum1 = 0;
for(int i = 0; i < N; ++i){
if(a[i] == _min){
minid = i;
++minnum;
}
if(a[i] == _max){
maxid = i;
++maxnum;
}
(sum1 += min(minid + 1, maxid + 1)) %= MOD;
}
LL sum2 = ((((POW[minnum] - 1) * (POW[maxnum] - 1)) % MOD) * (POW[N - minnum - maxnum])) % MOD;
printf("%lld %lld\n", sum1, sum2);
}
return 0;
}

  

SPOJ - AMR11H Array Diversity (排列组合)的更多相关文章

  1. SPOJ - AMR11H Array Diversity (水题排列组合或容斥)

    题意:给定一个序列,让你求两种数,一个是求一个子序列,包含最大值和最小值,再就是求一个子集包含最大值和最小值. 析:求子序列,从前往记录一下最大值和最小值的位置,然后从前往后扫一遍,每个位置求一下数目 ...

  2. codeforces 57 C Array(简单排列组合)

    C. Array time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  3. Spring-2-H Array Diversity(SPOJ AMR11H)解题报告及测试数据

    Array Diversity Time Limit:404MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   Descript ...

  4. 排列组合或容斥原理 SPOJ - AMR11H

    题目链接: https://vjudge.net/contest/237052#problem/H 这里给你一串数字,让你计算同时拥有这串数字最大值和最小值的子集(连续)和子序列(可以不连续)的数量, ...

  5. [leetcode] 题型整理之排列组合

    一般用dfs来做 最简单的一种: 17. Letter Combinations of a Phone Number Given a digit string, return all possible ...

  6. 排列组合算法(PHP)

    用php实现的排列组合算法.使用递归算法,效率低,胜在简单易懂.可对付元素不多的情况. //从$input数组中取$m个数的组合算法 function comb($input, $m) { if($m ...

  7. js 排列 组合 的一个简单例子

    最近工作项目需要用到js排列组合,于是就写了一个简单的demo. 前几天在网上找到一个写全排列A(n,n)的code感觉还可以,于是贴出来了, 排列的实现方式: 全排列主要用到的是递归和数组的插入 比 ...

  8. PHP的排列组合问题 分别从每一个集合中取出一个元素进行组合,问有多少种组合?

    首先说明这是一个数学的排列组合问题C(m,n) = m!/(n!*(m-n)!) 比如:有集合('粉色','红色','蓝色','黑色'),('38码','39码','40码'),('大号','中号') ...

  9. Day4:T3搜索 T4数学题排列组合

    T3:搜索 很出名的题吧,费解的开关 同T2一样也是一题很考思考的 附上题解再解释吧: 对于每个状态,算法只需要枚举第一行改变哪些灯的状态,只要第一行的状态固定了,接下来的状态改变方法都是唯一的:每一 ...

随机推荐

  1. IP、TCP、DNS

    负责传输的IP协议 按层次分,IP网际协议位于网络层.几乎所有使用网络的系统都会用到 IP 协议. “IP”和“IP地址不同”,“IP”是一种协议的名称.IP 协议的作用是把各种数据包传送给对方.而要 ...

  2. java核心-多线程(6)-线程池-ThreadPoolExecutor

    1.java多线程编程少不了使用线程池,线程池相关的工具类所在jdk包,java.util.concurrent 2.使用示例 demo1 public class ThreadPoolDemo { ...

  3. C# 篇基础知识6——文件和流

    计算机以文件的形式把数据存储在磁盘.光盘等存储设备上.文件的管理和操作是操作系统的一个重要组成部分,.NET 框架提供了一组功能强大的类,可以方便地对文件进行操作和管理. 1.文件操作相关的类 用于文 ...

  4. 嵊州普及Day5T1

    题意:有n个商店,自家商店的定价不可高于任何一家商店定价,求自家商店最高定价. 思路:拿个变量打擂台即可,不用解释太多. 见代码: #include<iostream> #include& ...

  5. java与MySQL数据库的连接

    java与MySQL数据库的连接 1.数据库的安装和建立参见上一篇博客中的第1,2步骤.(http://blog.csdn.net/nuptboyzhb/article/details/8043091 ...

  6. VUE - 取消默认事件

    1,在 methods 中 <template>   <div>       <form @submit="addTodo">          ...

  7. define可变参数,float数据传输

    define可变参数 一般在调试打印Debug信息的时候, 需要可变参数的宏. 从C99开始可以使编译器标准支持可变参数宏(variadic macros), 另外GCC也支持可变参数宏, 但是两种在 ...

  8. Day5-T1

    原题目 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿.为了省事,小月言想切最少的刀数,使这n根火腿分成均等的m份.请问最少要切几刀? 第一行一 ...

  9. Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can't find referenced class问题的解决方案

    原文地址:http://blog.csdn.net/u_xtian/article/details/7495023 这个看似简单的问题困扰了我好久了,我已经google了很多相关的信息了,但是在我看来 ...

  10. Day6 - D - Tree 园丁的烦恼 HYSBZ - 1935

    很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: “最近我在思索一个问题, ...