Codeforces 102394I Interesting Permutation 思维
题意:
你有一个长度为n的序列a(这个序列只能使用[1,n]区间内的数字,每个数字只能使用一次),通过a序列可以构造出来三个相同长度的序列f、g、h
- For each 1≤i≤n, fi=max{a1,a2,…,ai};
- For each 1≤i≤n, gi=min{a1,a2,…,ai};
- For each 1≤i≤n, hi=fi−gi.
问你,如果给你h序列,你要找出来满足h序列的a序列的个数。答案很大你可以取模于1e9+7
题解:
一、
首先先特判掉几种情况
1、如果h数组里面出现hi>n-1,那么直接输出0
2、如果h数组里面没有出现n-1,那么直接输出0
3、如果h数组是非严格递增序列就不特判,否则输出0
4、如果h0不等于0,直接输出0
二、
1、对于剩下的情况,如果hi>hi-1,那么hi这个位置上面不是前i个中的最大值就是最小值。有两种情况,所以结果乘于2
2、如果hi==hi-1,那么证明hi这个位置上的数字是[1,i-1]这个区间内的最大数字和最小数字之间的数字。我们假设这个区间内最大数字hi和最小数字hj之间的数字有num个还没有使用过,那么答案就可以乘于num
那么这个num怎么计算呢,其实对于hi>hi-1,它们的差值hi-h(i-1)-1就是在原num的基础上又新增加了hi-h(i-1)-1个最大值和最小值之间没使用过的中间数字
(以上hi-1代表下标为i-1的h数组中对应的值)
为什么hi-h(i-1)还要再减去1,是因为hi也占用了一个数字
代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
typedef long long ll;
ll h[maxn];
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
{
ll n,flag=0,flag1=0;
h[0]=0;
scanf("%lld",&n);
for(ll i=1;i<=n;++i)
{
scanf("%lld",&h[i]);
if(h[i]==n-1) flag1=1;
if(h[i]<h[i-1]) flag=1;
if(h[i]>n-1) flag=1;
}
if(h[1]!=0) flag=1;
if(flag || !flag1)
{
printf("0\n");
continue;
}
ll num=0,ans=1;
for(ll i=2;i<=n;++i)
{
if(h[i]>h[i-1]) ans=(ans<<1)%mod,num+=(h[i]-h[i-1]-1);
else
{
ans=(ans*num)%mod;
num--;
}
}
printf("%lld\n",ans);
}
return 0;
}
Codeforces 102394I Interesting Permutation 思维的更多相关文章
- The 2019 China Collegiate Programming Contest Harbin Site I. Interesting Permutation
链接: https://codeforces.com/gym/102394/problem/I 题意: DreamGrid has an interesting permutation of 1,2, ...
- Codeforces 482B Interesting Array(线段树)
题目链接:Codeforces 482B Interesting Array 题目大意:给定一个长度为N的数组,如今有M个限制,每一个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是 ...
- codeforces 482B. Interesting Array【线段树区间更新】
题目:codeforces 482B. Interesting Array 题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val. 就是区间l---r上的与的值为val,最后问你原来的数 ...
- [Codeforces 1208D]Restore Permutation (树状数组)
[Codeforces 1208D]Restore Permutation (树状数组) 题面 有一个长度为n的排列a.对于每个元素i,\(s_i\)表示\(\sum_{j=1,a_j<a_i} ...
- CodeForces 483C Diverse Permutation
Diverse Permutation Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64 ...
- Educational Codeforces Round 60 C 思维 + 二分
https://codeforces.com/contest/1117/problem/C 题意 在一个二维坐标轴上给你一个起点一个终点(x,y<=1e9),然后给你一串字符串代表每一秒的风向, ...
- Educational Codeforces Round 61 F 思维 + 区间dp
https://codeforces.com/contest/1132/problem/F 思维 + 区间dp 题意 给一个长度为n的字符串(<=500),每次选择消去字符,连续相同的字符可以同 ...
- Codeforces 863F - Almost Permutation
863F - Almost Permutation 题意 给出每个位置可以放的数字的范围,定义 \(cost = \sum_{i=1}^{n}(cnt(i))^2\) ,其中 \(cnt(i)\) 为 ...
- [Codeforces 1178D]Prime Graph (思维+数学)
Codeforces 1178D (思维+数学) 题面 给出正整数n(不一定是质数),构造一个边数为质数的无向连通图(无自环重边),且图的每个节点的度数为质数 分析 我们先构造一个环,每个点的度数都是 ...
随机推荐
- Viser报错:dodge is not support linear attribute, please use category attribute!
遇到这样的问题是因为x轴数据不能为为连续性的日期(日期格式为:YYYY-MM-DD),需要设置为分类属性(cat),有一些可能设置为timeCat,看具体情况 scale 参数支持以下类型 • ide ...
- .NET Core部署到linux(CentOS)最全解决方案,常规篇
本文为大家介绍使用 .NET Core部署到Linux服务器的方法,通过本文你将了解到Linux在虚拟机下的安装.Xshell,Xftp的使用方法.git在linux下的交互使用以及.net core ...
- 腾讯云COS对象存储占据数据容灾C位
说到公有云容灾,大家首先想到的是云上数据备份. 然而,随着企业核心业务逐渐从线下迁移到云上,客户提出了更高的要求.如何确保云上业务的高可用.数据的高可靠,这对云厂商提出了新的挑战. 腾讯云作为全球领先 ...
- linux下的命令自动补齐增强
linux 7 下 安装 bash-completion 可以实现命令的参数的自动补齐
- 5V充12.6V三节锂电池,5V升压12.6V的电路图
三串锂电池的充电电压是三串锂电池的最高电压值,就是12.6V了.5V充12.6V是5V给三串锂电池充电.如笔记本的USB口5V给三串锂电池充电,如5V的适配器或者手机充电器插上数据线给三串锂电池充电电 ...
- PAT练习num3-跟奥巴马一起学编程
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝"计算机科学教育周"正式启动,奥巴马编写了很简单的计算机 ...
- linux自定义位置安装tomcat8.5
1 下载tomcat安装文件 下载地址:https://tomcat.apache.org/download-80.cgi 2 解压文件 tar -zxvf apache-tomcat-8.5.56 ...
- python的零碎知识
1.Python代码操作git 安装 pip3 install gitpython 操作git import os from git.repo import Repo # gitpython def ...
- java虚拟机入门(二)-探索内存世界
上节简单介绍了一下jvm的内存布局以及简单概念,那么对于虚拟机来说,它是怎么一步步的让我们能执行方法的呢: 1.首先,jvm启动时,跟个小领导一样会根据配置参数(没有配置的话jvm会有默认值)向大领导 ...
- ADB 基本命令
ADB很强大,记住一些ADB命令有助于提高工作效率. 获取序列号: adb get-serialno 查看连接计算机的设备: adb devices 重启机器: adb reboot 重启到bootl ...