题目描述:

小火车沉迷垃圾手游不能自拔,正在玩碧蓝航线,可惜小火车的舰(lao)队(po)练度太低打不过副本,所以他只好去刷其余的副本来升级。
总共有 n 个副本编号从 1 到 n ,每个副本有个难度值 a_i,小火车每天按照顺序刷连续的一段副本,第 j 天会刷的副本必须落在 l 到 r 之间。但是他是个很懒的人,每天一开始他的懒惰值为 0,当他刷完一个副本以后懒惰值就会异或上 a_i ,小火车希望懒惰值一直保持单调不下降,请问每天他都有多少种刷副本的方法?

题解:

如果我们能够求出每个位置最远可以延伸到哪里,那么这题就简单了。
注意到异或上某个数后异或和会变小,当且仅当这个数最高位的 1 1 1把原来这个位上的 1 1 1给消掉了,所以我们可以对每个位单独考虑,看每个位最近的这个位置是什么,然后取每个位的 min ⁡ \min min。具体可以对每个位二分实现。

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pa pair<int,int>
const int Maxn=100010;
const int inf=1000000000;
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x*f;
}
int n,a[Maxn],fir[Maxn],b[Maxn],d[Maxn][30],sum[2][30][Maxn];
//sum[i][j][k]第j位 前k个1个数奇偶性为i 有多少个最高位为j
int lc[Maxn<<5],rc[Maxn<<5],s1[Maxn<<5],tot=0,root[Maxn];
LL s2[Maxn<<5];
void insert(int &u,int l,int r,int p)
{if(!u)u=++tot;s1[u]++;s2[u]+=(LL)p;if(l==r)return;int mid=l+r>>1;if(p<=mid)insert(lc[u],l,mid,p);else insert(rc[u],mid+1,r,p);
}
void merge(int &u1,int u2)
{if(!u1){u1=u2;return;}if(!u2)return;s1[u1]+=s1[u2],s2[u1]+=s2[u2];merge(lc[u1],lc[u2]),merge(rc[u1],rc[u2]);
}
int ans1;LL ans2;
void query(int r1,int r2,int l,int r,int k)
{if(l==r){ans1+=s1[r1]-s1[r2];ans2+=s2[r1]-s2[r2];return;}int mid=l+r>>1;if(k<=mid)query(lc[r1],lc[r2],l,mid,k);else{ans1+=s1[lc[r1]]-s1[lc[r2]],ans2+=s2[lc[r1]]-s2[lc[r2]];query(rc[r1],rc[r2],mid+1,r,k);}
}
int main()
{n=read();for(int i=1;i<=n;i++){a[i]=read();fir[i]=-1;for(int j=29;j>=0;j--)if((1<<j)&a[i]){fir[i]=j;break;}}for(int i=29;i>=0;i--){int now=0;for(int j=1;j<=n;j++){if((1<<i)&a[j])now^=1;d[j][i]=now;for(int k=0;k<30;k++)sum[0][i][j]=sum[0][i][j-1],sum[1][i][j]=sum[1][i][j-1];if(fir[j]==i)sum[now][i][j]++;}}for(int i=1;i<=n;i++){b[i]=n;for(int j=29;j>=0;j--){if(!((1<<j)&a[i])){int t=d[i][j];int l=i+1,r=n;while(l<=r){int mid=l+r>>1;if(sum[t][j][mid]>sum[t][j][i])r=mid-1;else l=mid+1;}b[i]=min(b[i],r);}else{int t=(d[i][j]^1);int l=i+1,r=n;while(l<=r){int mid=l+r>>1;if(sum[t][j][mid]>sum[t][j][i])r=mid-1;else l=mid+1;}b[i]=min(b[i],r);}}}root[0]=0;for(int i=1;i<=n;i++)insert(root[i],1,n,b[i]),merge(root[i],root[i-1]);LL ans=0;int q=read();while(q--){LL l=read(),r=read();l=(l+ans)%n+1,r=(r+ans)%n+1;if(l>r)swap(l,r);ans1=ans2=0;query(root[r],root[l-1],1,n,r);ans=ans2+(LL)r*(r-l+1-ans1)-(LL)(l-1+r-1)*(r-l+1)/2LL;printf("%lld\n",ans);}
}

loj#6100. 「2017 山东二轮集训 Day1」第一题 主席树+二分相关推荐

  1. LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告

    LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告 前置知识:闭区间上的连续函数的零点存在性定理: 我们定义这样的函数: 定义域为 [ l , r ] ∩ Z [l,r]\cap ...

  2. Loj #6077. 「2017 山东一轮集训 Day7」逆序对

    Loj #6077. 「2017 山东一轮集训 Day7」逆序对 Solution 令fi,jf_{i,j}fi,j​表示前iii个数产生jjj个逆序对的方案数,每次考虑把i+1i+1i+1加入,有i ...

  3. LOJ#6072. 「2017 山东一轮集训 Day5」苹果树 解题报告

    LOJ#6072. 「2017 山东一轮集训 Day5」苹果树 解题报告 好苹果会组成连通块,整棵树的权值为 ∑ i = 1 n c i [ c i ≥ 0 ] [ s i z n u m ( c i ...

  4. LOJ#6074. 「2017 山东一轮集训 Day6」子序列

    LOJ#6074. 「2017 山东一轮集训 Day6」子序列 先考虑全局询问怎么做,设 f ( i , c ) f(i,c) f(i,c) 表示在 S 1 ⋯ i S_{1\cdots i} S1⋯ ...

  5. [LOJ#6068]. 「2017 山东一轮集训 Day4」棋盘[费用流]

    题意 题目链接 分析 考虑每个棋子对对应的横向纵向的极大区间的影响:记之前这个区间中的点数为 \(x\) ,那么此次多配对的数量即 \(x\) . 考虑费用流,\(S\rightarrow 横向区间 ...

  6. Loj #6060. 「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set

    原题是CF上的某题,但是还要输出方案....好鬼畜啊WWW 发现答案肯定是优先 xorsum^x1 + x1 最大,然后再优先x1最小(也就是 xorsum^x1 最大). 我们把xorsum二进制分 ...

  7. loj #6070. 「2017 山东一轮集训 Day4」基因

    回文自动机好题啊! 解法一 每$\sqrt n \(分一块 每块建回文自动机到字符串末尾. 顺便开三个\)\sqrt n * n\(的数组记下预处理答案,回文自动机头指针,和每个节点第一次出现的右端点 ...

  8. #6073. 「2017 山东一轮集训 Day5」距离(树链剖分 + 永久标记主席树)

    #6073. 「2017 山东一轮集训 Day5」距离 给定一颗有nnn个节点带边权的树,以及一个排列ppp,path(u,v)path(u, v)path(u,v)为u,vu, vu,v路径上的点集 ...

  9. 容斥问卷调查反馈——Co-prime,Character Encoding,Tree and Constraints,「2017 山东一轮集训 Day7」逆序对

    文章目录 Co-prime source solution code Character Encoding source solution code Tree and Constraints sour ...

最新文章

  1. 【通俗理解线性代数】 -- 理解行列式
  2. 动态卷积超进化!通道融合替换注意力,减少75%参数量且性能显著提升 ICLR 2021...
  3. Android--一个好玩的应用程序/开机自启动
  4. 别看不起分区表:我要为你点个赞
  5. (转)java DecimalFormat用法
  6. 网络流之 最短增广路算法模板(SAP)
  7. Java学习二:Javac Java的学习(原创)
  8. 计算机基础三级,三级数据库计算机基础知识
  9. 用c语言实现键盘画图,用C实现键盘画图.doc
  10. 数组中相同元素 java_如何在一维数组中查找某重复元素,并输出其位置?用java实现...
  11. SQL Server更改字段名
  12. idea 离线安装sonarlint 插件
  13. Rplidar A1/A2使用及Hector_SLAM建图
  14. 电磁场理论笔记03:自由空间中微分形式电磁场定律和边界条件
  15. 银行业务总揽之-银行对公业务
  16. 又让马儿跑又不让吃草,微服务化如何完成低成本改造?
  17. 关于WPC无线充QI认证的发展
  18. 测试排期估时多长合理?
  19. Ubuntu16.04 使用apt-get安装软件时无法自动安装所需要的依赖
  20. php swoole 视频直播_swoole如何实现直播

热门文章

  1. 设计一个用户注册页面,对用户输入的内容进行有效性验证,如用户名和密码不能为空,两次输入的密码必须相同,邮箱地址必须包含“@”符号等。
  2. Linux配置Samba实现局域网共享文件夹
  3. Neo4j CQL - DELETE删除
  4. 合成孔径雷达影像变化检测研究进展
  5. python 创建netcdf_如何用python netCDF4创建netCDF文件?
  6. 服装行业ERP选型咨询提纲
  7. Problem D. Euler Function HDU - 6322(欧拉数,找规律)
  8. Python绘制地理图--Cartopy基础
  9. SMTP错误码/具体原因
  10. 神助攻or猪队友:靠AI“僚机”脱单到底有多难?