[CF1004F] Sonya and Bitwise OR
时间:2021-08-26
本文章向大家介绍[CF1004F] Sonya and Bitwise OR,主要包括[CF1004F] Sonya and Bitwise OR使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
\(\text{Problem}:\)Sonya and Bitwise OR
\(\text{Solution}:\)
分析一下 OR 的性质。对于左端点 \(l\) 固定的区间,其前缀至多只会有 \(\lceil \log_{2}V\rceil\) 个不同的取值,且每种取值都是连续的。当右端点固定时也是同理。
那么对于每个区间 \([l,r]\),维护其前缀与后缀每种不同取值的起始位置与长度。合并时只需枚举左儿子和右儿子的不同取值,在 \(O(20^{2})\) 的复杂度内暴力求出答案,而更新其前缀与后缀的信息也非常容易。
总时间复杂度 \(O(n\log n\log^{2} V)\)。
\(\text{Code}:\)
#include <bits/stdc++.h>
#pragma GCC optimize(3)
//#define int long long
#define ri register
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define is insert
#define es erase
#define vi vector<int>
#define vpi vector<pair<int,int>>
using namespace std; const int N=100010;
inline int read()
{
int s=0, w=1; ri char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
return s*w;
}
int n,m,X,a[N];
#define lc (x<<1)
#define rc (x<<1|1)
struct Node { vpi pre,nxt; long long sum; inline Node() { sum=0; } }w[N<<2],zero;
inline Node Merge(Node x,Node y)
{
Node res;
res.sum=x.sum+y.sum;
for(auto i:x.nxt)
{
for(auto j:y.pre)
{
if((i.fi|j.fi)>=X) res.sum+=1ll*i.se*j.se;
}
}
res.pre=x.pre;
for(auto i:y.pre)
{
if((i.fi|res.pre.back().fi)==res.pre.back().fi) res.pre.back().se+=i.se;
else res.pre.eb(mk((res.pre.back().fi|i.fi),i.se));
}
res.nxt=y.nxt;
for(auto i:x.nxt)
{
if((i.fi|res.nxt.back().fi)==res.nxt.back().fi) res.nxt.back().se+=i.se;
else res.nxt.eb(mk((res.nxt.back().fi|i.fi),i.se));
}
return res;
}
void Build(int x,int l,int r)
{
if(l==r)
{
w[x].pre.eb(mk(a[l],1));
w[x].nxt.eb(mk(a[l],1));
w[x].sum=(a[l]>=X);
return;
}
int mid=(l+r)/2;
Build(lc,l,mid);
Build(rc,mid+1,r);
w[x]=Merge(w[lc],w[rc]);
}
void UpDate(int pos,int l,int r,int x,int k)
{
if(l==r)
{
w[x].pre.clear(), w[x].nxt.clear();
w[x].pre.eb(mk(k,1)), w[x].nxt.eb(mk(k,1));
w[x].sum=(k>=X);
return;
}
int mid=(l+r)/2;
if(pos<=mid) UpDate(pos,l,mid,lc,k);
else UpDate(pos,mid+1,r,rc,k);
w[x]=Merge(w[lc],w[rc]);
}
Node Ask(int u,int v,int l,int r,int x)
{
if(l>v||r<u) return zero;
if(l>=u&&r<=v) return w[x];
int mid=(l+r)/2;
if(u>mid) return Ask(u,v,mid+1,r,rc);
if(v<=mid) return Ask(u,v,l,mid,lc);
return Merge(Ask(u,mid,l,mid,lc),Ask(mid+1,v,mid+1,r,rc));
}
#undef lc
#undef rc
signed main()
{
n=read(), m=read(), X=read();
for(ri int i=1;i<=n;i++) a[i]=read();
Build(1,1,n);
for(ri int i=1;i<=m;i++)
{
int opt=read();
if(opt==1)
{
int x,y;
x=read(), y=read();
UpDate(x,1,n,1,y);
}
else
{
int l,r;
l=read(), r=read();
printf("%lld\n",Ask(l,r,1,n,1).sum);
}
}
return 0;
}
夜畔流离回,暗叹永无殿。
独隐万花翠,空寂亦难迁。
千秋孰能为,明灭常久见。
但得心未碎,踏遍九重天。
原文地址:https://www.cnblogs.com/zkdxl/p/15191689.html
- TensorFlow深度学习笔记 文本与序列的深度模型
- 究竟哪里安全?加拿大VS中国治安大数据起底!意料之中还是之外?
- muduo网络库学习之EventLoop(四):EventLoopThread 类、EventLoopThreadPool 类
- 从小程序游戏开放可以看出,微信已经开始转移小程序战场了
- 17年AI在游戏中完胜人类,AlphaGo的下一个目标是什么?DeepMind有一个45年超越人类计划
- PHP常用的正则表达式
- ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?
- 浅析负载均衡的6种算法,Ngnix的5种算法
- 字符串的学习
- 【Scikit-Learn 中文文档】内核岭回归 - 监督学习 - 用户指南 | ApacheCN
- 可视化(番外篇)——在Eclipse RCP中玩转OpenGL
- 养良好C语言编程风格,编优质C语言代码,这才是C语言的开始
- IBM让《星球大战》中的各种黑科技变成现实
- 学习SVM(二) 如何理解支持向量机的最大分类间隔
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 进阶(三):邮件的发送与收取
- MySQL information_schema详解 FILES
- MySQL information_schema详解 GLOBAL_STATUS和SESSION_STATUS
- Python 进阶(四):数据库操作之 MySQL
- Python 进阶(五):数据库操作之 SQLite
- Python 进阶(六): Excel 基本操作
- 基于Rust-vmm实现Kubernetes运行时
- 云开发如何为腾讯游戏年度发布会保驾护航?
- 跨端方案的三大困境
- Python 进阶(七): Word 基本操作
- Python 进阶(八):XML 基本操作
- Python 进阶(九):JSON 基本操作
- Kafka集群监控系统Kafka Eagle部署与体验
- MySQL information_schema详解 GLOBAL_VARIABLES和SESSION_VARIABLES
- 我爬取了知乎上大学相关话题中的热门高赞问答,其中是否有你大学生活的影子呢?