题目链接: https://vjudge.net/contest/237052#problem/H

这里给你一串数字,让你计算同时拥有这串数字最大值和最小值的子集(连续)和子序列(可以不连续)的数量,计算子串的数量是为了避免重复,我们可以从前往后扫描,前面的子集不能包括后面的,后面的可以包括前面的,我们每次记录最小值和最大值的位置t1,t2,起初把t1,t2设为0,每当遇到最大值或最小值是就把t1或t2的值变成最小值或最大值的下标,然后sum=sum+min(t1,t2),我也是刚刚看别人博客才知道的,举个例子:

2 1 4 3 2 1   min=1,max=4,t1=0,t2=0;

i=1, t1=0,t2=0,sum=min(0,0)+sum=0;

i=2, t1=2,t2=0,sum=min(2,0,)+sum=0;

i=3, t1=2,t2=3,sum=min(2,3)+sum=2,有2 1 4和1 4

i=4, t1=2,t2=3,sum=min(2,3)+sum=4, 有2 1 4 3和1 4 3

i=5, t1=2,t2=3,sum=min(2,3)+sum=6,有2 1 4 3 2和1 4 3 2

i=6, t1=6,t2=3,sum=min(6,3)+sum=9,有2 1 4 3 2 1和1 4 3 2 1 和4 3 2 1

然后我们要求子序列的话可以用两种方法求,一种是排列组合,我们在上面求子集数量时同时求最大值和最小值的数量,因为可能会多次出现,分别设为min_num,max_num,那我们如果要用排列组合算的话就是(2^min_num-1)*(2^max_num-1)*2^(n-min_num-max_num),自己揣摩一下,然后用容斥原理的话就是所有情况-没有最大值的情况-没有最小值的情况+没有最大值和最小值的情况

看代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const ll inf=0xffffff;
const ll mod=;
ll n,m,k,t;
ll num[];
ll cal(ll a,ll b)
{
ll ans=;
while(b)
{
if(b&)
ans=ans*a%mod;
a=a*a%mod;
b>>=;
}
return ans;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n;
ll min1=inf,max1=,min_num=,max_num=;
ll sum1=,sum2=;
for(int i=;i<=n;i++)
{
cin>>num[i];
min1=min(min1,num[i]);
max1=max(max1,num[i]);
}
if(min1==max1)
{
sum1=n*(n+)/%mod;
sum2=cal(,n)-;
cout<<sum1<<' '<<sum2<<endl;
continue;
}
ll t1=,t2=;
for(int i=;i<=n;i++)
{
if(min1==num[i])
{
t1=i;
min_num++;
}
if(max1==num[i])
{
t2=i;
max_num++;
}
sum1=(min(t1,t2)+sum1)%mod;
}
sum2=((cal(,min_num)-)%mod*(cal(,max_num)-)%mod*cal(,n-max_num-min_num))%mod;//排列组合
/*sum2=(cal(2,n)-cal(2,n-max_num)-cal(2,n-min_num)+cal(2,n-max_num-min_num))%mod;//容斥原理
if(sum2<0)
sum2+=mod;*/
cout<<sum1<<' '<<sum2<<endl;
}
return ;
}

排列组合或容斥原理 SPOJ - AMR11H的更多相关文章

  1. 【专题】计数问题(排列组合,容斥原理,Prufer序列)

    [容斥原理] 对于统计指定排列方案数的问题,一个方案是空间中的一个元素. 定义集合x是满足排列中第x个数的限定条件的方案集合,设排列长度为S,则一共S个集合. 容斥原理的本质是考虑[集合交 或 集合交 ...

  2. hdu 4497 GCD and LCM 质因素分解+排列组合or容斥原理

    //昨天把一个i写成1了 然后挂了一下午 首先进行质因数分解g=a1^b1+a2^b2...... l=a1^b1'+a2^b2'.......,然后判断两种不可行情况:1,g的分解式中有l的分解式中 ...

  3. HDU 4497 GCD and LCM(分解质因子+排列组合)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L.告诉你G.L,求满 ...

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

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

  5. [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)

    [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...

  6. [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理)

    [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理) 题面 用3种颜色对\(n×n\)的格子染色,问至少有一行或一列只有一种颜色的方案数.\((n≤10^6)\) ...

  7. GYM 101933K(二项式反演、排列组合)

    方法一 设\(f_i\)为最多使用\(i\)种颜色的涂色方案,\(g_i\)为恰好只使用\(i\)种颜色的涂色方案.可知此题答案为\(g_k\). 根据排列组合的知识不难得到\(f_k = \sum_ ...

  8. 学习sql中的排列组合,在园子里搜着看于是。。。

    学习sql中的排列组合,在园子里搜着看,看到篇文章,于是自己(新手)用了最最原始的sql去写出来: --需求----B, C, F, M and S住在一座房子的不同楼层.--B 不住顶层.C 不住底 ...

  9. .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)

    今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几 ...

随机推荐

  1. git openssl 模块生成 https 请求的 ssl 测试证书

    1,请先确定安装了相关模块 1.1,git --version 1.2,openssl version -a 2,创建一个目录, cd 到该目录下 3,生成私钥  key 文件   openssl g ...

  2. Appium -选择、操作元素

    选择界面元素 操作元素(点击.输入字符.拖拽.获取页面元素的各种属性) 根据Appium获取的数据进行分析和处理 desired_capabilities 查看appPackage 和appActiv ...

  3. 浅谈 CAS

    CAS: CAS:Compare and Swap, 翻译成比较并交换. java.util.concurrent包中借助CAS实现了区别于 synchronized 同步锁的一种乐观锁. CAS应用 ...

  4. day37-常见内置模块六(其他模块)

    其他内置模块 1.subprocess(系统交互)模块 2.math模块 3.zipfile模块 4.keyword模块 5....

  5. vue - @click 用到的修饰符

    1.vue提供的方法 .stop .prevent .capture .self .once .passive <!-- 阻止单击事件继续传播 --><a v-on:click.st ...

  6. Spark/Storm/Flink

    https://www.cnblogs.com/yaohaitao/p/5703288.html  Spark Streaming与Storm的应用场景 对于Storm来说:1.建议在那种需要纯实时, ...

  7. linux文本处理笔记

    cut: 按列操作文本 sort: 排序 uniq: 去重,去除连续重复行 cut -d 'delimiter' -f start-end filename.txt   # -d 表示分割符号,del ...

  8. UNITY 多个子MESH与贴图的对应关系

    多个贴图时,与子MESH一一对应,如果多了 ...还待研究如何对应

  9. html兼容手机浏览器

    其实主要就是改掉HTML页面声明: 在网页中加入以下代码,就可以正常显示了: <meta name="viewport" content="width=device ...

  10. C++随记

    1.const限定符 const限定变量的值不可变,并且const对象必须要初始化 const int buf = 512; //正确,表明buf的值为512 buf = 400;  //错误,buf ...