题意





对于100%的数据,\(n,m \leq 10^5\)

分析

考场上打挂了。

  • 最大值就是后半部分和减前半部分和。
  • 最小是就是奇偶相减。
  • 方案数类似进出栈序,就是catalan数

线段树维护即可,时间复杂度\(O(n \log n+m \log n)\)

代码

  1. #include<cstdlib>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<string>
  7. #include<vector>
  8. #include<list>
  9. #include<deque>
  10. #include<stack>
  11. #include<queue>
  12. #include<map>
  13. #include<set>
  14. #include<bitset>
  15. #include<algorithm>
  16. #include<complex>
  17. #define rg register
  18. #define il inline
  19. #define co const
  20. #pragma GCC optimize ("O0")
  21. using namespace std;
  22. template<class T> il T read()
  23. {
  24. T data=0;
  25. int w=1;
  26. char ch=getchar();
  27. while(!isdigit(ch))
  28. {
  29. if(ch=='-')
  30. w=-1;
  31. ch=getchar();
  32. }
  33. while(isdigit(ch))
  34. data=10*data+ch-'0',ch=getchar();
  35. return data*w;
  36. }
  37. template<class T> il T read(T&x)
  38. {
  39. return x=read<T>();
  40. }
  41. typedef long long ll;
  42. const int INF=0x7fffffff;
  43. const int MAXN=1e6+7,mod=1e9+7;
  44. int a[MAXN],fac[MAXN],inv[MAXN];
  45. il int catalan(rg int x)
  46. {
  47. return (ll)fac[2*x]*inv[x]%mod*inv[x]%mod*a[x+1]%mod;
  48. }
  49. struct node
  50. {
  51. int len;
  52. int sumv[3]; // edit 1
  53. // 0 1 2
  54. // odd,even,all
  55. il node()=default;
  56. il node operator+(rg co node&rhs)const
  57. {
  58. rg node res;
  59. res.len=len+rhs.len;
  60. res.sumv[0]=(sumv[0]+rhs.sumv[len&1])%mod;
  61. res.sumv[1]=(sumv[1]+rhs.sumv[!(len&1)])%mod;
  62. res.sumv[2]=(sumv[2]+rhs.sumv[2])%mod;
  63. return res;
  64. }
  65. il void add(rg int v)
  66. {
  67. (sumv[0]+=(ll)(len+1)/2*v%mod)%=mod;
  68. (sumv[1]+=(ll)len/2*v%mod)%=mod; // edit 2
  69. (sumv[2]+=(ll)len*v%mod)%=mod;
  70. }
  71. };
  72. int ql,qr,v;
  73. struct SegTree
  74. {
  75. node data[MAXN<<2];
  76. int addv[MAXN<<2];
  77. #define lson (now<<1)
  78. #define rson (now<<1|1)
  79. il void build(rg int now,rg int l,rg int r)
  80. {
  81. if(l==r)
  82. {
  83. data[now].len=1;
  84. data[now].sumv[0]=data[now].sumv[2]=read<int>();
  85. return;
  86. }
  87. rg int mid=(l+r)>>1;
  88. build(lson,l,mid);
  89. build(rson,mid+1,r);
  90. data[now]=data[lson]+data[rson];
  91. }
  92. il void pushdown(rg int now)
  93. {
  94. if(addv[now])
  95. {
  96. data[lson].add(addv[now]);
  97. (addv[lson]+=addv[now])%=mod;
  98. data[rson].add(addv[now]);
  99. (addv[rson]+=addv[now])%=mod;
  100. addv[now]=0;
  101. }
  102. }
  103. il void add(rg int now,rg int l,rg int r)
  104. {
  105. // fprintf(stderr,"a %d %d %d\n",now,l,r);
  106. if(ql<=l&&r<=qr)
  107. {
  108. data[now].add(v);
  109. (addv[now]+=v)%=mod;
  110. return;
  111. }
  112. pushdown(now);
  113. rg int mid=(l+r)>>1;
  114. if(ql<=mid)
  115. add(lson,l,mid);
  116. if(qr>=mid+1)
  117. add(rson,mid+1,r);
  118. data[now]=data[lson]+data[rson];
  119. }
  120. il node query(rg int now,rg int l,rg int r)
  121. {
  122. // fprintf(stderr,"q %d %d %d\n",now,l,r);
  123. if(ql<=l&&r<=qr)
  124. {
  125. return data[now];
  126. }
  127. pushdown(now);
  128. rg int mid=(l+r)>>1;
  129. if(qr<=mid)
  130. return query(lson,l,mid);
  131. if(ql>=mid+1)
  132. return query(rson,mid+1,r);
  133. return query(lson,l,mid)+query(rson,mid+1,r);
  134. }
  135. }T;
  136. int main()
  137. {
  138. freopen("sort.in","r",stdin);
  139. freopen("sort.out","w",stdout);
  140. rg int n=read<int>(),m=read<int>();
  141. n*=2;
  142. a[1]=1,fac[1]=1,inv[1]=1;
  143. a[0]=1,fac[0]=1,inv[0]=1;
  144. for(rg int i=2;i<=n;++i)
  145. {
  146. a[i]=((ll)-(mod/i)*a[mod%i]%mod+mod)%mod;
  147. fac[i]=(ll)fac[i-1]*i%mod;
  148. inv[i]=(ll)inv[i-1]*a[i]%mod;
  149. // fprintf(stderr,"%d a=%d fac=%d inv=%d\n",i,a[i],fac[i],inv[i]);
  150. }
  151. T.build(1,1,n);
  152. // fprintf(stderr,"build end\n");
  153. while(m--)
  154. {
  155. rg int opt,l,r;
  156. read(opt);
  157. if(opt==1)
  158. {
  159. read(l);read(r);
  160. rg int mid=(l+r)>>1;
  161. ql=l,qr=mid;
  162. rg int le=T.query(1,1,n).sumv[2];
  163. // fprintf(stderr,"le=%d\n",le);
  164. ql=mid+1,qr=r;
  165. rg int ri=T.query(1,1,n).sumv[2];
  166. // fprintf(stderr,"ri=%d\n",ri);
  167. ql=l,qr=r;
  168. node ans=T.query(1,1,n);
  169. // fprintf(stderr,"odd=%d even=%d\n",ans.sumv[0],ans.sumv[1]);
  170. printf("%d %d %d\n",(ri+mod-le)%mod,(ans.sumv[1]+mod-ans.sumv[0])%mod,catalan((qr-ql+1)/2));
  171. }
  172. else if(opt==0)
  173. {
  174. read(ql);read(qr);read(v);
  175. T.add(1,1,n);
  176. }
  177. }
  178. // fclose(stdin);
  179. // fclose(stdout);
  180. return 0;
  181. }

test20181021 快速排序的更多相关文章

  1. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  2. 算法与数据结构(十六) 快速排序(Swift 3.0版)

    上篇博客我们主要聊了比较高效的归并排序算法,本篇博客我们就来介绍另一种高效的排序算法:快速排序.快速排序的思想与归并排序类似,都是采用分而治之的方式进行排序的.快速排序的思想主要是取出无序序列中第一个 ...

  3. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

  4. 排序算法----调用库函数qsort进行快速排序

    功 能: 快速排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const ...

  5. Html5 快速排序演示

    快速排序(Quicksort)是对冒泡排序的一种改进.快速排序由C. A. R. Hoare在1962年提出. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...

  6. Java 快速排序两种实现

    快速排序,只要学习过编程的人肯定都听说过这个名词,但是有时候写的时候还真蒙住了,网上搜罗了下以及查阅了"introduction to algorithm",暂时找到两种实现快排的 ...

  7. java基础算法之快速排序

    快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.figh ...

  8. PAT 1045. 快速排序(25)

    著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列,请问有多 ...

  9. 快速排序中的partition函数的枢纽元选择,代码细节,以及其标准实现

    很多笔试面试都喜欢考察快排,叫你手写一个也不是啥事.我很早之前就学了这个,对快速排序的过程是很清楚的.但是最近自己尝试手写,发现之前对算法的细节把握不够精准,很多地方甚至只是大脑中的一个映像,而没有理 ...

随机推荐

  1. mysql索引之哈希索引

    哈希算法 哈希算法时间复杂度为O(1),且不只存在于索引中,每个数据库应用中都存在该数据结构. 哈希表 哈希表也为散列表,又直接寻址改进而来.在哈希的方式下,一个元素k处于h(k)中,即利用哈希函数h ...

  2. 454 Authenti cation failed, please open smtp flag first! (Net::SMTPAuthenticationError)

    在用ruby的smtp库发送邮件的时候,出现了这个错误454 Authenti cation failed, please open smtp flag first! (Net::SMTPAuthen ...

  3. 在Mybatis中使用连表查询的一次实际应用

    以前在工作中很少使用多表关联查询,对连表查询的具体作用和使用场景也没有很直观的认识,通过这次在项目中的实际应用,对此有了一定的认识,特记录如下. 关联表介绍: 分别是属性表attr_info.属性值表 ...

  4. VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)

    前面两节讲了比较常用的按钮控件,并通过按钮控件实例说明了具体用法.本文要讲的是列表框控件(ListBox)及其使用实例. 列表框控件简介 列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选 ...

  5. Entity Framework 数据生成选项DatabaseGenerated(转)

    在EF中,我们建立数据模型的时候,可以给属性配置数据生成选项DatabaseGenerated,它后有三个枚举值:Identity.None和Computed. Identity:自增长 None:不 ...

  6. git如何自动打补丁

    答:git am --reject jello.patch  (如果打补丁失败,会自动生成rej文件)

  7. BZOj 墨墨的等式(转化为最短路)题解

    题意:中文题意不解释... 思路:这道题居然可以转化为最短路orz,要等式有非负整数解,我们可以转化一下:每个ai不限数量,问你能用ai数组拼出多少个Bmin~Bmax范围内的数,有点像完全背包的感觉 ...

  8. Bridge(桥接)

    意图: 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 适用性: 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. 类 ...

  9. 【Python】使用Pytest集成Allure生成漂亮的图形测试报告

    前言 大概两个月前写过一篇<[测试设计]使用jenkins 插件Allure生成漂亮的自动化测试报告>的博客,但是其实Allure首先是一个可以独立运行的测试报告生成框架,然后才有了Jen ...

  10. Spring IOC 源码简单分析 04 - bean的初始化

      ### 准备 ## 目标 了解 Spring 如何初始化 bean 实例 ##测试代码 gordon.study.spring.ioc.IOC04_Initialization.java publ ...