题意:对于一个数列A,substring是一个连续子串,subsequence是其非连续子序列。对于一个数字序列,记它的diversity是它的最大元素减去最小元素的差。给出一个数字序列,求与它diversity相同的substring和subsequence各有多少个。比如若A为1,4,3,4,则答案为3和6。

解法:组合数学问题。首先,记A中最大元素为ma,最小元素为mi,且最大元素有s1个,最小元素有s2个,数列A长度为n。

   则A的所有subsequence共有2^n个,不含ma的subsequence有2^(n-s1)个,不含mi的subsequence有2^(n-s2)个,mi和ma都不含的有2^(n-s1-s2)个,由容斥原理,所求为2^n - 2^(n-s1) - 2^(n-s2) + 2^(n-s1-s2)个。

   对于substring的个数,选取的的substring为A[begin] 到 A[end],枚举end从0到n-1,并且用t1记录目前位置最后出现的mi的位置,t2记录目前最后出现的ma的位置,则对于每个枚举的end,ans += min(t1, t2)。详见代码。

比赛的时候没有想清楚,substring个数的求法写得好复杂。。。后来看了男神代码自己默默模仿了一份。。。。

tag:组合数学,counting

 /*
* Author: Plumrain
* Created Time: 2013-12-03 19:43
* File Name: math-LA-5990.cpp
*/
#include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; typedef long long int64;
const int64 mod = ;
const int N = ; int64 g[N], a[N];
int64 min(int64 a, int64 b) {return a > b ? b : a;}
int64 max(int64 a, int64 b) {return a > b ? a : b;} int main()
{
g[] = ;
for (int i = ; i < N; ++ i)
g[i] = g[i-] * % mod; int T, n;
scanf ("%d", &T);
while (T--){
int64 mi = mod, ma = ;
scanf ("%d", &n);
for (int i = ; i < n; ++ i){
scanf ("%lld", &a[i]);
mi = min(mi, a[i]);
ma = max(ma, a[i]);
} int64 ans1 = , ans2 = ; if (mi == ma){
ans1 = ((int64)(n + ) * n / ) % mod;
ans2 = g[n] - ;
printf ("%lld %lld\n", ans1, ans2);
continue;
} int t1 = -, t2 = -, s1 = , s2 = ;
for (int i = ; i < n; ++ i){
if (a[i] == mi){
++ s1; t1 = i;
}
if (a[i] == ma){
++ s2; t2 = i;
} ans1 = (ans1 + min(t1+, t2+)) % mod;
} ans2 = (g[n] - g[n-s1] - g[n-s2] + g[n-s1-s2]) % mod;
if (ans2 < ) ans2 += mod;
printf ("%lld %lld\n", ans1, ans2);
}
return ;
}

UVALive 5990 Array Diversit的更多相关文章

  1. UVALive - 3942 Remember the Word[树状数组]

    UVALive - 3942 Remember the Word A potentiometer, or potmeter for short, is an electronic device wit ...

  2. UVALive - 6436、HYSBZ - 2435 (dfs)

    这两道题都是用简单dfs解的,主要是熟悉回溯过程就能做,据说用bfs也能做 道路修建(HYSBZ - 2435) 在 W 星球上有n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道 ...

  3. UVALive 6426

    UVALive 6426 /** 题意:给一个n*m的矩阵,求某一个区间的数的数量 做法:刚开始想用树状数组,但是RE,题目中说数据是从二进制流中读入, 用scanf会挂掉 所以用fread 读入 s ...

  4. 计蒜客 A1607 UVALive 8512 [ACM-ICPC 2017 Asia Xi'an]XOR

    ICPC官网题面假的,要下载PDF,点了提交还找不到结果在哪看(我没找到),用VJ交还直接return 0;也能AC 计蒜客题面 这个好 Time limit 3000 ms OS Linux 题目来 ...

  5. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  6. ES5对Array增强的9个API

    为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...

  7. JavaScript Array对象

    介绍Js的Array 数组对象. 目录 1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.fo ...

  8. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  9. 关于面试题 Array.indexof() 方法的实现及思考

    这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...

随机推荐

  1. angularjs 利用filter进行表单查询及分页查询

    页面: <div> <input style="width:90%;margin-left:5px;margin-right:5px;" class=" ...

  2. PDF在线预览

    1.所需插件jquery.media.js或者pdfobject.js 代码: <html> <head> <style type="text/css" ...

  3. 苹果开发 笔记(80)升级IOS 9 和 XCode 7 引起的问题记录

    原文: http://blog.csdn.net/hero82748274/article/details/48629461 问题一: 升级xcode 7最低的系统配置要求 升级了ios9 后使用 x ...

  4. 段落排版--中文字间距、字母间距(letter-spacing, word-spacing)

    中文字间隔.字母间隔设置: 如果想在网页排版中设置文字间隔或者字母间隔就可以使用    letter-spacing 来实现,如下面代码: h1{ letter-spacing:50px; } ... ...

  5. servlet的提交

    servlet的提交和动态改变有点依赖xml 我们点击控件的时候改变了里面的变量,改变了xml,servlet发现变量变了,就会刷新页面 如果xml文档没有更新,浏览器采用缓存而不则行 <for ...

  6. 在用VC编译下debug和release的什么区别

    DEBUG和RELEASE 版本差异及调试相关问题:.         内存分配问题 1.          变量未初始化.下面的程序在debug中运行的很好. thing * search(thin ...

  7. 258. Add Digits(C++)

    258. Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has ...

  8. php5.6安装

    # yum --enablerepo=remi,remi-php56 install php-fpm php-common php-mysql php-opcache php-pear php-gd ...

  9. Qt Creator编译问题

    有时候需要自己编译Qt Creator,需要注意的就是qmake版本的问题,比如我用4.8.1和4.8.6同样编译出来的Qt Creator在同样的qtconfig-qt4下所呈现的效果是不一样的. ...

  10. 浅谈Chrome V8引擎中的垃圾回收机制

    垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带 ...