预处理后主席树维护

首先得出最后的答案为 \(\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. vue中嵌套页面 iframe 标签

    vue中嵌套iframe,将要嵌套的文件放在static下面: <iframe src="../../../static/bear.html" width="300 ...

  2. js中级小知识

    1.作用域链 作用域:浏览器给js的一个生存环境(栈内存). 作用域链:js中的关键字var和function都可以提前声明和定义,提前声明和定义的放在我们的内存地址(堆内存)中.然后js从上到下逐行 ...

  3. 可持久化Trie

    ---恢复内容开始--- HAOI 2019 DAY1 T1 我爆零了. 爆零的感觉很难受 原因竟然是我从没犯过的错误 审题不清.情绪低迷. 也许 也许 也许就是想让我知道我有多菜吧. 求前k大的区间 ...

  4. Unable to convert MySQL date/time value to System.DateTime问题解决方案

    原因:可能是该字段(date/datetime)的值默认缺省值为:0000-00-00/0000-00-00 00:00:00,这样的数据读出来转换成System.DateTime时就会有问题: 解决 ...

  5. TZOJ:3660: 家庭关系

    描述 给定若干家庭成员之间的关系,判断2个人是否属于同一家庭,即2个人之间均可以通过这些关系直接或者间接联系. 输入 输入数据有多组,每组数据的第一行为一个正整数n(1<=n<=100), ...

  6. 消息服务jms

    jms是java消息服务的规范,也即接口,activemq是实现.队列模型和发布订阅模型很像,区别就是队列,多个消费者消费不同的消息(这些消费者整体消费完生产者生产的队列的消息),发布订阅模型是多个消 ...

  7. JavaScript事件起泡与捕获

    // 向 <div> 元素添加事件句柄 document.getElementById("myDIV").addEventListener("mousemov ...

  8. 深入理解Java虚拟机5-chap7-斗者2星

    一.类加载机制 1.类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Class文件加载到内存,这就是类加载机制. 2.类型 ...

  9. 深入理解Java虚拟机4-chap6-斗者1星

    一.JVM语言无关性 1.以字节码为基础(Class文件为一组以8位字节为基础单位的二进制流),JVM与Class文件关联,而非与Java语言关联 2.代码编译从本地码(Native Code)转为字 ...

  10. [ Python ] KMP Algorithms

    def pmt(s): """ :param s: the string to get its partial match table :return: partial ...