题目链接: 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 ;
}

最新文章

  1. 【小贴士】【stringify神BUG】【localstorage失效】【消灭Safari alert框】【是否延迟加载】【页面10px白屏】
  2. 使用 Python 切割图片
  3. 您只能在 HTML 输出流中使用 document.write。如果您在文档已加载后使用它(比如在函数中),会覆盖整个文档。
  4. 如何在Actionbarsherlock中一直显示overflow效果?
  5. Java中如何解决double和float精度不准的问题
  6. Android开发--环境配置
  7. Cycles_per_instruction
  8. Oracle 11g 客户端 下载地址
  9. 2 通过JNI混合使用Java和C++ -----&gt; 访问数组
  10. check_area
  11. puts fputs printf的区别
  12. Win32_Battery class
  13. 【滚动数组】【状压dp】Gym - 100956F - Colored Path
  14. BZOJ 4269: 再见Xor [高斯消元 线性基]
  15. python 字符串拼接
  16. linux下pip安装pygame
  17. navicat premium 的使用——navicat 连接MySQL数据库
  18. Mininet实验 设置带宽之简单性能测试
  19. 沉淀再出发:使用python进行机器学习
  20. [CodeForce455A]Boredom

热门文章

  1. elcipse 安装lombok插件解决 @Slf4j 等找不到log变量问题
  2. UDP通讯协议实例
  3. 字符串md5之后转成int类型, 方便数据库索引
  4. 使用 Python 把多个 MP4 合成一个视频(转)
  5. Java设置运行时环境参数
  6. MySql出现大量LAST_ACK的解决办法
  7. Pronunciation – The Definitive Guide to the Top 100 Words in American English
  8. [ SHELL编程 ] 文件内容大小写替换
  9. Matlab实现单层感知机网络识别字母
  10. HTML框架、列表、表格