题意:You are given an array A of N non-negative integers and an integer M.

Find the number of pair(i,j) such that 1≤i≤j≤N and min(Ai,Ai+1,...,Aj)⋅(Ai⊕Ai+1⊕...⊕Aj)≤M.

先用把数字从小到大依次插入,用个set预处理出每个最小值控制的子区间的范围,对于大小相同的数,靠左的数优先。

然后对于每个子区间,最小值将它划分成左右两段,枚举较短的那段,在较长的那段中用可持久化Trie查询满足条件的对数。前缀异或和别忘了处理,很经典了。

就是设M/min(Ai,Ai+1,...,Aj)为W,每次向左右儿子查询,如果W的这位是零,那就不累计答案,直接朝零(这里指异或上左端点的前缀和以后的零)走;如果W的这位是一,那就统计上零(这里指异或上左端点的前缀和以后的零)的子树的答案,然后朝一走。别忘了到叶子以后还要在累计一次。(叶子必然满足条件,可以累计。)

#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
typedef set<int>::iterator ITER;
typedef long long ll;
int n;
ll m,a[100005];
int b[100005],lb[100005],ub[100005];
int w,xors[100005];
bool cmp(const int &x,const int &y){
return (a[x]!=a[y] ? a[x]<a[y] : x<y);
}
ll ans;
#define N 100005
#define MAXBIT 31
int root[N],ch[N*(MAXBIT+1)][2],sz[N*(MAXBIT+1)],tot;
void add(int now,int W)
{
int old=root[now-1];
root[now]=++tot;
now=root[now];
for(int i=MAXBIT;i>=1;--i)
{
int Bit=((W>>(i-1))&1);
sz[now]=sz[old]+1;
ch[now][Bit^1]=ch[old][Bit^1];
ch[now][Bit]=++tot;
now=ch[now][Bit];
old=ch[old][Bit];
}
sz[now]=sz[old]+1;
}
void query(int bef,int L,int R,int W,int fl)
{
L=root[L];R=root[R+1];
for(int i=MAXBIT;i>=1;--i){
int Bit=(W>>(i-1)&1);
if(Bit==1){
if((xors[bef-fl]>>(i-1)&1)==1){
ans+=(ll)(sz[ch[R][1]]-sz[ch[L][1]]);
R=ch[R][0];
L=ch[L][0];
}
else{
ans+=(ll)(sz[ch[R][0]]-sz[ch[L][0]]);
R=ch[R][1];
L=ch[L][1];
}
}
else{
if((xors[bef-fl]>>(i-1)&1)==1){
R=ch[R][1];
L=ch[L][1];
}
else{
R=ch[R][0];
L=ch[L][0];
}
}
}
ans+=(ll)(sz[R]-sz[L]);
}
int main(){
//freopen("f.in","r",stdin);
scanf("%d%lld",&n,&m);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
xors[i]=(xors[i-1]^a[i]);
}
for(int i=1;i<=n;++i){
b[i]=i;
}
sort(b+1,b+n+1,cmp);
set<int> S;
for(int i=1;i<=n;++i){
ITER it=S.lower_bound(b[i]);
if(it!=S.end()){
ub[b[i]]=((*it)-1);
}
else{
ub[b[i]]=n;
}
if(it==S.begin()){
lb[b[i]]=1;
}
else{
--it;
lb[b[i]]=((*it)+1);
}
S.insert(b[i]);
}
add(1,0);
for(int i=1;i<=n;++i){
add(i+1,xors[i]);
}
for(int i=1;i<=n;++i){
if(m/a[i]>=(1ll<<31)){
ans+=(ll)(i-lb[i]+1)*(ll)(ub[i]-i+1);
continue;
}
w=(int)(m/a[i]);
if(i-lb[i]<=ub[i]-i){
for(int j=lb[i];j<=i;++j){
query(j,i,ub[i],w,1);
}
}
else{
for(int j=i;j<=ub[i];++j){
query(j,lb[i]-1,i-1,w,0);
}
}
}
printf("%lld\n",ans);
return 0;
}

【set】【可持久化Trie】The 16th UESTC Programming Contest Preliminary K - Will the circle be broken的更多相关文章

  1. The 15th UESTC Programming Contest Preliminary K - Kidd1ng Me? cdoj1565

    地址:http://acm.uestc.edu.cn/#/problem/show/1565 题目: Kidd1ng Me? Time Limit: 3000/1000MS (Java/Others) ...

  2. 【字符串哈希】The 16th UESTC Programming Contest Preliminary F - Zero One Problem

    题意:给你一个零一矩阵,q次询问,每次给你两个长宽相同的子矩阵,问你它们是恰好有一位不同,还是完全相同,还是有多于一位不同. 对每行分别哈希,先一行一行地尝试匹配,如果恰好发现有一行无法对应,再对那一 ...

  3. 【推导】The 16th UESTC Programming Contest Preliminary L - Foxtrot

    题意:有n瓶药剂,其中只有一瓶药剂有毒.让你用最少的小白鼠试出哪瓶有毒.你只有一次给任意只小白鼠各喂食任意种类药剂的机会. m只老鼠就能对应2^m种“生死状态”的组合,给每种状态分配一个种类的药剂,然 ...

  4. The 15th UESTC Programming Contest Preliminary J - Jermutat1on cdoj1567

    地址:http://acm.uestc.edu.cn/#/problem/show/1567 题目: Jermutat1on Time Limit: 3000/1000MS (Java/Others) ...

  5. The 15th UESTC Programming Contest Preliminary C - C0ins cdoj1554

    地址:http://acm.uestc.edu.cn/#/problem/show/1554 题目: C0ins Time Limit: 3000/1000MS (Java/Others)     M ...

  6. The 15th UESTC Programming Contest Preliminary B - B0n0 Path cdoj1559

    地址:http://acm.uestc.edu.cn/#/problem/show/1559 题目: B0n0 Path Time Limit: 1500/500MS (Java/Others)    ...

  7. The 15th UESTC Programming Contest Preliminary M - Minimum C0st cdoj1557

    地址:http://acm.uestc.edu.cn/#/problem/show/1557 题目: Minimum C0st Time Limit: 3000/1000MS (Java/Others ...

  8. The 16th UESTC Programming Contest Final 游记

    心情不好来写博客. 为了满足ykk想要气球的愿望,NicoDafaGood.Achen和我成功去神大耍了一圈. 因为队名一开始是LargeDumpling应援会,然后队名被和谐,变成了学校的名字,顿时 ...

  9. The 15th UESTC Programming Contest Preliminary G - GC?(X,Y) cdoj1564

    地址:http://acm.uestc.edu.cn/#/problem/show/1564 题目: G - GC?(X,Y) Time Limit: 3000/1000MS (Java/Others ...

随机推荐

  1. Dream------Java--ant zip 对压缩文件进行指定位置的修改

    ant zip 对压缩文件进行指定位置的修改 实现功能: 对2中文件进行修改: 需求: 在XX文件中,从二进制流的200字节位置开始,往后的30位字节数量.插入一个值 由于涉及到公司内部,不方便写太多 ...

  2. Dream------scala--类的属性和对象私有字段实战详解

    Scala类的属性和对象私有字段实战详解 一.类的属性 scala类的属性跟java有比较大的不同,需要注意的是对象的私有(private)字段 1.私有字段:字段必须初始化(当然即使不是私有字段也要 ...

  3. ARC073E Ball Coloring

    Problem AtCoder Solution 把点映射至二维平面,问题就变成了给定 \(n\) 个点,可以把点对 \(y=x\) 对称,求覆盖所有点的最小矩形面积. 可以先把所有点放到 \(y=x ...

  4. 2018 ICPC 徐州网络赛

    2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution ...

  5. 公司xenserver搭建的使用

    [root@xenserver ~]# ls -l /dev/disk/by-path/total 0lrwxrwxrwx 1 root root  9 Jan 19 16:33 pci-0000:0 ...

  6. centos7 yum搭建lamp环境

    =============================================== 2018/1/14_第1次修改                       ccb_warlock == ...

  7. MongoDB安全:内置角色概览

    官文列举如下(文档不长,过英语四级者可以轻松阅读,就不需要看本文额)(基于MongoDB 3.6的文档,4.0也没有变化): Role-Based Access Control Built-In Ro ...

  8. 查找Python包的依赖包(语句)

    Window 10家庭中文版,Python 3.6.4, 今天看完了urllib3的官文(官方文档),因为没有具体使用过,所以,仍然是一知半解,但是,突然想知道 urllib3以及前面学习过的requ ...

  9. 分享一个自己写的vue多语言插件smart-vue-i18n

    前言 目前有比较成熟的方案(vue-i18n)了解了下,并且实用了一下感觉对于我在使用的项目来说略显臃肿,功能比较多,所以压缩的会比较大,在移动端不太适合所以自己花一天时间撸了一个vue多语言插件,压 ...

  10. 高版本SQL备份在低版本SQL还原问题

    问题描述: 高版本SQL备份在低版本SQL还原问题(出现媒体簇的结构不正确)      分析原因: SQL版本兼容问题,SQL SERVER兼容级别是用作向下兼容用,高版本的SQL备份在低版本中不兼容 ...