ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P2516 [HAOI2010]最长公共子序列 单调队列/ST表

2019-07-03 20:02:37  阅读:216  来源: 互联网

标签:ch int fix P2516 ret ST HAOI2010 include define


开一个单调队列,下标递增,值递减。

然后在上面二分最大数。

如果加上并查集可以做到接近线性。

还有一种是插入一个数然后,从后向前更新ST表。

#include<cstdio>
#include<iostream>
#define R register int
using namespace std;
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
} const int N=200010;
int n,M,cnt,top,t;
int a[N],q[N];
signed main() {
    n=g(),M=g(); for(R i=1,x;i<=n;++i) { register char s[2];
        scanf("%s",s),x=g(); if(s[0]=='A') {
            a[++cnt]=(x+t)%M;
            while(top&&a[q[top]]<a[cnt]) --top;
            q[++top]=cnt;
        } else if(s[0]=='Q') printf("%d\n",t=a[*lower_bound(q+1,q+top+1,cnt-x+1)]);
    }
}

ST表:

#include<cstdio>
#include<iostream>
#include<cmath>
#define ll long long
#define R register ll
using namespace std;
namespace jack {
    #define db double 
    int n,m; ll t,d,ans,a[200010],f[200010][21]; bool flg;
    inline int max(int a,int b) {return a>b?a:b;}
    inline void change(int u) {f[u][0]=a[u]; for(R i=1;u-(1<<i)>=0;i++) f[u][i]=max(f[u][i-1],f[u-(1<<(i-1))][i-1]);}//反向ST表    
    inline ll find(int a,int b) {db t=log2(b-a+1); R k=t; return max(f[b][k],f[a+(1<<k)-1][k]);}
    inline ll g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=(ret<<3)+(ret<<1)+(ch^48); while(isdigit(ch=getchar())); return fix*ret;
    }
    inline void main() {
        m=g(),d=g();
        for(R i=1;i<=m;i++) {
            register char ch;
            while(!isalpha(ch=getchar())); 
            if(ch=='A') {R x=g();a[++n]=(x+t)%d,change(n);}
            else {
                R l=g(); if(l==1) {printf("%lld\n",a[n]),t=a[n];continue;}
                ans=find(n-l+1,n);
                printf("%lld\n",ans); t=ans;
            }
        }
    }
}
signed main() {jack::main();}

2019.07.03

标签:ch,int,fix,P2516,ret,ST,HAOI2010,include,define
来源: https://www.cnblogs.com/Jackpei/p/11128624.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有