题目链接:https://vjudge.net/contest/171650#problem/I

直接用set+dp水过去了。。。

  1. /*
  2. 设dp[i]表示前i个做划分满足条件的方案数
  3. 有一个显然的转移方程dp[i]=sigma(dp[j]) t<=j<=i-1
  4. 其中t是满足mex(a[t..i-1])<=k的最小的t
  5. 然后我们现在是想得到,对于每个位置这个t是多少,如果知道了这个,就可以很容易的转移了
  6.  
  7. 首先,考虑,如果k>n,那么不管怎么选,都是会满足条件的啊!(就算把所有的数都选出来,mex也就是k吧)
  8. 所以对于k>n,直接输出2^(n-1)
    当然k=0的时候特判一下,这样每个i对应的t都是存在的,至少有一个i
  9.  
  10. 现在考虑k<=n的情况,直接用一个multiset记录[1,k]里的数的出现情况
  11. 首先,把[0,k]全部都放进multiset,遇到一个新的数,就erase,查询集合里最小的数就是mex
  12.  
  13. 假设现在想得到第i个位置的t,上次求得的i-1对应的t是t'
  14. 那么如果a[i]已经在集合中被删去了,那这次对应的肯定还是t'
  15. 如果a[i]没有从集合中删去,就把a[i]从集合中删去(当然,如果a[i]>k直接不用管)
  16. 考虑到随着i的增大,t肯定是往右走的
  17. 如果删去以后集合是空集了,那t'就需要右移了,直到出现一个[0,k]之间的,并且在a[t+1..i]没有出现过的数
  18. 是否出现过,只需要记一个右边第一个跟它相等的数就可以了
  19. */
  20.  
  21. #include<bits/stdc++.h>
  22. using namespace std;
  23.  
  24. const int maxn=;
  25. int a[maxn];
  26. int t[maxn];
  27. int e[maxn];
  28. long long dp[maxn];
  29. long long predp[maxn];
  30. pair<int,int> p[maxn];
  31. set<int> S;
  32.  
  33. const long long md=;
  34. long long fp(long long a,long long k)
  35. {
  36. long long res=;
  37. a%=md;
  38. while(k)
  39. {
  40. if(k&)res=res*a%md;
  41. a=a*a%md;
  42. k>>=;
  43. }
  44. return res;
  45. }
  46.  
  47. int main()
  48. {
  49. int n,k;
  50. scanf("%d%d",&n,&k);
  51. for (int i=;i<=n;i++) scanf("%d",&a[i]);
  52. if (k>n)
  53. {
  54. printf("%lld",fp(,n-));
  55. return ;
  56. }
  57. if (k==)
  58. {
  59. bool yl=false;
  60. for (int i=;i<=n;i++)
  61. {
  62. if (a[i]==)
  63. {
  64. yl=true;
  65. break;
  66. }
  67. }
  68. if (yl) printf("0\n");
  69. else printf("%lld",fp(,n-));
  70. return ;
  71. }
  72. S.clear();
  73. for (int i=;i<=k;i++) S.insert(i);
  74. for (int i=;i<=n;i++)
  75. {
  76. p[i].first=a[i];
  77. p[i].second=i;
  78. }
  79. sort(p+,p++n);
  80. p[n+].first=-;
  81. for (int i=;i<=n;i++)
  82. {
  83. if (p[i+].first==p[i].first) e[p[i].second]=p[i+].second;
  84. else e[p[i].second]=-;
  85. }
  86. int now=;
  87. t[]=;
  88. if (a[]<=k) S.erase(a[]);
  89. for (int i=;i<=n;i++)
  90. {
  91. if (a[i]>k || !S.count(a[i])) t[i]=t[i-];
  92. else
  93. {
  94. S.erase(a[i]);
  95. while (S.empty())
  96. {
  97. if (a[now]<=k && (e[now]==-||e[now]>i))
  98. {
  99. S.insert(a[now]);
  100. }
  101. now++;
  102. }
  103. t[i]=now;
  104. }
  105. }
  106. dp[]=;
  107. predp[]=;
  108. predp[]=;
  109. for (int i=;i<=n;i++)
  110. {
  111. // dp[t[i]-1]...dp[i-1]
  112. dp[i]=((predp[i]-predp[t[i]-])%md+md)%md;
  113. predp[i+]=(predp[i]+dp[i])%md;
  114. }
  115. printf("%lld\n",dp[n]);
  116. return ;
  117. }

[codechef MEXDIV]Mex division的更多相关文章

  1. Codechef April Challenge 2019 Division 2

    Maximum Remaining 题意:给n个数,取出两个数$a_{i}$,$a_{j}$,求$a_{i}\% a_{j}$取模的最大值 直接排个序,第二大(严格的第二大)模第一大就是答案了. #i ...

  2. Codechef November Challenge 2019 Division 1

    Preface 这场CC好难的说,后面的都不会做QAQ 还因为不会三进制位运算卷积被曲明姐姐欺负了,我真是太菜了QAQ PS:最后还是狗上了六星的说,期待两(三)场之内可以上七星 Physical E ...

  3. Codechef October Challenge 2019 Division 1

    Preface 这次CC难度较上两场升高了许多,后面两题都只能借着曲明姐姐和jz姐姐的仙气来做 值得一提的是原来的F大概需要大力分类讨论,结果我写了一大半题目就因为原题被ban了233 最后勉强涨了近 ...

  4. Codechef September Challenge 2019 Division 2

    Preface 这确实应该是我打过的比较水的CC了(其实就打过两场) 但由于我太弱了打的都是Div2,所以会认为上一场更简单,其实上一场Div的数据结构是真的毒 好了废话不多说快速地讲一下 A Eas ...

  5. Codechef August Challenge 2019 Division 2

    Preface 老年菜鸡终于开始打CC了,由于他太弱了所以只能打Div2 因为台风的原因challenge并没有写,所以水了个Rank7 A Football SB模拟题不解释 #include< ...

  6. CodeChef November Challenge 2019 Division 1题解

    传送门 AFO前的最后一场CC了--好好打吧-- \(SIMGAM\) 偶数行的必定两人平分,所以只要抢奇数行中间那个就行了 这题怎么被爆破了 //quming #include<bits/st ...

  7. Codechef July Challenge 2019 Division 1题解

    题面 \(CIRMERGE\) 破环成链搞个裸的区间\(dp\)就行了 //quming #include<bits/stdc++.h> #define R register #defin ...

  8. CodeChef October Lunchtime 2019 Division 2

    HIT: Khaled in HIT 题目描述 Khaled 教练是 HIT(Hag Institute of Technology)一位名师.但是,他有一些困扰. 最近,Khaled 教练正在教一门 ...

  9. Codechef July Challenge 2020 Division 1 记录

    目录 Missing a Point Chefina and Swaps Doctor Chef Chef and Dragon Dens LCM Constraints Weird Product ...

随机推荐

  1. ruby URI类

    一. URI require 'uri' uri = URI("http://foo.com/posts?id=30&limit=5#time=1305298413") # ...

  2. Leecode刷题之旅-C语言/python-111二叉树的最小深度

    /* * @lc app=leetcode.cn id=111 lang=c * * [111] 二叉树的最小深度 * * https://leetcode-cn.com/problems/minim ...

  3. ABS(引数と同じ大きさの正の数を返す)

    ABS 関数 [数値] 数値式の絶対値を返します. 構文 ABS( numeric-expression ) パラメータ numeric-expression   絶対値が返される数値. 戻り値 数値 ...

  4. The Road to learn React书籍学习笔记(第四章)

    高级React组件 本章将重点介绍高级 React 组件的实现.我们将了解什么是高阶组件以及如何实现它们.此外,我们还将深入探讨 React 中更高级的主题,并用它实现复杂的交互功能. 引用 DOM ...

  5. PS作业

  6. jmeter对请求参数的签名处理

    1.首先在本地写好签名的算法,本文采用RSA签名. public final class Base64 { static private final int BASELENGTH = 128; sta ...

  7. UIButton内部子控件自定义布局-“UIEdgeInsets”

    UIButton UIButton做frame动画时,不响应点击 在一个View内部加入几个按钮,然后改变这个view的frame来做动画,但是按钮不响应点击事件. 问题代码 __block CGRe ...

  8. 第三十三篇 Python中关于OOP(面向对象)的常用术语

    面向对象的优点 从编程进化论可知,面向对象是一种更高等级的结构化编程方式,它的好处主要有两点: 1. 通过封装明确了内外,你做为类的缔造者,你就是女娲,女娲造物的逻辑别人无需知道,女娲想让你知道,你才 ...

  9. 第三篇 Python执行方式和变量初始

    第一个Python程序 可以打开notepad或者其他文本编辑器,输入:print("Hello Python!"),将文件保存到任意盘符下,后缀名是  .py 两种python程 ...

  10. 【CodeForces】9A-Die Roll

    目录 Question Solution 解法1 解法2 Question 三个人掷骰子,前两个人的得分分别是Y和W,问第三个人胜利的概率(第三个人得分不小于Y.W)?结果输出格式为\(A/B\),如 ...