首页 > 其他分享 >POJ - 3368

POJ - 3368

时间:2024-09-05 19:36:47浏览次数:3  
标签:rmq 3368 int res scanf while POJ

还是rmq.
原来如此
代码:

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int a[N],b[N],rmq[N][20];
int pw(int k){
    int res=1;
    while(k--) res*=2;
    return res;
}
int getk(int l,int r){
    int k=0;
    while(r-l+1>=pw(k+1)) ++k;
    return k;
}
int main() {
    int n,qn;
    while(~scanf("%d",&n) && n){
        scanf("%d",&qn);
        for(int i=1;i<=n;++i) scanf("%d",&a[i]);
        for(int i=1;i<=n;){
            int p=upper_bound(a+1,a+1+n,a[i])-a-1;
            for(int j=i;j<p;++j) b[j]=0;
            b[p]=p-i+1;
            i=p+1;
        }
        for(int i=1;i<=n;++i) rmq[i][0]=b[i];
        for(int u=1;u<=20;++u){
            for(int i=1;i+pw(u)<=n;++i){
                rmq[i][u]=max(rmq[i][u-1],rmq[i+pw(u-1)][u-1]);
            }
        }
        for(int i=1;i<=qn;++i){
            int l,r;scanf("%d%d",&l,&r);
            int p1=upper_bound(a+1,a+1+n,a[l])-a;
            --p1;
            if(p1>r) p1=r;
            int p2=lower_bound(a+1,a+1+n,a[r])-a;
            if(p2<l) p2=l;
            int res=max(p1-l+1,r-p2+1);
            if(p1+1<=p2-1){
                int k=getk(p1+1,p2-1);
                res=max(res,max(rmq[p1+1][k],rmq[p2+1-pw(k)][k]));
            }
            printf("%d\n",res);
        }
    }
    return 0;
}

标签:rmq,3368,int,res,scanf,while,POJ
From: https://www.cnblogs.com/zan-mei-tai-yang/p/18399125

相关文章

  • POJ-3264
    这是rmq半懂不懂(因为已经会线段树了)但是!它的代码真的好短啊啊啊啊啊!#include<bits/stdc++.h>usingnamespacestd;intdp1[500010][20],dp2[500010][20],w[1000010];intmain(){ intn,k,q,l,r; ios::sync_with_stdio(0); cin.tie(0); cin>>n>>q; for(inti=1;i<=n;i+......
  • POJ - 3150
    题解题意:题面很臭很长。大意是,有一个大小为N的环,给出M,K,D,以及N个数。我们进行K次操作,每次操作把距离当前点不超过D的累加到当前点,结果模M。思路:因为要进行K次,每次的原则是一样的,我们可以想到用矩阵来优化,如果i能到达j,把么base[i][j]=1;则结果ans=A(base^K)。但是需要优化,时间复杂......
  • POJ - 3150
    题解题意:题面很臭很长。大意是,有一个大小为N的环,给出M,K,D,以及N个数。我们进行K次操作,每次操作把距离当前点不超过D的累加到当前点,结果模M。思路:因为要进行K次,每次的原则是一样的,我们可以想到用矩阵来优化,如果i能到达j,把么base[i][j]=1;则结果ans=A(base^K)。但是需要优化,时间复杂......
  • POJ - 3296
    对于操作来说,第一次是最重要的,后来每次倒入水量是相同的。这是因为后面的总液体量不变的情况下,ans=第一次后液体浓度*后几次液体浓度的积所以由1/v^2<1/v^2-x^2(v,x>0),易得后几次水量相同那么,对于第一次来说可以用三分法来求极值。代码:#include<bits/stdc++.h>usingn......
  • POJ-1066
    题解告诉我:大意:在一个矩形区域内,有n条线段,线段的端点是在矩形边上的,有一个特殊点,问从这个点到矩形边的最少经过的线段条数最少的书目,穿越只能在中点穿越思路:需要巧妙的转换一下这个问题,因为从一个点到终点不可能“绕过”围墙,只能穿过去,所以门是否开在中点是无所谓的,只要求四周线......
  • POJ - 3318
    他说:O(n^3)是过不了滴一搜……6代码和题解没有实质区别:#include<cstdio>#include<ctime>#include<cstdlib>usingnamespacestd;inta[505][505],b[505][505],c[505][505];intmain(){ srand(time(NULL)); intn; ios::sync_with_stdio(0); cin.tie(0); while(cin......
  • POJ - 1765
    第一次做扫描线挺好的#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;structppx{ intl,r; doubleleft,right; doublelen; intcover;//记录重边情况}tree[4*200+10];doubley[200+10];//对应的序号装对应的边structpp{ doublex......
  • POJ - 1870
    先把蜂巢快递柜画出来:__________/\__/\__/\__/\____/\__/\__/53\__/\__/\__/\__/\__/52\__/54\__/\__/\\__/\__/51\__/31\__/55\__/\__//\__/50\__/30\__/32\__/56\__/\\__/49\__/29\__......
  • POJ - 3318
    他说:O(n^3)是过不了滴一搜……6代码和题解没有实质区别:#include<cstdio>#include<ctime>#include<cstdlib>usingnamespacestd;inta[505][505],b[505][505],c[505][505];intmain(){ srand(time(NULL)); intn; ios::sync_with_stdio(0); cin.tie(0); while(cin......
  • POJ - 2976
    原来是二分谁对平均分贡献大选谁界限<0.001,100次足矣#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;constintmaxn=1010;intn,k;doublemid;structNode{ doublea,b;}w[maxn];boolcmp(Nodex,Nodey......