! BJOI2018二进制
时间:2020-03-26
本文章向大家介绍! BJOI2018二进制,主要包括! BJOI2018二进制使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
\(n,m,1e5\)
二进制没有位除3的余数是以12121212……循环的
我们用总数减去不合法情况:
- 只有1个1,0的个数>=2(保证不重复)
- 奇数个1,0的个数<2
考虑用线段树解决
每一点存
\(dl[0/1][0/1]\),左端点起,0的个数,1的个数的偶奇的方案数,\(dr\)同理
\(fl[0/1/2]\),左端点起,一个1,0/1/>=2个0的方案数,\(fr\)同理
在记录0/1的个数,左起/右起0的个数,答案
讨论更新即可
时间复杂度\(O(nlog_n)\)
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f==1?x:-x;
}
const int N=1e5+4;
struct node{
int dl[2][2],dr[2][2],fl[3],fr[3],s0,s1,l0,r0,s;
//左端点起 0出现次数0/1 1的奇偶1/0 左端点起1的个数1个0的个数0/1/>=2
inline void init(){
memset(dl,0,sizeof(dl));
memset(dr,0,sizeof(dr));
memset(fl,0,sizeof(fl));
memset(fr,0,sizeof(fr));
s0=s1=l0=r0=s=0;
}
node(){init();}
inline void pre(int x){
init();
if(x)dl[0][1]=dr[0][1]=fl[0]=fr[0]=s1=s=1;
else dl[1][0]=dr[1][0]=s0=l0=r0=1;
}
inline node operator +(const node &a)const{
static node ret;
memcpy(ret.dl,dl,sizeof(dl));
memcpy(ret.fl,fl,sizeof(fl));
memcpy(ret.dr,a.dr,sizeof(a.dr));
memcpy(ret.fr,a.fr,sizeof(a.fr));
for(int i=0;i+s0<2;i++)
for(int v=0;v^2;v++)
ret.dl[s0+i][v^(s1&1)]+=a.dl[i][v];
for(int i=0;i+a.s0<2;i++)
for(int v=0;v^2;v++)
ret.dr[a.s0+i][v^(a.s1&1)]+=dr[i][v];
for(int i=0;i<3;i++){
if(!s1)ret.fl[min(2ll,i+s0)]+=a.fl[i];
if(!a.s1)ret.fr[min(2ll,i+a.s0)]+=fr[i];
}
if(s1==1&&a.l0){
ret.fl[min(2ll,s0+a.l0)]+=1;
ret.fl[2]+=a.l0-1;
}
if(a.s1==1&&r0){
ret.fr[min(2ll,a.s0+r0)]+=1;
ret.fr[2]+=r0-1;
}
ret.l0=l0+(!s1?a.l0:0);//括号括起来
ret.r0=a.r0+(!a.s1?r0:0);
ret.s0=s0+a.s0;
ret.s1=s1+a.s1;
ret.s=s+a.s;
ret.s+=dr[0][0]*(a.dl[0][1]+a.dl[1][1])+dr[0][1]*(a.dl[0][0]+a.dl[1][0])+dr[1][0]*a.dl[0][1]+dr[1][1]*a.dl[0][0];
if(r0)ret.s+=r0*(a.fl[0]+a.fl[1]+a.fl[2])-a.fl[0];
if(a.l0)ret.s+=a.l0*(fr[0]+fr[1]+fr[2])-fr[0];
return ret;
}
}t[N<<2];
#define lc (p<<1)
#define rc (p<<1|1)
int n,m,a[N<<2];
void build(int p,int l,int r){
if(l==r){
t[p].pre(a[l]);
return;
}
int mid=l+r>>1;
build(lc,l,mid);
build(rc,mid+1,r);
t[p]=t[lc]+t[rc];
}
void modify(int p,int l,int r,int x){
if(l==r){
t[p].pre(a[l]);
return;
}
int mid=l+r>>1;
if(x<=mid)modify(lc,l,mid,x);
else modify(rc,mid+1,r,x);
t[p]=t[lc]+t[rc];
}
node query(int p,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return t[p];
int mid=l+r>>1;
if(qr<=mid)return query(lc,l,mid,ql,qr);
if(mid<ql)return query(rc,mid+1,r,ql,qr);
return query(lc,l,mid,ql,qr)+query(rc,mid+1,r,ql,qr);
}
signed main(){
n=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
m=read();
while(m--){
static int op,x,y;
op=read();x=read();
if(op==1){
a[x]^=1;
modify(1,1,n,x);
}
else{
y=read();
cout<<(y-x+1)*(y-x+2)/2-query(1,1,n,x,y).s<<"\n";
}
}
return (0-0);
}
原文地址:https://www.cnblogs.com/aurora2004/p/12575317.html
- 100行代码,搞定http监控框架
- 【腾讯反病毒实验室】深度剖析APT28最新作品
- [译]clearfix改良及overflow:hidden详解
- 深入解析CSS样式层叠权重值
- [译]CSS边框实现“无图化”设计
- 自适应的多列图文混排改进
- [译]Laravel 5.0 之运行环境及环境变量
- 90行代码,搞定日志监控框架
- Laravel Migrate 中的 Fresh 和 Refresh 命令
- 框架组件,究竟要不要自研?
- Nginx泛解析到子目录,自动判断有无public目录
- 撩妹必备,3行代码伪造出一个“好莱坞黑客”屏幕
- [译]Laravel 5.0 之事件调度程序 (定时任务)
- Laravel 5.5 在浏览器中渲染 Mailable 类型
- 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 技术篇-调用浏览器访问指定网页,一行代码实现。非Selenium。
- 数据库热备份神器 - XtraBackup
- Python 技术篇-读取文件,将内容保存dict字典中。去掉字符串中的指定字符方法。dict字典的遍历。
- PyQt5 技术篇-plainTextEdit控件获得文本内容方法、设置文本内容方法。
- PyQt5 技术篇-鼠标移动控件显示提示,Qt Designer控件提示设置方法。
- PyQt5 技术篇-窗口名、窗口图标的设置方法。
- 101个shell脚本
- PyQt5 图片兼容性问题:"libpng warning: bKGD: invalid.",原因及解决办法。
- 编程语言经典小例题—Python版【持续更新】
- Python+selenium 自动化-切换窗口页签、切换iframe框架。确定页面是否包含iframe方法。
- JavaScript 技术篇-js获取iframe内的元素方法。
- QQ二维码登录API源码
- JavaScript 技术篇-js获取document的几种方式,js获取dom元素的常用方法。
- 不好意思,我膨胀了!shader 入门精要!Cocos Creator 3D Shader !
- JavaScript 技术篇-js获取dom节点、html标签自定义属性的值。