理解了題意就很容易模擬了。
從後向前,然後括號裡面的不是位置,而是數。
st表處理
先處理出i->i+2^j的or和and
方法1:二分答案
用二分優化i->j j走的過程,直接找出一段連續區間相同的,然後直接跳。
方法2:倍增找答案
對於乙個i
直接倍增找i最近能滿足條件的j和最遠的j
方法1:二分(極端資料肯定t)
#include
#include
#include
#include
using namespace std;
const int mod=1e9+7;
int ana[110000][21],ord[110000][21];
intq[110000];
int get_and(int l,int r)
int get_or(int l,int r)
int main()
long long cnt=0;
for(int i=1;i<=n;i++)
if(ans)
else
break;}}
printf("%lld\n",cnt%mod);
}
方法2:倍增
#include
#include
#include
#include
using namespace std;
const int mod=1e9+7;
int ana[110000][21],ord[110000][21];
intq[110000];
int get_and(int l,int r)
int get_or(int l,int r)
int main()
long long cnt=0;
for(int i=1;i<=n;i++)
printf("%lld\n",cnt%mod);
}
收集果子,還沒做。。。