标签:set clu style span bsp main while \n div
e没学过做不出来。。
处理合法的区间很麻烦,但是处理非合法的区间很容易
答案就是所有的取法-不合法的区间
这题一定要双边界推进处理!!!!
一开始用单边界向右推进,结果后来发现错了,拿样例1就可以证明
所以先预处理出左边界和右边界
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> using namespace std; int L[250000]; int R[250000]; int pos[250000]; int a[250000]; int main() { int n; while(~scanf("%d",&n)) { memset(L,0,sizeof(L)); memset(R,0,sizeof(R)); memset(pos,0,sizeof(pos)); map<int,int>last; for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++) { L[i]=last[a[i]]; for(int j=0;j<=31;j++) { if((a[i]&(1<<j))==0) { L[i]=max(L[i],pos[j]); } } for(int j=0;j<=31;j++) { if((a[i]&(1<<j))>0)pos[j]=i; } last[a[i]]=i; } for(int j=0;j<=31;j++)pos[j]=n+1; for(int i=n;i>=1;i--) { R[i]=n+1; for(int j=0;j<=31;j++) { if((a[i]&(1<<j))==0) { R[i]=min(R[i],pos[j]); } } for(int j=0;j<=31;j++) { if((a[i]&(1<<j))>0)pos[j]=i; } } __int64 output=1ll*n*(n+1)/2; for(int i=1;i<=n;i++) { __int64 temp1=i-L[i]; __int64 temp2=R[i]-i; output-=temp1*temp2; } printf("%I64d\n",output); } }
标签:set clu style span bsp main while \n div
原文地址:https://www.cnblogs.com/zsben991126/p/10556067.html