传送门

(虽然是A了但是不知道复杂度是不是正确的

考虑以某个位置为结尾的合法划分

先考虑min,带来的影响是限制了最小长度,预处理出这个最小长度后,这可以在处理到这个数时,把不能算的部分去掉(不满足min条件的话必定满足max条件)。

单独考虑max条件

对于每一个数,找出以它为最大值的区间后,暂时不考虑min,就只限制了划分的最大长度,这时分类讨论一下(见代码),有一部分需要暴力处理(不会证复杂度)

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define MN 510000
  4. using namespace std;
  5.  
  6. const int MOD=1e9+;
  7. int n,m,a[MN],_l[MN],st[MN],top=,v[MN],V[MN],tmp,ans,fi[MN],ne[MN];
  8. inline int max(int x,int y){return x>y?x:y;}
  9. inline int min(int x,int y){return x<y?x:y;}
  10. inline void M(int &x){while(x>=MOD)x-=MOD;while(x<)x+=MOD;}
  11. inline int ask(int l,int r){int a=V[r-]-(l==?:V[l-]);M(a);return a;}
  12. inline void add(int l,int r,int sum){M(v[l]+=sum);M(v[r+]-=sum);}
  13. inline void work(int s,int _s,int l){
  14. int sum=;
  15. for (int i=;i<=l;i++){
  16. add(_s,_s+i-,ask(s+i-,s+i-));
  17. }
  18. }
  19. int main(){
  20. scanf("%d",&n);
  21. for (int i=;i<=n;i++) scanf("%d",&a[i]);
  22.  
  23. int L=,R=;
  24. for (int i=;i<=n;i++){
  25. while(L<=R&&a[st[R]]>=a[i]) R--;
  26. st[++R]=i;
  27. while(L<R&&i-a[st[L+]]+>=st[L]) L++;
  28. _l[i]=max(min(st[L],i-a[st[L]]+),);
  29. }
  30.  
  31. V[]=;
  32. for (int i=;i<=n;i++){
  33. while(a[st[top]]<=a[i]&&top) ne[st[top]]=i,top--;fi[i]=st[top];
  34. st[++top]=i;
  35. }
  36. for (int i=;i<=n;i++){
  37. int l=fi[i]+,r=ne[i]?ne[i]-:n,sum;
  38. if (a[i]>=r-l+){
  39. add(i,r,ask(l,i));
  40. }else if (a[i]>=i-l+&&a[i]>=r-i+){
  41. add(i,l+a[i]-,ask(l,i));
  42. add(l+a[i],r,ask(r-a[i]+,i));
  43. work(l+,l+a[i],r-(l+a[i]));
  44. }else if (a[i]<=i-l+&&a[i]<=r-i+){
  45. work(i-a[i]+,i,a[i]);
  46. }else if (a[i]<=i-l+){
  47. add(i,r,ask(r-a[i]+,i));
  48. work(i-a[i]+,i,r-i);
  49. }else if (a[i]<=r-i+){
  50. add(i,l+a[i]-,ask(l,i));
  51. work(l+,l+a[i],i-l);
  52. }
  53. M(tmp+=v[i]);
  54. M(ans=tmp-ask(_l[i]+,i));
  55. M(V[i]=ans+V[i-]);
  56. }
  57. printf("%d\n",ans);
  58. }

Codechef August Challenge 2018 : Safe Partition的更多相关文章

  1. Codechef August Challenge 2018 : Chef at the River

    传送门 (要是没有tjm(Sakits)的帮忙,我还真不知道啥时候能做出来 结论是第一次带走尽可能少的动物,使未带走的动物不冲突,带走的这个数量就是最优解. 首先这个数量肯定是下界,更少的话连第一次都 ...

  2. Codechef August Challenge 2018 : Interactive Matrix

    传送门 首先整个矩阵可以被分为很多小矩阵,小矩阵内所有行的单调性是一样的,所有列的单调性是一样的. 考虑如何在这样一个小矩阵中找出答案.我的策略是每次取四个角中最大值和最小值的点,这样可以每次删掉一行 ...

  3. Codechef August Challenge 2018 : Lonely Cycles

    传送门 几波树形dp就行了. #include<cstdio> #include<cstring> #include<algorithm> #define MN 5 ...

  4. Codechef August Challenge 2018 : Coordinate Compression

    传送门 外边二分,里面拿线段树维护贪心就行了. #include<cstdio> #include<vector> #include<cstring> #inclu ...

  5. Codechef August Challenge 2018 : Modular GCD

    传送门 一开始还手动拓欧找规律,发现好像玩不了. 然后想了想,A-B这个数比较小,枚举它的因子判断合不合法就行了. 需要特判A=B的情况. #include<cstdio> #includ ...

  6. Codechef October Challenge 2018 游记

    Codechef October Challenge 2018 游记 CHSERVE - Chef and Serves 题目大意: 乒乓球比赛中,双方每累计得两分就会交换一次发球权. 不过,大厨和小 ...

  7. Codechef September Challenge 2018 游记

    Codechef September Challenge 2018 游记 Magician versus Chef 题目大意: 有一排\(n(n\le10^5)\)个格子,一开始硬币在第\(x\)个格 ...

  8. codechef February Challenge 2018 简要题解

    比赛链接:https://www.codechef.com/FEB18,题面和提交记录是公开的,这里就不再贴了 Chef And His Characters 模拟题 Chef And The Pat ...

  9. Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal

    原文链接http://www.cnblogs.com/zhouzhendong/p/9010945.html 题目传送门 - Codechef STMINCUT 题意 在一个有边权的无向图中,我们定义 ...

随机推荐

  1. Scrapy 下载图片

    参考 : https://www.jianshu.com/p/6c8d2730d088 https://docs.scrapy.org/en/latest/topics/item-pipeline.h ...

  2. Web从入门到放弃<7>

    从这章开始读<javascript高级程序设计> <1>typeof 返回字符串 / 类型 未定义:undefined 布尔:boolean 字符串:string 数值:num ...

  3. windows配置openssl

    下载openssl并安装,下载地址:http://slproweb.com/products/Win32OpenSSL.html 假设安装路径为C:\"Program Files" ...

  4. java第一个demo(简单登陆窗体)

    首先新建一个Maven项目 选择一个存放项目的目录 ,点击完成(下图). 为了防止jdk版本的问题,所以在pom.xml里面做一个配置,让整个项目统一用jdk 1.8版本(1.7之前可能会存在一些问题 ...

  5. RIDE的下载及安装

    1.本机配置 windows8.1 python3.6.5,已配置环境变量 2.安装RIDE前需要安装的依赖包(使用pip就可以直接安装) 首先必须有robotframework 例如:pip ins ...

  6. uni-app图片压缩转base64位 利用递归来实现多张图片压缩

    //选择图片 chooseImage(){ let that =this uni.chooseImage({ sizeType: ['original','compressed'], //可以指定是原 ...

  7. PHP输出缓存ob系列函数

    ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担. ob的基本原则:如果 ...

  8. 关于数据库中日期格式(yy-MM-dd HH-mm-ss)通过json传到后台变成毫秒数的问题

    在日期封装对象前面加一个json标签即可防止自动转换 如 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date mod ...

  9. 获取显卡的cuda算力

    获取nvidia显卡的cuda算力,在编译cuda相关代码时候可能用到. 前提: 安装了visual studio 安装了cuda(cuda应该在vs之后安装) 安装了cmake 代码 https:/ ...

  10. 在XPS13 上安装Ubuntu 16.04

    1 准备系统安装U盘 使用常见的光盘工具软件ultraISO. (1)首先使用UltraISO打开Ubuntu-16.04.4-desktop-amd64.iso安装映像. (2)在菜单栏中,选择&q ...