预处理后主席树维护

首先得出最后的答案为 \(\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的更多相关文章

  1. 【CF1146】Forethought Future Cup - Elimination Round

    Forethought Future Cup - Elimination Round 窝也不知道这是个啥比赛QwQ A. Love "A" 给你一个串,你可以删去若干个元素,使得最 ...

  2. CF1146 Forethought Future Cup Elimination Round Tutorial

    CF1146 Forethought Future Cup Elimination Round Tutorial 叮,守夜冠军卡 https://codeforces.com/blog/entry/6 ...

  3. 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++ ...

  4. 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. 题解:很显然只有 \( ...

  5. 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 ...

  6. 【CodeChef PREFIXOR】Prefix XOR

    https://odzkskevi.qnssl.com/f0fbdb108ec813b1294f8f714805963b?v=1502083692 网上搜到的题解: http://blog.csdn. ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. VAE (variational autoencoder)

    https://www.zhihu.com/question/41490383/answer/103006793 自编码是一种表示学习的技术,是deep learning的核心问题 让输入等于输出,取 ...

  2. mysql插入数据会变中文

    db.url=jdbc:mysql://192.168.0.149:3306/pack_platform_dev?useUnicode=true&characterEncoding=utf-8 ...

  3. Python加密保护解决方案

    防止代码反编译,高强度加密保护exe或pyc文件 产品简介 Python语言写的程序无需编译成二进制文件代码,可以直接从源代码运行程序.在计算机内部,Python解释器把源代码转换成字节码的中间形式, ...

  4. java之xml解析-dom4j

    解析方式 XML 解析方式有很多种,但是常用的有两种,如下: DOM Document Object Model:把整个 XML 读到内存中,形成树状结构.整个文档为 Document 对象,属性为 ...

  5. (玩起来)DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比

    盆友们,边看文章边玩,请耐心等待PowerBI load出来~~~~ (7.8秒钟) DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比 难度: ★☆☆☆☆ ...

  6. 【Assembly】-NO.88.Assembly.2.滴水逆向.1.002-【位运算及基础指令】-

    1.0.0 Summary Tittle:[Assembly]-NO.88.Assembly.2.滴水逆向.1.002-[]- Style:Java Series:Log4j Since:2018-0 ...

  7. MATLAB变量

    序言 在Matlab中,变量名由A~Z.a~z.数字和下划线组成,且变量的第一个字符必须是字母. 尽管变量名可以是任意长度, 但是Matlab只识别名称的前N=namelengthmax个字符, 这里 ...

  8. Vue:Promise概要

    1.Promise中then是异步的 2.Promise 的then里面两个回调,默认第一个resolve,第二个reject:不会进入catch:如果只有一个回调则进入catch var p1=ne ...

  9. Python之__slots__ &运算符重载反向运算

    1.运算符重载之反向运算 class A: def __init__(self,x): self.x = x def __add__(self, other): try: x = other.x re ...

  10. 0001-20180421-自动化第一章-python基础学习笔记

    ======================学习python==================介绍: python种类: cpython(*),jpython,ironpython,rubypyth ...