Princess Principal (栈)

题目链接

这个题目当时没有想到怎么写,看了一下题解,了解了两种解法,第一个是用栈去模拟,如果当前的括号和栈顶的括号匹配的话

就给当前的位置标记栈顶下一位的数字(把当前栈顶的弹出后赋值),这样做的话对于一个对称的大区间就能传递了。另一种解法就是利用线段树,对于能够匹配的位置我们给他赋值当前的pos 不能匹配的就赋值为-1 这样对于一个都是匹配的区间,区间的最大最小值一定一两个端点。

例如:

0 1 2 3 4 5

1 0 3 0 5 0

0 2 3 4 5 1

1 2 1 4 1 0

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<set>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define sca(x) scanf("%d",&x)
#define per(i,j,k) for(int i=j;i>=k;i--)
#define inf 0x3f3f3f3f
#define LL long long
#define N 1006000
#define inf 0x3f3f3f3f

int a[N],b[N],s[N];
int top=0;

int main()
{
    int n,m,q;
    sca(n),sca(m),sca(q);
    rep(i,1,n)sca(a[i]);
    rep(i,1,n)
    {
        if(!top||a[i]/2!=a[s[top]]/2||a[i]!=a[s[top]]+1)
        {
            s[++top]=i;
        }
        else top--;
        b[i]=s[top];
    }
    while(q--)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        if(u==v)puts("No");
        else if((v-u)%2&&b[u-1]==b[v])puts("Yes");
        else puts("No");
    }
}
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<set>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define sca(x) scanf("%d",&x)
#define per(i,j,k) for(int i=j;i>=k;i--)
#define inf 0x3f3f3f3f
#define LL long long
#define N 1006000
#define inf 0x3f3f3f3f
 
int a[N],b[N],s[N];
int top=0;
struct node
{
    int Min,Max;
}T[N*4];
void build(int rt,int l,int r)
{
    if(l==r)
    {
        T[rt].Min=b[l];
        T[rt].Max=b[l];
        return ;
    }
    int m=(l+r)>>1;
    build(rt<<1,l,m);
    build(rt<<1|1,m+1,r);
    T[rt].Min=min(T[rt<<1].Min,T[rt<<1|1].Min);
    T[rt].Max=max(T[rt<<1].Max,T[rt<<1|1].Max);
}
 
void query(int rt,int l,int r,int ql,int qr,int &a,int &b)
{
    if(l>=ql && r<=qr)
    {
        a=min(T[rt].Min,a);
        b=max(T[rt].Max,b);
        return ;
    }
    int m=(l+r)>>1;
    if(ql<=m)query(rt<<1,l,m,ql,qr,a,b);
    if(qr>m)query(rt<<1|1,m+1,r,ql,qr,a,b);
}
int main()
{
    int n,m,q;
    sca(n),sca(m),sca(q);
    rep(i,1,n)sca(a[i]);
    rep(i,1,n)
    {
        b[i]=-1;
        if(!(a[i]%2))s[++top]=i;
        else if(top&&a[i]/2==a[s[top]]/2)
        {
            b[i]=s[top];
            b[s[top]]=i;
            top--;
        }
    }
    build(1,1,n);
    while(q--)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        int i=u,j=v;
        query(1,1,n,u,v,i,j);
        if((v-u)%2==0)puts("No");
        else if(i==u&&j==v)puts("Yes");
        else puts("No");
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40894017/article/details/83041799