[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 ...
随机推荐
- Python的scrapy之爬取boss直聘网站
在我们的项目中,单单分析一个51job网站的工作职位可能爬取结果不太理想,所以我又爬取了boss直聘网的工作,不过boss直聘的网站一次只能展示300个职位,所以我们一次也只能爬取300个职位. jo ...
- echarts实用小技巧,控制字符串长度,限定整数等
限定横坐标文本字符长度 xAxis : [ axisLabel:{ formatter: function (value) { var maxlength=6; if (value.length> ...
- Awakening Your Senses【唤醒你的感觉官能】
Awakening Your Senses Give youself a test. Which way is the wind blowing? How many kinds of wildflow ...
- PHP.39-扩展-锁机制解决并发-MySQL锁、PHP文件锁
锁机制适用于高并发场景:高并发订单.秒杀…… apache压力测试 Mysql锁详解 语法 加锁:LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE ......... ...
- 长沙Uber优步司机奖励政策(3月28日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Java:位移运算符
Java中有三个位移运算符,用于对int类型整数的二进制补码进行操作: 1. "<<": 左移运算符 在二进制补码末尾添加“0”,之前的其他位相当于左移了一位,可看作成 ...
- html页面导出word文档
1.加入两个外部js 1)FileSaver.js /* FileSaver.js * A saveAs() FileSaver implementation. * 1.3.2 * 2016-06-1 ...
- GreenMail邮件测试服务器
GreenMail邮件测试服务器 http://blog.csdn.net/jackiehff/article/details/8741988 这个目前没有需求,所以暂不研究
- Python 3基础教程31-urllib模块
本文介绍Python里的urllib模块,这个urllib主要处理web服务的,如果需要做接口测试,或者写Python的网络爬虫,这个urllib就是最底层的库.需要用到里面的请求方法等. 1. 先看 ...
- python接口测试(一)——http请求及token获取
使用python对当前的接口进行简单的测试 1.接口测试是针对软件对外提供服务得接口得输入输出进行得测试,验证接口功能与接口描述文档得一致性 返回结果可以为字符串,json,xml等 2.接口的请求方 ...