HZAU 1205 Sequence Number(最大值前后缀 +双指针 + 二分)
来源:互联网 发布:阿里云 虚拟主机 jsp 编辑:程序博客网 时间:2024/06/05 02:05
先求求后面的最小值前缀,也就是预处理1~i的最小值,然后从右往左双指针,维护右端点>左端点,如果右端点<1~L的最小值,则移动右端点。
#include <bits/stdc++.h>using namespace std;#define MAXN (100000+5)#define INF 0x3f3f3f3fint n,k,arr[MAXN],mmin[MAXN];int main() { while(~scanf("%d",&n)){ mmin[0]=INF; for(int i=1;i<=n;i++) scanf("%d",&arr[i]); for(int i=1;i<=n;i++) mmin[i]=min(mmin[i-1],arr[i]); int res=0; for(int l=n,r=n;l>=1;l--){ while(mmin[l]>arr[r]) r--; res=max(res,r-l); } printf("%d\n",res); } return 0;}
下面闲的*疼又优化了一下,指针直接跳到最小值位置,然后再往下遍历,当然了复杂度还是O(n)
#include <bits/stdc++.h>using namespace std;#define MAXN (100000+5)#define INF 0x3f3f3f3fint n,k,arr[MAXN],mmin[MAXN],mark[MAXN];int main() { while(~scanf("%d",&n)){ mmin[0]=INF,mark[0] = 0; for(int i=1;i<=n;i++) scanf("%d",&arr[i]); for(int i=1;i<=n;i++) if(mmin[i-1]<arr[i]) mmin[i]=mmin[i-1] , mark[i] = mark[i-1]; else mmin[i] = arr[i] , mark[i] = i; int res=0; for(int l=n,r=n;l>=1;){ // cout<<"l="<<l<<' '<<" r="<<r<<" res="<<res<<endl; while( mmin[mark[l]] > arr[r] ) r--; res=max(res,r-mark[l]); l=min(mark[l],--l); //cout<<"l="<<l<<' '<<" r="<<r<<" res="<<res<<endl<<endl; } printf("%d\n",res); } return 0;}
这是一道排序可以过的题,也可以rmq+二分 最快的写法可以用单调栈做到O(n)
我是求后面的最大值后缀,二分后缀;
#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<cstdio>#include<cmath>#include<string>#include<queue>#include<algorithm>#include<stack>#include<cstring>#include<vector>#include<list>#include<set>#include<map>using namespace std;#define ll long long#define pi (4*atan(1.0))#define eps 1e-4#define bug(x) cout<<"bug"<<x<<endl;const int N=1e5+10,M=1e6+10,inf=2147483647;const ll INF=1e18+10,mod=2147493647; int a[N],nex[N];int main(){ int n; while(~scanf("%d",&n)) { memset(nex,0,sizeof(nex)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int j=n;j>=1;j--) nex[j]=max(a[j],nex[j+1]); int ans=0; for(int i=1;i<=n;i++) { int s=i,e=n,pos=-1; while(s<=e) { int mid=(s+e)>>1; if(nex[mid]>=a[i]) pos=mid,s=mid+1; else e=mid-1; } ans=max(ans,pos-i); } printf("%d\n",ans); } return 0;}
#include <bits/stdc++.h>using namespace std;#define MAXN (50000 + 10)struct Node { int i, a, dp;};struct cmp{ bool operator()(const Node &a,const Node &b) { return a.dp-b.dp>0; }};int main(){ int n, a; Node tmp; int ans; while (~scanf("%d", &n)) { set<Node, cmp> mySet; scanf("%d", &a); tmp.i=0,tmp.a = a,tmp.dp = 0; mySet.insert(tmp); ans = 0; for (int i = 1; i < n; ++i) { scanf("%d", &a); set<Node, cmp>::iterator it; for (it = mySet.begin(); it != mySet.end(); ++it) if (a >= (*it).a) break; tmp.i = i,tmp.a = a; if (it == mySet.end()) tmp.dp = 0; else tmp.dp = i - (*it).i + (*it).dp; if (tmp.dp > ans) ans = tmp.dp; mySet.insert(tmp); } printf("%d\n", ans); } return 0;}
1 0
- HZAU 1205 Sequence Number(最大值前后缀 +双指针 + 二分)
- Envy(最大值前后缀 +双指针 + 二分)
- HZAU 1205 Sequence Number
- HZAU 1203 One Stroke(dfs+二分 Or 双指针)
- HZAU 网络赛 Sequence Number
- Coprime Sequence(前后缀最大公约数)
- HZAU--21--Arithmetic Sequence(二维dp)
- Number Sequence uva+二分
- HDU 6025 Coprime Sequence (前后缀+GCD)
- HDU 4390 Number Sequence 二分
- poj 1019 Number Sequence , 二分
- poj 1019 Number Sequence 二分
- CodeForces - 466C Number of Ways (前后缀和)
- 树状数组 逆序对变形 2017HZAU现场赛G-Sequence Number
- HDU-#1005 Number Sequence(矩阵二分幂)
- poj 1019 Number Sequence(打表+二分)
- HZAU 1019 Arithmetic Sequence [DP]
- HDU-1005 Number Sequence【矩阵二分幂】
- 常用的$.ajax()方法
- hdu 6006 Engineer Assignment(状压dp)
- 使用事务保证和数据完整性
- JSP过滤器防止Xss漏洞
- Android jni(1)
- HZAU 1205 Sequence Number(最大值前后缀 +双指针 + 二分)
- c++实验五(作业)
- Activity的四种启动模式
- 【补充】题目: 编写一个C函数,将”I am from shanghai ”倒置为”shanghai from am I”,及将句子中的单词位置倒置,而不改变单词内部结构.
- 《Java虚拟机原理图解》 1.2、class文件中的常量池
- WIFI 调试 安卓设备 实例
- Linux性能测试 strace命令
- Java 中的动态代理
- 高德地图key码7,已解决