1. 程式人生 > >Princess Principal (棧)

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");
    }
}