Princess Principal (棧)
阿新 • • 發佈:2018-12-15
這個題目當時沒有想到怎麼寫,看了一下題解,瞭解了兩種解法,第一個是用棧去模擬,如果當前的括號和棧頂的括號匹配的話
就給當前的位置標記棧頂下一位的數字(把當前棧頂的彈出後賦值),這樣做的話對於一個對稱的大區間就能傳遞了。另一種解法就是利用線段樹,對於能夠匹配的位置我們給他賦值當前的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"); } }