题意





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

分析

考场上打挂了。

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

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

代码

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define il inline
#define co const
#pragma GCC optimize ("O0")
using namespace std;
template<class T> il T read()
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return data*w;
}
template<class T> il T read(T&x)
{
return x=read<T>();
}
typedef long long ll;
const int INF=0x7fffffff; const int MAXN=1e6+7,mod=1e9+7;
int a[MAXN],fac[MAXN],inv[MAXN]; il int catalan(rg int x)
{
return (ll)fac[2*x]*inv[x]%mod*inv[x]%mod*a[x+1]%mod;
} struct node
{
int len;
int sumv[3]; // edit 1
// 0 1 2
// odd,even,all il node()=default; il node operator+(rg co node&rhs)const
{
rg node res;
res.len=len+rhs.len;
res.sumv[0]=(sumv[0]+rhs.sumv[len&1])%mod;
res.sumv[1]=(sumv[1]+rhs.sumv[!(len&1)])%mod;
res.sumv[2]=(sumv[2]+rhs.sumv[2])%mod;
return res;
} il void add(rg int v)
{
(sumv[0]+=(ll)(len+1)/2*v%mod)%=mod;
(sumv[1]+=(ll)len/2*v%mod)%=mod; // edit 2
(sumv[2]+=(ll)len*v%mod)%=mod;
}
}; int ql,qr,v;
struct SegTree
{
node data[MAXN<<2];
int addv[MAXN<<2];
#define lson (now<<1)
#define rson (now<<1|1)
il void build(rg int now,rg int l,rg int r)
{
if(l==r)
{
data[now].len=1;
data[now].sumv[0]=data[now].sumv[2]=read<int>();
return;
}
rg int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
data[now]=data[lson]+data[rson];
} il void pushdown(rg int now)
{
if(addv[now])
{
data[lson].add(addv[now]);
(addv[lson]+=addv[now])%=mod;
data[rson].add(addv[now]);
(addv[rson]+=addv[now])%=mod;
addv[now]=0;
}
} il void add(rg int now,rg int l,rg int r)
{
// fprintf(stderr,"a %d %d %d\n",now,l,r);
if(ql<=l&&r<=qr)
{
data[now].add(v);
(addv[now]+=v)%=mod;
return;
}
pushdown(now);
rg int mid=(l+r)>>1;
if(ql<=mid)
add(lson,l,mid);
if(qr>=mid+1)
add(rson,mid+1,r);
data[now]=data[lson]+data[rson];
} il node query(rg int now,rg int l,rg int r)
{
// fprintf(stderr,"q %d %d %d\n",now,l,r);
if(ql<=l&&r<=qr)
{
return data[now];
}
pushdown(now);
rg int mid=(l+r)>>1;
if(qr<=mid)
return query(lson,l,mid);
if(ql>=mid+1)
return query(rson,mid+1,r);
return query(lson,l,mid)+query(rson,mid+1,r);
}
}T; int main()
{
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
rg int n=read<int>(),m=read<int>();
n*=2;
a[1]=1,fac[1]=1,inv[1]=1;
a[0]=1,fac[0]=1,inv[0]=1;
for(rg int i=2;i<=n;++i)
{
a[i]=((ll)-(mod/i)*a[mod%i]%mod+mod)%mod;
fac[i]=(ll)fac[i-1]*i%mod;
inv[i]=(ll)inv[i-1]*a[i]%mod;
// fprintf(stderr,"%d a=%d fac=%d inv=%d\n",i,a[i],fac[i],inv[i]);
}
T.build(1,1,n);
// fprintf(stderr,"build end\n");
while(m--)
{
rg int opt,l,r;
read(opt);
if(opt==1)
{
read(l);read(r);
rg int mid=(l+r)>>1;
ql=l,qr=mid;
rg int le=T.query(1,1,n).sumv[2];
// fprintf(stderr,"le=%d\n",le);
ql=mid+1,qr=r;
rg int ri=T.query(1,1,n).sumv[2];
// fprintf(stderr,"ri=%d\n",ri);
ql=l,qr=r;
node ans=T.query(1,1,n);
// fprintf(stderr,"odd=%d even=%d\n",ans.sumv[0],ans.sumv[1]);
printf("%d %d %d\n",(ri+mod-le)%mod,(ans.sumv[1]+mod-ans.sumv[0])%mod,catalan((qr-ql+1)/2));
}
else if(opt==0)
{
read(ql);read(qr);read(v);
T.add(1,1,n);
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}

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. devise 自定义手机号登录

    user model中配置 validates_uniqueness_of :phone def email_required? false end 修改user migration文件,给phone ...

  2. VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序)

    前面几节鸡啄米为大家演示了加法计算器程序完整的编写过程,本节主要讲对话框上控件的Tab顺序如何调整. 上一讲为“计算”按钮添加了消息处理函数后,加法计算器已经能够进行浮点数的加法运算.但是还有个遗留的 ...

  3. Mail.Ru Cup 2018 Round 1

    A. Elevator or Stairs? 签. #include <bits/stdc++.h> using namespace std; ]; int main() { while ...

  4. ng-深度学习-课程笔记-3: Python和向量化(Week2)

    1 向量化( Vectorization ) 在逻辑回归中,以计算z为例,$ z =  w^{T}+b $,你可以用for循环来实现. 但是在python中z可以调用numpy的方法,直接一句$z = ...

  5. ng-深度学习-课程笔记-8: 超参数调试,Batch正则(Week3)

    1 调试处理( tuning process ) 如下图所示,ng认为学习速率α是需要调试的最重要的超参数. 其次重要的是momentum算法的β参数(一般设为0.9),隐藏单元数和mini-batc ...

  6. Digital Image Processing 学习笔记1

    第一章 1.1 数字图像 一幅图像可以定义为一个而为函数, 其中x和y是空间坐标,而在任何一对空间坐标(x, y)处的幅值f称为图像在该点处的强度或灰度.当x, y和灰度值f是有限的离散数值时,该图像 ...

  7. Java 异步处理 三种实现

    new Thread((new Runnable() { @Override public void run() { // 批量同步数据 try { logger.info("^^^^^^^ ...

  8. HDU1978How Many Ways 记忆化dfs+dp

    /*记忆化dfs+dp dp[i][j]代表达到这个点的所有路的条数,那么所有到达终点的路的总数就是这dp[1][1]加上所有他所能到达的点的 所有路的总数 */ #include<stdio. ...

  9. SQL学习笔记八之ORM框架SQLAlchemy

    阅读目录 一 介绍 二 创建表 三 增删改查 四 其他查询相关 五 正查.反查 一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进 ...

  10. bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)

    [HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...