[codechef]SnackDown 2017 Online Elimination Round Prefix XOR
预处理后主席树维护
首先得出最后的答案为 \(\sum_{i=l}^{r}{min(right[i],r)-i+1}\) \(ri[i]\)表示i最远的上升序列(即代码中的f[i])
step1
那么首要问题就是如何求出\(right[i]\)
考虑当i--j-1是上升时使区间i--j是上升的
即sum[i-1]sum[j-1]<=sum[i-1]sum[j]
观察到两边有差异的是sum[j-1]和sum[j] 也就意味着sum[j-1]和sum[j]的不同会对i的取值有限制
假设k为二进制下sum[j-1]与sum[j]最高的不同位
如果sum[j]此位为1对i的限制是sum[i-1]的此位不能为1
**如果sum[j]此位为0对i的限制是sum[i-1]的此位不能为0 **
通过枚举每一位的限制即可得\(ri[i]\)的最大合理值
step2
接下来就是利用主席树维护答案了
\(\sum_{i=l}^{r}{min(right[i],r)-i+1}\)
我们可以对于所有的\(ri[i]\)建设主席树 维护两个值
1.所有\(ri[i]\)在i--j的范围内总和sum
2.所有\(ri[i]\)在i--j的范围内有几个cnt
最后的答案及为l--r内\(ri[i]\)的值在l--r内的sum+l--r内\(ri[i]\)的值大于r的cnt\(\times\)r-l--r所有数字和+(r-l+1)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=10000005;
ll n,t,Q,x,y,l,r,tot,ans;
ll root[maxn],ri[maxn],lf[maxn],cnt[maxn],sum[maxn],a[maxn],f[maxn];
ll p[32][2];
ll read()
{
ll ch=0,x=0;while(ch=getchar(),ch<'0'||ch>'9');
while(x=x*10+ch-48,ch=getchar(),ch>='0'&&ch<='9');
return x;
}
ll build(ll l,ll r)
{
ll rt=++tot;
if(l<r)
{
ll mid=(l+r)>>1;
lf[rt]=build(l,mid);
ri[rt]=build(mid+1,r);
}
return rt;
}
ll updata(ll pre,ll l,ll r,ll t)
{
ll rt=++tot;lf[rt]=lf[pre];ri[rt]=ri[pre];sum[rt]=sum[pre]+t;cnt[rt]=cnt[pre]+1;
if(l<r)
{
ll mid=(l+r)>>1;
if(t<=mid)lf[rt]=updata(lf[pre],l,mid,t);
else ri[rt]=updata(ri[pre],mid+1,r,t);
}
return rt;
}
ll getsum(ll x,ll y,ll l,ll r,ll L,ll R)
{
if(L<=l&&r<=R)return sum[y]-sum[x];
ll mid=(l+r)>>1,Tans=0;
if(L<=mid)Tans+=getsum(lf[x],lf[y],l,mid,L,R);
if(R>mid)Tans+=getsum(ri[x],ri[y],mid+1,r,L,R);
return Tans;
}
ll getcnt(ll x,ll y,ll l,ll r,ll L,ll R)
{
if(L<=l&&r<=R)return cnt[y]-cnt[x];
ll mid=(l+r)>>1,Tans=0;
if(L<=mid)Tans+=getcnt(lf[x],lf[y],l,mid,L,R);
if(R>mid)Tans+=getcnt(ri[x],ri[y],mid+1,r,L,R);
return Tans;
}
ll Sum(ll r,ll l)
{
return r*(r-1)/2-l*(l-1)/2;
}
int main()
{
n=read();t=read();
for(ll i=1;i<=n;i++)a[i]=read(),a[i]^=a[i-1];
memset(p,63,sizeof(p));Q=read();
for(ll i=n;i>=1;i--)
{
f[i]=n;
for(ll j=30;j>=0;j--)f[i]=min(f[i],p[j][(a[i-1]>>j)&1]-1);
for(ll j=30;j>=0;j--)if(((a[i]>>j)&1)^((a[i-1]>>j)&1)){
p[j][(a[i]>>j)&1]=min(p[j][(a[i]>>j)&1],i);break;
}
}
root[0]=build(1,n);
for(ll i=1;i<=n;i++)root[i]=updata(root[i-1],1,n,f[i]);
for(ll i=1;i<=Q;i++)
{
x=read();y=read();
x=(x+ans*t)%n+1;y=(y+ans*t)%n+1;l=min(x,y);r=max(x,y);
//printf("%d %d %d\n",getsum(root[l-1],root[r],1,n,l,r),getcnt(root[l-1],root[r],1,n,r+1,n),Sum(r,l));
ans=getsum(root[l-1],root[r],1,n,l,r)+r*getcnt(root[l-1],root[r],1,n,r+1,n)-Sum(r,l-1);
printf("%lld\n",ans);
}
return 0;
}
[codechef]SnackDown 2017 Online Elimination Round Prefix XOR的更多相关文章
- 【CF1146】Forethought Future Cup - Elimination Round
Forethought Future Cup - Elimination Round 窝也不知道这是个啥比赛QwQ A. Love "A" 给你一个串,你可以删去若干个元素,使得最 ...
- CF1146 Forethought Future Cup Elimination Round Tutorial
CF1146 Forethought Future Cup Elimination Round Tutorial 叮,守夜冠军卡 https://codeforces.com/blog/entry/6 ...
- Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)
Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) #include <bits/stdc++ ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)
A - Forgetting Things 题意:给 \(a,b\) 两个数字的开头数字(1~9),求使得等式 \(a=b-1\) 成立的一组 \(a,b\) ,无解输出-1. 题解:很显然只有 \( ...
- Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) D. Something with XOR Queries
地址:http://codeforces.com/contest/872/problem/D 题目: D. Something with XOR Queries time limit per test ...
- 【CodeChef PREFIXOR】Prefix XOR
https://odzkskevi.qnssl.com/f0fbdb108ec813b1294f8f714805963b?v=1502083692 网上搜到的题解: http://blog.csdn. ...
- Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) C
Description Santa Claus has Robot which lives on the infinite grid and can move along its lines. He ...
- Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) B
Description Santa Claus decided to disassemble his keyboard to clean it. After he returned all the k ...
- Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) A
Description Santa Claus is the first who came to the Christmas Olympiad, and he is going to be the f ...
随机推荐
- Dev_GridView:设置列为Button
1. gridview ——run designer ——columns ——columns Edit选择repositoryItemButtonEdit1列 2. 更改colums ——showBu ...
- oracle 11g R2(静默安装)
参考博客地址:https://blog.csdn.net/jameshadoop/article/details/48223645 https://www.abcdocker.com/abcdocke ...
- 原生js的remove方法代表删除节点
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- HTML、CSS知识点,面试开发都会需要--No.3 盒子模型
No.3 盒子模型 1.盒子模型属性 (1)包含的CSS属性:width.height.padding.border.margin. 1.盒子模型属性 (1)包含的CSS属性: width.heigh ...
- RFID系统 免费开源代码 开发,分享[申明:来源于网络]
RFID系统 免费开源代码 开发,分享[申明:来源于网络] 地址:http://www.codeforge.cn/s/0/RFID%E7%B3%BB%E7%BB%9F
- [daily][fedora][netctl][nmcli] 设置笔记本为台式机网关
TAG:将一个网卡动态增减到网桥里的配置 场景是这样的. 我的笔记本无线网卡用来访问互联网.OS里面有一个birdge用来链接所有的虚拟机帮助虚拟机上网. 现在有了一台台式机.台式机用来做hyperv ...
- Java开发想尝试大数据和数据挖掘,如何规划学习?
大数据火了几年了,但是今年好像进入了全民大数据时代,本着对科学的钻(zhun)研(bei)精(tiao)神(cao),我在17年年初开始自学大数据,后经过系统全面学习,于这个月跳槽到现任公司. 现在已 ...
- Windows10远程桌面Ubuntu16.04
一.Ubuntu16.04端软件安装(管理员权限) 1.安装xrdp sudo apt-get install xrdp 2.安装vnc4server sudo apt-get install vnc ...
- pip升级包错误问题解决
命令框内输入 sudo pip install six --upgrade --ignore-installed six --红色字体表示想要忽略的包名称--
- 格式化输出&初始编码&运算符
一:格式化输出 % %d %s %为占位符 S替换的内容的类型为字符型 d替换的内容为整型 若在格式化输出的时候需要正常用到% 则表示时用两个%%表示 如: name = input( ...