【bzoj3300】 USACO2011Best Parenthesis 暴力+树状数组

来源:互联网 发布:js disabled 无效 编辑:程序博客网 时间:2024/05/22 07:57

貌似这道题暴力递归就可以了,可能是我想麻烦了吧,先用栈找出每个括号与之匹配的括号,然后对于括号对按照括号对的长度排序,从小的开始统计后加入树状数组,就没有了。


#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>#define mod 12345678910#define maxn 200010using namespace std;struct yts{int l,r;}q[maxn];int a[maxn],s[maxn];long long c[maxn];int n,top,num;bool cmp(yts x,yts y){return x.r-x.l+1<y.r-y.l+1;}int lowbit(int x){return x&(-x);}void add(int i,long long x){while (i<=n){c[i]=(c[i]+x)%mod;i+=lowbit(i);}}long long query(int i){long long ans=0;while (i){ans=(ans+c[i])%mod;i-=lowbit(i);}return ans;}int main(){scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);top=0;num=0;for (int i=1;i<=n;i++)  if (a[i]==0) s[++top]=i;else q[++num].l=s[top],q[num].r=i,top--;sort(q+1,q+num+1,cmp);long long ans=0;for (int i=1;i<=num;i++){if (q[i].r-q[i].l==1) {ans=(ans+1)%mod,add(q[i].r,1);continue;}long long x=(query(q[i].r)-query(q[i].l-1)+mod)%mod;ans=(ans+x)%mod;add(q[i].r,x);}printf("%lld\n",ans);return 0;}


0 0
原创粉丝点击