预处理后主席树维护

首先得出最后的答案为 \(\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. 五子棋棋盘布局 table和ul哪个好

    想要在页面布局以上棋盘,可以用ul li 布局,但却有明显的缺点: 1.两行两列:ul li 下面如果再放li 会出错,只能是放其他的,比如div. 或者放li *行*列: 但是这样有两个明显缺陷: ...

  2. phpspider php爬虫框架

    其实我自身的不是经常写正则,而且不规则的html去写正则本身就是件很麻烦的事情,如果页面有些微变动和更新就得再次去维护正则表达式,其实是非常蛋疼的 我第一感觉就是去找一下爬虫的库,但是发现现在php爬 ...

  3. Vijos 1360 - 八数码问题 - [A*]

    题目链接:https://vijos.org/p/1360 优先队列BFS: 这个八数码问题本身其实是之前人工智能实验课的作业…… 首先,如果不带估价函数,直接用优先队列BFS,肯定也是能得到正确结果 ...

  4. node_modules文件过长无法删除问题记录

    执行指令 rimraf node_modules

  5. RabbitMQ的消息确认机制

    一:确认种类 RabbitMQ的消息确认有两种. 一种是消息发送确认.这种是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是 ...

  6. usb_camera

  7. Jenkins+Jmeter持续集成笔记(一:环境准备)

    整体思路: 通过Jmeter图形界面编写api测试脚本 ant 批量执行Jmeter脚本文件 将其集成到jenkins,设置执行频率与发送测试报告 运行环境 系统 配置 IP Centos7.1 1核 ...

  8. java框架之SpringBoot(2)-配置

    规范 SpringBoot 使用一个全局的配置文件,配置文件名固定为 application.properties 或 application.yml .比如我们要配置程序启动使用的端口号,如下: s ...

  9. ORA-00444: background process DBRM failed while starting

    SQL> startup 报错:ORA-00444: background process DBRM failed while startingORA-00020:maximum number ...

  10. 分布式异步任务Celery

    -A代表APP celery -A tasks worker --loglevel=info -n nodemaster -------------- celery@nodemaster v4.1.0 ...