[CC-MCO16306]Fluffy and Alternating Subsequence

题目大意:

给定一个\(1\sim n(n\le3\times10^5)\)的排列\(a\)。
对于一个序列\(b\),如果以下两个条件之一成立,则称\(b_i\)是一个跳跃序列:

  1. \(b_{2k}<b_{2k-1}\)对所有的\(2k\le n\)都成立,且\(b_{2k}<b_{2k+1}\)对所有的\(2k+1\le n\)都成立。
  2. \(b_{2k}>b_{2k-1}\)对所有的\(2k\le n\)都成立,且\(b_{2k}>b_{2k+1}\)对所有的\(2k+1\le n\)都成立。

求\(a\)的最长跳跃子序列的长度\(l\),并求出有多少个长度为\(l\)的跳跃子序列,模\(10^9+7\)。

思路:

\(f[i][0/1][0/1]\)表示考虑到第\(i\)位,当前位是峰/谷,当前序列符合条件1/2时,长度的最大值。\(g[i][0/1][0/1]\)表示相同状态下的方案数。

线段树优化后做做到\(\mathcal O(n\log n)\)。

源代码:

#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {register char ch;while(!isdigit(ch=getchar()));register int x=ch^'0';while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');return x;
}
const int N=3e5+1,mod=1e9+7;
int a[N],f[N][2][2],g[N][2][2];
class SegmentTree {#define _left <<1#define _right <<1|1#define mid ((b+e)>>1)private:int f[N<<2],g[N<<2];void push_up(const int &p) {f[p]=std::max(f[p _left],f[p _right]);g[p]=0;if(f[p _left]==f[p]) (g[p]+=g[p _left])%=mod;if(f[p _right]==f[p]) (g[p]+=g[p _right])%=mod;}public:void modify(const int &p,const int &b,const int &e,const int &x,const int &y,const int &z) {if(b==e) {if(y>f[p]) {f[p]=y;g[p]=0;}if(y==f[p]) {(g[p]+=z)%=mod;}return;}if(x<=mid) modify(p _left,b,mid,x,y,z);if(x>mid) modify(p _right,mid+1,e,x,y,z);push_up(p);}std::pair<int,int> query(const int &p,const int &b,const int &e,const int &l,const int &r) {if(b==l&&e==r) {return std::make_pair(f[p],g[p]);}std::pair<int,int> pl,pr,ret;pl=std::make_pair(0,0);pr=std::make_pair(0,0);ret=std::make_pair(0,0);if(l<=mid) pl=query(p _left,b,mid,l,std::min(mid,r));if(r>mid) pr=query(p _right,mid+1,e,std::max(mid+1,l),r);if(pl.first>ret.first) {ret=std::make_pair(pl.first,0);}if(pl.first==ret.first) {(ret.second+=pl.second)%=mod;}if(pr.first>ret.first) {ret=std::make_pair(pr.first,0);}if(pr.first==ret.first) {(ret.second+=pr.second)%=mod;}return ret;}#undef _left#undef _right#undef mid
};
SegmentTree sgt[2][2];
int main() {const int n=getint();for(register int i=1;i<=n;i++) {a[i]=getint();}for(register int i=1;i<=n;i++) {f[i][0][1]=f[i][1][1]=1;g[i][0][1]=g[i][1][1]=1;for(register int j=0;j<2;j++) {for(register int k=0;k<2;k++) {std::pair<int,int> p;if(j) {p=sgt[!j][!k].query(1,1,n,a[i],n);} else {p=sgt[!j][!k].query(1,1,n,1,a[i]);}if(p.first+1>f[i][j][k]) {f[i][j][k]=p.first+1;g[i][j][k]=0;}if(p.first+1==f[i][j][k]) {(g[i][j][k]+=p.second)%=mod;}}}for(register int j=0;j<2;j++) {for(register int k=0;k<2;k++) {sgt[j][k].modify(1,1,n,a[i],f[i][j][k],g[i][j][k]);}}}int ans=0,cnt=0;for(register int i=1;i<=n;i++) {for(register int j=0;j<2;j++) {for(register int k=0;k<2;k++) {ans=std::max(ans,f[i][j][k]);}}}for(register int i=1;i<=n;i++) {for(register int j=0;j<2;j++) {for(register int k=0;k<2;k++) {if(f[i][j][k]==ans) {(cnt+=g[i][j][k])%=mod;}}}}printf("%d %d\n",ans,cnt);return 0;
}

转载于:https://www.cnblogs.com/skylee03/p/9876317.html

[CC-MCO16306]Fluffy and Alternating Subsequence相关推荐

  1. Codeforces Round #636 (Div. 3) C.Alternating Subsequence

    Codeforces Round #636 (Div. 3) C.Alternating Subsequence 题目链接 Recall that the sequence b is a a subs ...

  2. 你面试稳了!通关LeetCode刷题完整攻略,省时又高效

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:穷码农 来源:https://zhuanlan.zhihu.com/p/10 ...

  3. Codeforces Round #636 (Div. 3)(ABC)

    A. Candies 水题,暴力即可 代码如下: #include<bits/stdc++.h> #define ll long long using namespace std;int ...

  4. 我和乘子交替方向法admm_找到最大和交替子序列

    我和乘子交替方向法admm Problem statement: 问题陈述: Given a sequence of numbers, you have to find the maximum sum ...

  5. Codeforces暑期训练周报(7.21~7.27)

    A. Flipping Game time limit per test: 1 second memory limit per test:  256 megabytes input: standard ...

  6. 19级爪哇程序设计新手赛2.0(参考题解)

    看完它 A - Candies CodeForces - 1343A 题意: (1)玄学观察法,咋们先来看看案例: 3 --> 1 除以3==2^2-1 6 --> 2 除以3 7 --& ...

  7. Codeforces Round #636 (Div. 3)部分题解

    链接:Codeforces Round #636 (Div. 3) A - Candies 题意:求出一个x满足x+2∗x+4∗x+⋯+2k−1∗x=n且k>1 思路:提出x得x∗(1+2+4+ ...

  8. Codeforces Round #636 (Div. 3)

    Codeforces Round #636 (Div. 3)(2020.4.21) A.Candies 因为题目保证了有解,所以我们枚举一下 k k k就行了. #include <bits/s ...

  9. Codeforces Round #636 (Div. 3) 题解

    A. Candies 查看题解 数学 B. Balanced Array 查看题解 数学 C. Alternating Subsequence 查看题解 贪心 D. Constant Palindro ...

最新文章

  1. 2022-2028年中国动力电池行业深度调研及投资前景预测报告
  2. Ajax学习-Ajax简介
  3. Linux系统命令三剑客之 awk
  4. python基础知心得总结_【python】基础学习心得总结(一)
  5. Android Gradle 自定义Task 详解
  6. DNS 访问 Service - 每天5分钟玩转 Docker 容器技术(138)
  7. 安卓布局参数类LayoutParams
  8. tlab java_浅析java中的TLAB
  9. SAP License:雾里看花系列——SAP顾问应该脱离”保姆”的角色
  10. Silverlight WCF RIA服务(十七)数据 7
  11. 第十三届蓝桥杯第二场模拟赛题解
  12. mysql executereader_ExecuteReader的用法
  13. matlab powf,科学网—MZDDE中操作数更正 - 张凯元的博文
  14. ndows10cad安装不上,win10安装cad2014会显示连接不到网络
  15. wr885n虚拟服务器设置,TP-Link TL-WR885N V4路由器上网设置方法
  16. zabbix 5.0所有依赖包_最详细的 Zabbix 使用教程
  17. selenium爬取网页表格数据并存到Excel
  18. 力扣121题 “买卖股票的最 佳时机”
  19. 渗透测试 ( 3 ) --- Metasploit Framework ( MSF )
  20. 解决thinphp里返回json时斜杆和中文被转义问题

热门文章

  1. python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)...
  2. Qt 中messageBox使用
  3. SEO菜鸟之笨鸟先飞
  4. 量子力学 or 线性代数(四)?
  5. 信息学奥赛一本通高手训练1679:子集
  6. Follow me 总结
  7. em算法怎么对应原有分类_EM算法
  8. matlab中m文件的好处,请教matlab中M文件问题?
  9. 44.0.概率论与数理统计-估计量的评价准则,无偏性,有效性,相合性
  10. .net windows service开发与安装