[CC-MCO16306]Fluffy and Alternating Subsequence
[CC-MCO16306]Fluffy and Alternating Subsequence
题目大意:
给定一个\(1\sim n(n\le3\times10^5)\)的排列\(a\)。
对于一个序列\(b\),如果以下两个条件之一成立,则称\(b_i\)是一个跳跃序列:
- \(b_{2k}<b_{2k-1}\)对所有的\(2k\le n\)都成立,且\(b_{2k}<b_{2k+1}\)对所有的\(2k+1\le n\)都成立。
- \(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相关推荐
- 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 ...
- 你面试稳了!通关LeetCode刷题完整攻略,省时又高效
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:穷码农 来源:https://zhuanlan.zhihu.com/p/10 ...
- Codeforces Round #636 (Div. 3)(ABC)
A. Candies 水题,暴力即可 代码如下: #include<bits/stdc++.h> #define ll long long using namespace std;int ...
- 我和乘子交替方向法admm_找到最大和交替子序列
我和乘子交替方向法admm Problem statement: 问题陈述: Given a sequence of numbers, you have to find the maximum sum ...
- Codeforces暑期训练周报(7.21~7.27)
A. Flipping Game time limit per test: 1 second memory limit per test: 256 megabytes input: standard ...
- 19级爪哇程序设计新手赛2.0(参考题解)
看完它 A - Candies CodeForces - 1343A 题意: (1)玄学观察法,咋们先来看看案例: 3 --> 1 除以3==2^2-1 6 --> 2 除以3 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+ ...
- Codeforces Round #636 (Div. 3)
Codeforces Round #636 (Div. 3)(2020.4.21) A.Candies 因为题目保证了有解,所以我们枚举一下 k k k就行了. #include <bits/s ...
- Codeforces Round #636 (Div. 3) 题解
A. Candies 查看题解 数学 B. Balanced Array 查看题解 数学 C. Alternating Subsequence 查看题解 贪心 D. Constant Palindro ...
最新文章
- 2022-2028年中国动力电池行业深度调研及投资前景预测报告
- Ajax学习-Ajax简介
- Linux系统命令三剑客之 awk
- python基础知心得总结_【python】基础学习心得总结(一)
- Android Gradle 自定义Task 详解
- DNS 访问 Service - 每天5分钟玩转 Docker 容器技术(138)
- 安卓布局参数类LayoutParams
- tlab java_浅析java中的TLAB
- SAP License:雾里看花系列——SAP顾问应该脱离”保姆”的角色
- Silverlight WCF RIA服务(十七)数据 7
- 第十三届蓝桥杯第二场模拟赛题解
- mysql executereader_ExecuteReader的用法
- matlab powf,科学网—MZDDE中操作数更正 - 张凯元的博文
- ndows10cad安装不上,win10安装cad2014会显示连接不到网络
- wr885n虚拟服务器设置,TP-Link TL-WR885N V4路由器上网设置方法
- zabbix 5.0所有依赖包_最详细的 Zabbix 使用教程
- selenium爬取网页表格数据并存到Excel
- 力扣121题 “买卖股票的最 佳时机”
- 渗透测试 ( 3 ) --- Metasploit Framework ( MSF )
- 解决thinphp里返回json时斜杆和中文被转义问题
热门文章
- python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)...
- Qt 中messageBox使用
- SEO菜鸟之笨鸟先飞
- 量子力学 or 线性代数(四)?
- 信息学奥赛一本通高手训练1679:子集
- Follow me 总结
- em算法怎么对应原有分类_EM算法
- matlab中m文件的好处,请教matlab中M文件问题?
- 44.0.概率论与数理统计-估计量的评价准则,无偏性,有效性,相合性
- .net windows service开发与安装