牛客國慶集訓派對Day1 J Princess Principal(線段樹+括號匹配)
阿新 • • 發佈:2018-12-13
隊友寫的一個線段樹加字首的東西
太強了
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> using namespace std; #define ll long long const int N = 1e6 + 10; const int inf =0x3f3f3f3f; int n; int a[N]; struct node { int id,v; }b[N]; int num[N]; ll qz[N]; ll minn[N<<2]; void pushup(int x) { minn[x]=min(minn[x*2],minn[x*2+1]); } void build(int x,int l,int r) { if(l==r) { minn[x]=qz[l]; return; } int mid=(l+r)/2; build(x*2,l,mid); build(x*2+1,mid+1,r); pushup(x); } ll query(int l,int r,int L,int R,int x) { if(L<=l&&R>=r) { return minn[x]; } int mid=(l+r)/2; ll ans=1e18; if(L<=mid)ans=min(ans,query(l,mid,L,R,x*2)); if(R>mid)ans=min(ans,query(mid+1,r,L,R,x*2+1)); return ans; } int main() { int n,m,q; scanf("%d%d%d",&n,&m,&q); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int cnt=0; for(int i=1;i<=n;i++) num[i]=-inf; for(int i=1;i<=n;i++) { if(a[i]%2==0) { b[cnt].id=i; b[cnt++].v=a[i]; } else { if(cnt>=1) { if(b[cnt-1].v%2==0&&b[cnt-1].v+1==a[i]) { num[b[cnt-1].id]=1; num[i]=-1; cnt--; } else { cnt=0; } } } } qz[0]=0; for(int i=1;i<=n;i++) qz[i]=qz[i-1]+num[i]; build(1,1,n); while(q--) { int l,r; scanf("%d%d",&l,&r); if(qz[r]-qz[l-1]!=0||query(1,n,l,r,1)<qz[l-1]) { printf("No\n"); } else { printf("Yes\n"); } } return 0; }