[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 ...
随机推荐
- ruby URI类
一. URI require 'uri' uri = URI("http://foo.com/posts?id=30&limit=5#time=1305298413") # ...
- Leecode刷题之旅-C语言/python-111二叉树的最小深度
/* * @lc app=leetcode.cn id=111 lang=c * * [111] 二叉树的最小深度 * * https://leetcode-cn.com/problems/minim ...
- ABS(引数と同じ大きさの正の数を返す)
ABS 関数 [数値] 数値式の絶対値を返します. 構文 ABS( numeric-expression ) パラメータ numeric-expression 絶対値が返される数値. 戻り値 数値 ...
- The Road to learn React书籍学习笔记(第四章)
高级React组件 本章将重点介绍高级 React 组件的实现.我们将了解什么是高阶组件以及如何实现它们.此外,我们还将深入探讨 React 中更高级的主题,并用它实现复杂的交互功能. 引用 DOM ...
- PS作业
- jmeter对请求参数的签名处理
1.首先在本地写好签名的算法,本文采用RSA签名. public final class Base64 { static private final int BASELENGTH = 128; sta ...
- UIButton内部子控件自定义布局-“UIEdgeInsets”
UIButton UIButton做frame动画时,不响应点击 在一个View内部加入几个按钮,然后改变这个view的frame来做动画,但是按钮不响应点击事件. 问题代码 __block CGRe ...
- 第三十三篇 Python中关于OOP(面向对象)的常用术语
面向对象的优点 从编程进化论可知,面向对象是一种更高等级的结构化编程方式,它的好处主要有两点: 1. 通过封装明确了内外,你做为类的缔造者,你就是女娲,女娲造物的逻辑别人无需知道,女娲想让你知道,你才 ...
- 第三篇 Python执行方式和变量初始
第一个Python程序 可以打开notepad或者其他文本编辑器,输入:print("Hello Python!"),将文件保存到任意盘符下,后缀名是 .py 两种python程 ...
- 【CodeForces】9A-Die Roll
目录 Question Solution 解法1 解法2 Question 三个人掷骰子,前两个人的得分分别是Y和W,问第三个人胜利的概率(第三个人得分不小于Y.W)?结果输出格式为\(A/B\),如 ...