维护一个二维零一矩阵(n,m<=1000),支持四种操作(不超过10^5次):

  • 将(i,j)置一
  • 将(i,j)置零
  • 将第i行零一反转yu
  • 回到第K次操作前的状态
  • 每次操作后输出全局一共有多少个一

你发现如果每一次操作都复制一整行的话是可以用 $bitset$ 优化的,自带/32

所以,我们对于每一个时刻维护一个线段树,其中 $i$ 节点表示第 $i$ 行对应的 $bitset$ 编号.

对于前 $3$ 个操作,每一次操作时都暴力新建一个 bitset,然后每次在可持久化线段树上最多更新一个单点.

顺便在线段树的节点上再维护一个 $1$ 的数量即可.

#include <bits/stdc++.h>
#define M 1004
#define N 100005
#define setIO(s) freopen(s".in","r",stdin) , freopen(s".out","w",stdout)
using namespace std;
bitset<M>v[N],uni,oo;
int rt[N];
namespace seg
{
#define lson t[x].ls
#define rson t[x].rs
int tot;
int newnode() { return ++ tot; }
struct Node
{
int ls,rs,id,sum;
}t[N*40];
int update(int x,int l,int r,int p,int v)
{
int now=newnode();
t[now]=t[x];
if(l==r)
{
t[now].id=v;
return now;
}
int mid=(l+r)>>1;
if(p<=mid)
{
t[now].ls=update(lson,l,mid,p,v);
}
else
{
t[now].rs=update(rson,mid+1,r,p,v);
}
t[now].sum=t[t[now].ls].sum+t[t[now].rs].sum;
return now;
}
int modify(int x,int l,int r,int p,int v)
{
int now=newnode();
t[now]=t[x];
if(l==r)
{
t[now].sum=v;
return now;
}
int mid=(l+r)>>1;
if(p<=mid) t[now].ls=modify(lson,l,mid,p,v);
else t[now].rs=modify(rson,mid+1,r,p,v);
t[now].sum=t[t[now].ls].sum+t[t[now].rs].sum;
return now;
}
int query(int x,int l,int r,int p)
{
if(!x) return 0;
if(l==r) return t[x].id;
int mid=(l+r)>>1;
if(p<=mid) return query(lson,l,mid,p);
else return query(rson,mid+1,r,p);
}
void dfs(int x,int l,int r)
{
if(!x) return;
if(l==r) printf("%d %d\n",l,t[x].sum);
int mid=(l+r)>>1;
dfs(lson,l,mid), dfs(rson,mid+1,r);
}
#undef lson
#undef rson
};
int main()
{
// setIO("now");
int n,m,q,i,j;
scanf("%d%d%d",&n,&m,&q);
for(i=1;i<=m;++i) uni[i]=1;
for(i=1;i<=q;++i)
{
int op,a,b,c;
scanf("%d",&op);
rt[i]=rt[i-1];
if(op==1)
{
scanf("%d%d",&a,&b);
int pre=seg::query(rt[i-1],1,n,a);
v[i]=v[pre];
v[i][b]=1;
rt[i]=seg::update(rt[i-1],1,n,a,i);
oo=v[i]&uni;
rt[i]=seg::modify(rt[i],1,n,a,oo.count());
}
if(op==2)
{
scanf("%d%d",&a,&b);
int pre=seg::query(rt[i-1],1,n,a);
v[i]=v[pre];
v[i][b]=0;
rt[i]=seg::update(rt[i-1],1,n,a,i);
oo=v[i]&uni;
rt[i]=seg::modify(rt[i],1,n,a,oo.count());
}
if(op==3)
{
int x;
scanf("%d",&x);
int pre=seg::query(rt[i-1],1,n,x);
v[i]=v[pre]^uni;
rt[i]=seg::update(rt[i-1],1,n,x,i);
oo=v[i]&uni;
rt[i]=seg::modify(rt[i],1,n,x,oo.count());
}
if(op==4)
{
int x;
scanf("%d",&x);
rt[i]=rt[x];
}
printf("%d\n",seg::t[rt[i]].sum);
}
return 0;
}

  

CF707D Persistent Bookcase 可持久化线段树的更多相关文章

  1. CF707D Persistent Bookcase

    CF707D Persistent Bookcase 洛谷评测传送门 题目描述 Recently in school Alina has learned what are the persistent ...

  2. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  3. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  4. 【BZOJ-2653】middle 可持久化线段树 + 二分

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1298  Solved: 734[Submit][Status][Discu ...

  5. HDU 4866 Shooting(持久化线段树)

    view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...

  6. 【BZOJ-3653】谈笑风生 DFS序 + 可持久化线段树

    3653: 谈笑风生 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 628  Solved: 245[Submit][Status][Discuss] ...

  7. 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树

    没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...

  8. 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队

    看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...

  9. 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之

    最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破 ...

随机推荐

  1. xorm表结构操作实例

    获取数据库信息 package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "git ...

  2. idea的项目结构

    idea项目结构: 一般是创建一个empty project,然后再创建一个个的Module.

  3. Istio技术与实践6:Istio如何为服务提供安全防护能力

    凡是产生连接关系,就必定带来安全问题,人类社会如此,服务网格世界,亦是如此. 今天,我们就来谈谈Istio第二主打功能---保护服务. 那么,便引出3个问题: l  Istio凭什么保护服务? l  ...

  4. snort_inline

    snort_inline Link   http://snort-inline.sourceforge.net/oldhome.html What is snort_inline? snort_inl ...

  5. [NOIP11.1模拟赛]补番报告

    Preface 昨天开始补某科学的超电磁炮S 感觉今天就好了点,炮姐赛高 T1 一开始一直想欧拉定理&ex欧拉定理,结果估计70分,数组开小了GG,看了正解发现是我学傻了 T2 一看就是数据结 ...

  6. robot framework 接口测试 http协议post请求json格式

    robot framework 接口测试 http协议post请求json格式 讲解一个基础版本.注意区分url地址和uri地址. rf和jmeter在添加服务器地址也就是ip地址的时候,只能url地 ...

  7. js实现图片的Blob base64 ArrayBuffer 的各种转换

    一.相关基础知识 构造函数 FileReader() 返回一个新构造的FileReader 事件处理 FileReader.onabort  处理abort事件.该事件在读取操作被中断时触发. Fil ...

  8. 6.JUC之ReentrantReadWriteLock

    一.概述: Java纪年1.5年,ReentrantReadWriteLock诞生于JUC,此后,国人一般称它为读写锁.人如其名,他就是一个可重入锁,同时他还是一个读写锁 a)跟ReentrantLo ...

  9. echart——关系图graph详解

    VueEchart组件见上一篇 <template> <VueEcharts :options="options" auto-resize /> </ ...

  10. 修改mysql/MariaDB数据库的端口号+远程

    1.修改端口 2.远程+开放端口 (1)设置远程账号:xxx和密码yyyyyyygrant all privileges on *.* to 'xxx'@'%' identified by 'yyyy ...