这个题目当时没有想到怎么写,看了一下题解,了解了两种解法,第一个是用栈去模拟,如果当前的括号和栈顶的括号匹配的话
就给当前的位置标记栈顶下一位的数字(把当前栈顶的弹出后赋值),这样做的话对于一个对称的大区间就能传递了。另一种解法就是利用线段树,对于能够匹配的位置我们给他赋值当前的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");
}
}