CSU 1809
不想說話,1<<l寫成i<<l,雖然還是有問題,不過這個鍋最大。
如果交換的是(? )才會有問題,只要從x到y(tǒng)-1的位置的剩余左括號數(shù)都會減2,所以st表找一蛤這中間的最小值就行了。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define maxl 100010using namespace std;int n,q,top,len; int a[maxl],f1[20][maxl],f2[20][maxl]; int pre[maxl],suf[maxl]; char s[maxl]; bool flag;inline void prework() {scanf("%s",s+1);top=0;for(int i=1;i<=n;i++)if(s[i]=='(')++top,f1[0][i]=top;else--top,f1[0][i]=top;len=log2(n);for(int l=1;l<=len;l++)for(int i=1;i+(1<<(l-1))<=n;i++)f1[l][i]=min(f1[l-1][i],f1[l-1][i+(1<<(l-1))]); }inline int rmq(int l,int r) {int k=log2(r-l+1);return min(f1[k][l],f1[k][r-(1<<k)+1]); }inline void mainwork() {int x,y,mini,l;for(int i=1;i<=q;i++){scanf("%d%d",&x,&y);if(x>y)swap(x,y);if(s[x]==s[y] || s[x]==')')printf("Yes\n");else{l=log2(y-x+1-1);mini=min(f1[l][x],f1[l][y-1-(1<<l)+1]);if(mini<=1)printf("No\n");elseprintf("Yes\n"); }} }int main() {while(~scanf("%d%d",&n,&q)){prework();mainwork(); // print();}return 0; }?
總結(jié)
- 上一篇: 【经验分享】突然我的SM.MS的图床没法
- 下一篇: Sentinel流量卫兵