美文网首页
牛客国庆集训派对Day1(Princess Principal)

牛客国庆集训派对Day1(Princess Principal)

作者: kimoyami | 来源:发表于2018-10-01 19:16 被阅读41次

链接:https://www.nowcoder.com/acm/contest/201/J
思路:好像又学到了一些新姿势,首先匹配括号的时候可以从左向右扫一遍把右括号先全部匹配掉,再从右往左扫一遍把左括号匹配掉(可以证明如果能匹配左右括号是对应匹配的,如果不能都为-1),然后建立RMQ(好久没有用过都快忘了这是个什么东西了),求区间的最大最小值,如果最小值为-1或者小于l或者最大值大于r,则这个区间无解。
代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e6+100;
int s[maxn];
int head = 0;

int a[maxn];
int b[maxn];
int dmin[maxn][100];
int dmax[maxn][100];
int n,m,q;

void RMQ_init(){
    for(int i=0;i<n;i++){
        dmin[i][0] = b[i];
        dmax[i][0] = b[i];
    }
        for(int j=1;(1<<j)<=n;j++)
            for(int i=0;i+(1<<j)-1<n;i++){
                dmax[i][j] = max(dmax[i][j-1],dmax[i+(1<<(j-1))][j-1]);
                dmin[i][j] = min(dmin[i][j-1],dmin[i+(1<<(j-1))][j-1]);
            }
}

int RMQ_MAX(int L,int R){
    int k =  0;
    while(1<<(k+1)<=R-L+1)k++;
        return max(dmax[L][k],dmax[R-(1<<k)+1][k]);
}

int RMQ_MIN(int L,int R){
    int k =  0;
    while(1<<(k+1)<=R-L+1)k++;
        return min(dmin[L][k],dmin[R-(1<<k)+1][k]);
}

int main(){
    scanf("%d%d%d",&n,&m,&q);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int i=0;i<n;i++){
        if(a[i]%2==0){
            s[head++] = i;
        }
        else{
            int now = -1;
            if(head)now = s[--head];
            if(now==-1)b[i] = -1;
            else{
                if(a[now]/2==a[i]/2)b[i] = now;
                else b[i] = -1;
            }
        }
    }
    head = 0;
    for(int i=n-1;i>=0;i--){
        if(a[i]&1){
            s[head++] = i;
        }
        else{
            int now = -1;
            if(head)now = s[--head];
            if(now==-1)b[i] = -1;
            else{
                if(a[now]/2==a[i]/2)b[i] = now;
                else b[i] = -1;
            }
        }
    }
    RMQ_init();
    for(int i=0;i<q;i++){
        int l,r;
        scanf("%d%d",&l,&r);
        l--;
        r--;
        int minv = RMQ_MIN(l,r);
        int maxv = RMQ_MAX(l,r);
        if(minv==-1||minv<l||maxv>r)printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}

相关文章

网友评论

      本文标题:牛客国庆集训派对Day1(Princess Principal)

      本文链接:https://www.haomeiwen.com/subject/yfinoftx.html