[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 ...
随机推荐
- C/C++预处理器
关于预处理器 首先时预处理器的条件指令 什么是预处理指令? 预处理指令是以#号开头的代码行.#号必须是该行除了任何空白字符外的第一个字符.#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符 ...
- react引入方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 洛谷P3384 【模板】树链剖分
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
- Spring的bean管理(注解方式)
注解:代码中的特殊标记,注解可以使用在类.方法.属性上面,使用注解可实现一些基本的功能.注解的写法是@注解名称(属性=属性值). 使用注解创建对象 第一步,创建Web项目,引入Spring的开发包 第 ...
- 20190404 Informatic 学习一
ETL 1. Informatic 下载 下载地址:https://edelivery.oracle.com/osdc/faces/Home.jspx,没有账号可以自己注册一个Oracle账号. 不得 ...
- java之xml解析-dom4j
解析方式 XML 解析方式有很多种,但是常用的有两种,如下: DOM Document Object Model:把整个 XML 读到内存中,形成树状结构.整个文档为 Document 对象,属性为 ...
- aop execution 表达式解析
execution(* com.sample.service.impl..*.*(..)) 解释如下: 符号 含义execution()表达式的主体:第一个”*“符号表示返回值的类型任意:com.sa ...
- [js]js代码执行顺序/全局&私有变量/作用域链/闭包
js代码执行顺序/全局&私有变量/作用域链 <script> /* 浏览器提供全局作用域(js执行环境)(栈内存) --> 1,预解释(仅带var的可以): 声明+定义 1. ...
- 理解Deadlock
问:为啥以下代码会产生死锁 public class Deadlock { static class Friend { private final String name; public Friend ...
- form提交xml文件
--为何ajax提交不了xml?--原因:Request.Form["Data"]这种获取参数方式,原本就不是mvc路由参数获取方式,这是Asp.net中webfrom页面获取参数 ...