Codeforces 689D Friends and Subsequences(二分+RMQ)
2016-09-07 16:46
429 查看
题意:给两个数列a,数列b,求有多少个区间[l,r],使得a区间的最大值等于b区间的最小值
题解:首先,满足
maxi=lrai−mini=lrbi≤maxi=lr+1ai−mini=lr+1bi
因为左端点固定,区间越大,最大值越大,区间越大,最小值越小。
然后就可以枚举左端点,二分右端点,求出所有的max-min == 0即可,区间查询采用RMQ
题解:首先,满足
maxi=lrai−mini=lrbi≤maxi=lr+1ai−mini=lr+1bi
因为左端点固定,区间越大,最大值越大,区间越大,最小值越小。
然后就可以枚举左端点,二分右端点,求出所有的max-min == 0即可,区间查询采用RMQ
const int MAX = 200010; int a[MAX],b[MAX]; int aa[MAX][25],bb[MAX][25]; int n; void rmq_inita(){ for(int i=0;i<n;i++) aa[i][0]=a[i]; for(int j=1;(1<<j)<=n;j++){ for(int i=0;i+(1<<j)-1<n;i++){ aa[i][j]=max(aa[i][j-1],aa[i+(1<<(j-1))][j-1]); } } } void rmq_initb(){ for(int i=0;i<n;i++) bb[i][0]=b[i]; for(int j=1;(1<<j)<=n;j++){ for(int i=0;i+(1<<j)-1<n;i++){ bb[i][j]=min(bb[i][j-1],bb[i+(1<<(j-1))][j-1]); } } } int rmqa(int L,int R){ int k=0; while((1<<(k+1))<=R-L+1) k++; return max(aa[L][k],aa[R-(1<<k)+1][k]); } int rmqb(int L,int R){ int k=0; while((1<<(k+1))<=R-L+1) k++; return min(bb[L][k],bb[R-(1<<k)+1][k]); } int main(){ while(cin>>n){ for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++) scanf("%d",&b[i]); rmq_inita(); rmq_initb(); LL ans=0; for(int i=0;i<n;i++){ int l=i,r=n-1; while(l<=r){ 4000 int mid=(l+r)/2; if(rmqa(i,mid)-rmqb(i,mid)<0) l=mid+1; else r=mid-1; } ans-=l; l=i,r=n-1; while(l<=r){ int mid=(l+r)/2; if(rmqa(i,mid)-rmqb(i,mid)<=0) l=mid+1; else r=mid-1; } ans+=l; } cout<<ans<<endl; } return 0; }
相关文章推荐
- Codeforces 190D Non-Secret Cypher【思维+RMQ+二分】
- Codeforces 689D Friends and Subsequences (RMQ+二分)
- Codeforces 689D -Friends and Subsequences (RMQ查询-> ST表+二分)
- Codeforces 689D Friends and Subsequences(RMQ+二分)
- codeforces 359D 二分答案+RMQ
- codeforces 689D D. Friends and Subsequences(RMQ+二分)
- Codeforces 514D R2D2 and Droid Army【二分+RMQ】
- CodeForces 6E Exposition(二分+RMQ)
- codeforces_689D. Friends and Subsequences(RMQ+二分)
- Codeforces 387E George and Cards【思维+RMQ+二分+树状数组】被卡常= =
- Codeforces 689D Friends and Subsequences【思维+二分+RMQ】套路题
- codeforces-487B Strip(dp+rmq+二分+水数据)
- Codeforces 689D Friends and Subsequences(二分+RMQ)
- 【打CF,学算法——四星级】CodeForces 689D Friends and Subsequences (RMQ+二分)
- Codeforces 652C Foe Pairs【二分+RMQ】好像这题Dp做法很多啊
- Codeforces 514 D R2D2 and Droid Army(RMQ+二分)
- CodeForces 689D Friends and Subsequences (RMQ+二分)
- 【打CF,学算法——四星级】CodeForces 514D R2D2 and Droid Army (RMQ+二分)
- Codeforces 359D Pair of Numbers【思维+二分+区间Gcd+区间最小值RMQ】
- Codeforces-689 D Friends and Subsequences(RMQ+二分)