[codechef MEXDIV]Mex division
题目链接:https://vjudge.net/contest/171650#problem/I
直接用set+dp水过去了。。。
/*
设dp[i]表示前i个做划分满足条件的方案数
有一个显然的转移方程dp[i]=sigma(dp[j]) t<=j<=i-1
其中t是满足mex(a[t..i-1])<=k的最小的t
然后我们现在是想得到,对于每个位置这个t是多少,如果知道了这个,就可以很容易的转移了 首先,考虑,如果k>n,那么不管怎么选,都是会满足条件的啊!(就算把所有的数都选出来,mex也就是k吧)
所以对于k>n,直接输出2^(n-1)
当然k=0的时候特判一下,这样每个i对应的t都是存在的,至少有一个i 现在考虑k<=n的情况,直接用一个multiset记录[1,k]里的数的出现情况
首先,把[0,k]全部都放进multiset,遇到一个新的数,就erase,查询集合里最小的数就是mex 假设现在想得到第i个位置的t,上次求得的i-1对应的t是t'
那么如果a[i]已经在集合中被删去了,那这次对应的肯定还是t'
如果a[i]没有从集合中删去,就把a[i]从集合中删去(当然,如果a[i]>k直接不用管)
考虑到随着i的增大,t肯定是往右走的
如果删去以后集合是空集了,那t'就需要右移了,直到出现一个[0,k]之间的,并且在a[t+1..i]没有出现过的数
是否出现过,只需要记一个右边第一个跟它相等的数就可以了
*/ #include<bits/stdc++.h>
using namespace std; const int maxn=;
int a[maxn];
int t[maxn];
int e[maxn];
long long dp[maxn];
long long predp[maxn];
pair<int,int> p[maxn];
set<int> S; const long long md=;
long long fp(long long a,long long k)
{
long long res=;
a%=md;
while(k)
{
if(k&)res=res*a%md;
a=a*a%md;
k>>=;
}
return res;
} int main()
{
int n,k;
scanf("%d%d",&n,&k);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
if (k>n)
{
printf("%lld",fp(,n-));
return ;
}
if (k==)
{
bool yl=false;
for (int i=;i<=n;i++)
{
if (a[i]==)
{
yl=true;
break;
}
}
if (yl) printf("0\n");
else printf("%lld",fp(,n-));
return ;
}
S.clear();
for (int i=;i<=k;i++) S.insert(i);
for (int i=;i<=n;i++)
{
p[i].first=a[i];
p[i].second=i;
}
sort(p+,p++n);
p[n+].first=-;
for (int i=;i<=n;i++)
{
if (p[i+].first==p[i].first) e[p[i].second]=p[i+].second;
else e[p[i].second]=-;
}
int now=;
t[]=;
if (a[]<=k) S.erase(a[]);
for (int i=;i<=n;i++)
{
if (a[i]>k || !S.count(a[i])) t[i]=t[i-];
else
{
S.erase(a[i]);
while (S.empty())
{
if (a[now]<=k && (e[now]==-||e[now]>i))
{
S.insert(a[now]);
}
now++;
}
t[i]=now;
}
}
dp[]=;
predp[]=;
predp[]=;
for (int i=;i<=n;i++)
{
// dp[t[i]-1]...dp[i-1]
dp[i]=((predp[i]-predp[t[i]-])%md+md)%md;
predp[i+]=(predp[i]+dp[i])%md;
}
printf("%lld\n",dp[n]);
return ;
}
[codechef MEXDIV]Mex division的更多相关文章
- Codechef April Challenge 2019 Division 2
Maximum Remaining 题意:给n个数,取出两个数$a_{i}$,$a_{j}$,求$a_{i}\% a_{j}$取模的最大值 直接排个序,第二大(严格的第二大)模第一大就是答案了. #i ...
- Codechef November Challenge 2019 Division 1
Preface 这场CC好难的说,后面的都不会做QAQ 还因为不会三进制位运算卷积被曲明姐姐欺负了,我真是太菜了QAQ PS:最后还是狗上了六星的说,期待两(三)场之内可以上七星 Physical E ...
- Codechef October Challenge 2019 Division 1
Preface 这次CC难度较上两场升高了许多,后面两题都只能借着曲明姐姐和jz姐姐的仙气来做 值得一提的是原来的F大概需要大力分类讨论,结果我写了一大半题目就因为原题被ban了233 最后勉强涨了近 ...
- Codechef September Challenge 2019 Division 2
Preface 这确实应该是我打过的比较水的CC了(其实就打过两场) 但由于我太弱了打的都是Div2,所以会认为上一场更简单,其实上一场Div的数据结构是真的毒 好了废话不多说快速地讲一下 A Eas ...
- Codechef August Challenge 2019 Division 2
Preface 老年菜鸡终于开始打CC了,由于他太弱了所以只能打Div2 因为台风的原因challenge并没有写,所以水了个Rank7 A Football SB模拟题不解释 #include< ...
- CodeChef November Challenge 2019 Division 1题解
传送门 AFO前的最后一场CC了--好好打吧-- \(SIMGAM\) 偶数行的必定两人平分,所以只要抢奇数行中间那个就行了 这题怎么被爆破了 //quming #include<bits/st ...
- Codechef July Challenge 2019 Division 1题解
题面 \(CIRMERGE\) 破环成链搞个裸的区间\(dp\)就行了 //quming #include<bits/stdc++.h> #define R register #defin ...
- CodeChef October Lunchtime 2019 Division 2
HIT: Khaled in HIT 题目描述 Khaled 教练是 HIT(Hag Institute of Technology)一位名师.但是,他有一些困扰. 最近,Khaled 教练正在教一门 ...
- Codechef July Challenge 2020 Division 1 记录
目录 Missing a Point Chefina and Swaps Doctor Chef Chef and Dragon Dens LCM Constraints Weird Product ...
随机推荐
- MongoDB修改数据库名,collection名
利用dropDatabase,copyDatabase修改Database名称 db.copyDatabase('old_name', 'new_name'); use old_name db.dro ...
- haproxy + keepalived 实现高可用负载均衡集群
1. 首先准备两台tomcat机器,作为集群的单点server. 第一台: 1)tomcat,需要Java的支持,所以同样要安装Java环境. 安装非常简单. tar xf jdk-7u65-lin ...
- Qt——信号与槽
自定义槽函数,槽函数可以是任何位置定义的函数(成员函数,静态函数,全局函数),但是槽函数的函数类型要和信号的函数类型一致.
- Mult
public class MULT { public static void main(String args[]) { int k; for(int x=1;x<=9;x++) { for(i ...
- 【Android开发】 HttpURLConnection.getOutputStream() IO异常
HttpURLConnection.getOutputStream() IO异常百度下,没找到想要的答案.网上的解决方案几乎都是从权限考虑的~最后找到个国外网站上找到答案~ http://stack ...
- urllib,url中链接包含汉字怎么用百分号(%)加密处理
使用urllib中的quote,和unquote方法将汉字编码成gbk(2个百分号对应一个汉字)或者utf8(3个百分号对应一个汉字) 注意用%加密汉字时,汉字不能是Unicode编码格式,否则会报错 ...
- VM打开虚拟机文件报错
用VM打开以前的虚拟机文件报错 Cannot open the disk 'F:/****.vmdk' or one of the snapshot disks it depends on. 这种问题 ...
- Linux用户态程序计时方式详解[转]
转自: http://www.cnblogs.com/clover-toeic/p/3845210.html 前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确 ...
- 27、理解js的继承机制(转载自阮一峰)
Javascript继承机制的设计思想 作者: 阮一峰 日期: 2011年6月 5日 我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类&qu ...
- Jmeter非GUI命令参数说明
查看帮助 -h, --help print usage information and exit 查看版本 -v, --version print the version information an ...