题面

传送门

题解

我的做法似乎非常复杂啊……

首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案数就是答案了

最长上升子序列随便求求,主要是这个方案数很麻烦啊……我的做法是对每一个长度开一个动态开点线段树,然后每次在对应的长度里二分跑前缀和

其实这里完全不用动态开点线段树的,直接把权值离散一下然后一棵线段树就够了,跑得飞快

其实这里连线段树都不需要直接树状数组就可以维护前缀最大值和方案之和了

然后没有然后了

//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(int i=(a),I=(b)-1;i>I;--i)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=4e5+5,P=1e9+7,M=(N<<5)+5;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
int sum[M],lc[M],rc[M],rt[N],tot;
int a[N],f[N],g[N],b[N],m,n,res,mx,lim;
void query(int p,int l,int r,int x){
if(!p||l==r)return res=add(res,sum[p]),void();
int mid=(l+r)>>1;
if(x<=mid)query(lc[p],l,mid,x);
else res=add(res,sum[lc[p]]),query(rc[p],mid+1,r,x);
}
void ins(int &p,int l,int r,int x,int val){
if(!p)p=++tot;sum[p]=add(sum[p],val);
if(l==r)return;
int mid=(l+r)>>1;
x<=mid?ins(lc[p],l,mid,x,val):ins(rc[p],mid+1,r,x,val);
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
fp(i,1,n)a[i]=b[i]=read();
sort(b+1,b+1+n),lim=unique(b+1,b+1+n)-b-1;
fp(i,1,n)a[i]=lower_bound(b+1,b+1+lim,a[i])-b;
reverse(a+1,a+1+n);
fp(i,1,n)a[(n<<1)-i+1]=a[i];
n=(n<<1),m=0,b[0]=0;
fp(i,1,n){
if(a[i]>b[m])f[i]=++m,b[m]=a[i];
else{
int k=lower_bound(b+1,b+1+m,a[i])-b;
f[i]=k,b[k]=a[i];
}
if(f[i]==1)g[i]=1;
else res=0,query(rt[f[i]-1],1,lim,a[i]-1),g[i]=res;
if(i>(n>>1)&&f[i]==f[n-i+1])g[i]=dec(g[i],g[n-i+1]);
ins(rt[f[i]],1,lim,a[i],g[i]);
cmax(mx,f[i]);
}
res=0;
fp(i,(n>>1)+1,n)if(f[i]==mx){
res=add(res,g[i]);
if(f[n-i+1]==mx)res=add(res,g[n-i+1]);
}
res=mul(res,ksm(2,(n>>1)-mx));
printf("%d %d\n",mx,res);
return 0;
}

LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)的更多相关文章

  1. loj#6029. 「雅礼集训 2017 Day1」市场(线段树)

    题意 链接 Sol 势能分析. 除法是不能打标记的,所以只能暴力递归.这里我们加一个剪枝:如果区间内最大最小值的改变量都相同的话,就变成区间减. 这样复杂度是\((n + mlogn) logV\)的 ...

  2. loj #6032. 「雅礼集训 2017 Day2」水箱 线段树优化DP转移

    $ \color{#0066ff}{ 题目描述 }$ 给出一个长度为 \(n\) 宽度为 \(1\) ,高度无限的水箱,有 \(n-1\) 个挡板将其分为 \(n\) 个 \(1 - 1\) 的小格, ...

  3. LOJ #6029. 「雅礼集训 2017 Day1」市场 线段树维护区间除法

    题目描述 从前有一个贸易市场,在一位执政官到来之前都是非常繁荣的,自从他来了之后,发布了一系列奇怪的政令,导致贸易市场的衰落. 有 \(n\) 个商贩,从\(0 \sim n - 1\) 编号,每个商 ...

  4. LOJ#6049. 「雅礼集训 2017 Day10」拍苍蝇(计算几何+bitset)

    题面 传送门 题解 首先可以用一个矩形去套这个多边形,那么我们只要枚举这个矩形的左下角就可以枚举完所有多边形的位置了 我们先对每一个\(x\)坐标开一个\(bitset\),表示这个\(x\)坐标里哪 ...

  5. LOJ#6047. 「雅礼集训 2017 Day10」决斗(set)

    题面 传送门 题解 这么简单一道题我考试的时候居然只打了\(40\)分暴力? 如果我们把每个点的\(a_i\)记为\(deg_i-1\),其中\(deg_i\)表示有\(deg_i\)个数的\(A_i ...

  6. 【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析

    题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之 ...

  7. 「雅礼集训 2017 Day1」市场 (线段树除法,区间最小,区间查询)

    老师说,你们暴力求除法也整不了多少次就归一了,暴力就好了(应该只有log(n)次) 于是暴力啊暴力,结果我归天了. 好吧,在各种题解的摧残下,我终于出了一篇巨好看(chou lou)代码(很多结构体党 ...

  8. #6029. 「雅礼集训 2017 Day1」市场 [线段树]

    考虑到每次除法,然后加法,差距会变小,于是维护加法lazytag即可 #include <cstdio> #include <cmath> #define int long l ...

  9. [LOJ 6031]「雅礼集训 2017 Day1」字符串

    [LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...

随机推荐

  1. Python_02-控制语句

    目录:  1         控制结构...  1.1      分支语句...  1.1.1   if语句的嵌套...  1.2      for循环...  1.2.1   Python 循环中的 ...

  2. Server.Transfer和Response.Redirect的区别

    (1)Server.Transfer方法: Server.Transfer("m2.aspx");//页面转向(服务器上执行). 服务器停止解析本页,保存此页转向前的数据后,再使页 ...

  3. SNAT和DNAT的区别

    SNAT: Source Network Address Translation,是修改网络包源ip地址的.DNAT: Destination Network Address Translation, ...

  4. 28-python 中格式对齐之中文格式对齐问题

    一般的可以按这个搞,但是中文就会有问题: python基础_格式化输出(%用法和format用法) 对于 print('1234567890' * 10)print('%10s' % '今天好')pr ...

  5. win8上部署.net4.0程序到iis

    在win8.1上默认的iis版本为8.5版,不做任何配置回报3个错误, 一下是错误提示内容及解决方案 1>HTTP 错误 404.3 – Not Found由于扩展配置问题而无法提供您请求的页面 ...

  6. 浅析JavaScript访问对象属性和方法及区别

    属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸.跳跃等. 在JavaScript中通常使用”."运算符来存取对象的属性的值.或 ...

  7. cucumber安装步骤

    #Start Guide##Environment###1. Install Ruby Verify your installation by running ruby -v in a termina ...

  8. CSS3: box-sizing & content-box 属性---元素的border 和 padding 影响内容的 width 和 height解决方案

    /* 关键字 值 */ box-sizing: content-box; box-sizing: border-box; /* 全局 值 */ box-sizing: inherit; box-siz ...

  9. Mixin模式

    Mixin是JavaScript中用的最普遍的模式,几乎所有流行类库都会有Mixin的实现. Mixin是掺合,混合,糅合的意思,即可以就任意一个对象的全部或部分属性拷贝到另一个对象上. 从提供的接口 ...

  10. oracle 索引的分类

    1. B树索引(默认索引,保存讲过排序过的索引列和对应的rowid值) 1)说明: 1.oracle中最常用的索引:B树索引就是一颗二叉树:叶子节点(双向链表)包含索引列和指向表中每个匹配行的ROWI ...