因为有撤销操作,所以修改操作可能会只会存在一段时间,因此把时间看作一维,被修改的序列看作一维。

可以把操作都离线下来,对于每个修改操作,就是在二维平面上对一个矩形进行修改,询问操作,就是查询单点权值。

具体实现时,可以对所有询问操作查询的单点建\(K-D\ Tree\),然后在\(K-D\ Tree\)上矩形修改即可。

\(code:\)

#include<bits/stdc++.h>
#define maxn 600010
#define p 998244353
using namespace std;
typedef long long ll;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int n,m,root,tot,type,cnt;
ll ans;
struct node
{
int opt,u,d,pos;
ll v;
}q[maxn];
struct KD_tree
{
int d[2],mi[2],ma[2],ls,rs;
ll val,add,mul;
}t[maxn],dat[maxn];
bool cmp(const KD_tree &a,const KD_tree &b)
{
return a.d[type]<b.d[type];
}
void pushup(int cur)
{
int ls=t[cur].ls,rs=t[cur].rs;
for(int i=0;i<=1;++i)
{
t[cur].ma[i]=t[cur].mi[i]=t[cur].d[i];
if(ls)
{
t[cur].ma[i]=max(t[cur].ma[i],t[ls].ma[i]);
t[cur].mi[i]=min(t[cur].mi[i],t[ls].mi[i]);
}
if(rs)
{
t[cur].ma[i]=max(t[cur].ma[i],t[rs].ma[i]);
t[cur].mi[i]=min(t[cur].mi[i],t[rs].mi[i]);
}
}
}
void pushadd(int cur,ll v)
{
t[cur].val=(t[cur].val+v)%p,t[cur].add=(t[cur].add+v)%p;
}
void pushmul(int cur,ll v)
{
t[cur].val=t[cur].val*v%p,t[cur].add=t[cur].add*v%p,t[cur].mul=t[cur].mul*v%p;
}
void pushdown(int cur)
{
int ls=t[cur].ls,rs=t[cur].rs;
if(t[cur].mul!=1) pushmul(ls,t[cur].mul),pushmul(rs,t[cur].mul),t[cur].mul=1;
if(t[cur].add) pushadd(ls,t[cur].add),pushadd(rs,t[cur].add),t[cur].add=0;
}
void build(int l,int r,int k,int &cur)
{
cur=++tot,type=k;
int mid=(l+r)>>1;
nth_element(dat+l+1,dat+mid+1,dat+r+1,cmp);
t[cur]=dat[mid],t[cur].mul=1;
if(l<mid) build(l,mid-1,k^1,t[cur].ls);
if(r>mid) build(mid+1,r,k^1,t[cur].rs);
pushup(cur);
}
bool out(int cur,int u,int d,int l,int r)
{
return u>t[cur].ma[0]||d<t[cur].mi[0]||l>t[cur].ma[1]||r<t[cur].mi[1];
}
bool in(int cur,int u,int d,int l,int r)
{
return u<=t[cur].mi[0]&&d>=t[cur].ma[0]&&l<=t[cur].mi[1]&&r>=t[cur].ma[1];
}
bool check(int cur,int u,int d,int l,int r)
{
return u<=t[cur].d[0]&&d>=t[cur].d[0]&&l<=t[cur].d[1]&&r>=t[cur].d[1];
}
void modify_add(int cur,int u,int d,int l,int r,ll v)
{
if(out(cur,u,d,l,r)) return;
if(in(cur,u,d,l,r))
{
pushadd(cur,v);
return;
}
if(check(cur,u,d,l,r)) t[cur].val=(t[cur].val+v)%p;
int ls=t[cur].ls,rs=t[cur].rs;
pushdown(cur);
if(ls) modify_add(ls,u,d,l,r,v);
if(rs) modify_add(rs,u,d,l,r,v);
}
void modify_mul(int cur,int u,int d,int l,int r,ll v)
{
if(out(cur,u,d,l,r)) return;
if(in(cur,u,d,l,r))
{
pushmul(cur,v);
return;
}
if(check(cur,u,d,l,r)) t[cur].val=t[cur].val*v%p;
int ls=t[cur].ls,rs=t[cur].rs;
pushdown(cur);
if(ls) modify_mul(ls,u,d,l,r,v);
if(rs) modify_mul(rs,u,d,l,r,v);
}
void query(int cur,int x,int y)
{
if(x>t[cur].ma[0]||x<t[cur].mi[0]||y>t[cur].ma[1]||y<t[cur].mi[1]) return;
if(x==t[cur].d[0]&&y==t[cur].d[1])
{
ans=t[cur].val;
return;
}
int ls=t[cur].ls,rs=t[cur].rs;
pushdown(cur);
if(ls) query(ls,x,y);
if(rs) query(rs,x,y);
}
int main()
{
read(n),read(m);
for(int i=1;i<=m;++i)
{
read(q[i].opt);
if(q[i].opt<=2) read(q[i].u),read(q[i].d),read(q[i].v);
if(q[i].opt==3) read(q[i].pos),dat[++cnt].d[0]=q[i].pos,dat[cnt].d[1]=i;
if(q[i].opt==4) read(q[i].pos),q[q[i].pos].pos=i;
}
for(int i=1;i<=m;++i)
if(q[i].opt<=2&&!q[i].pos)
q[i].pos=m;
build(1,cnt,0,root);
for(int i=1;i<=m;++i)
{
if(q[i].opt==1) modify_add(root,q[i].u,q[i].d,i,q[i].pos,q[i].v);
if(q[i].opt==2) modify_mul(root,q[i].u,q[i].d,i,q[i].pos,q[i].v);
if(q[i].opt==3) query(root,q[i].pos,i),printf("%lld\n",ans);
}
return 0;
}

题解 洛谷 P3710 【方方方的数据结构】的更多相关文章

  1. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  2. 题解 洛谷P1562 【还是N皇后】

    原题:洛谷P1562 这个题的原理和8皇后的原理是一模一样的,就是必须要用n个皇后把每一个行填满,同时满足每一列,每一行,每一条对角线只有一个棋子.但如果按照原来的方法暴打的话只有60分(优化亲测无效 ...

  3. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  4. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  5. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  6. 题解-洛谷P4724 【模板】三维凸包

    洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...

  7. 题解-洛谷P4859 已经没有什么好害怕的了

    洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...

  8. 题解-洛谷P5217 贫穷

    洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...

  9. 题解 洛谷 P2010 【回文日期】

    By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...

随机推荐

  1. SpringBoot 2.0 编程方式配置,不使用默认配置方式

    SpringBoot的一般配置是直接使用application.properties或者application.yml,因为SpringBoot会读取.perperties和yml文件来覆盖默认配置: ...

  2. SSH网上商城四

    第29课:10-SSH网上商城:购物模块的实体的封装 1.现在我们要实现购物车的模块,当用户在点击 加入购物车按钮的时候需要跳转到 上面我们需要对购物车的对象进行封装 上面一个商品就对应一个记录项,购 ...

  3. ThinkPHP5使用PHPExcel实现数据导出功能

    1.将PHPExcel类库文件夹放入extend目录下 2.导出功能实现 public function download(){ if(request()->isPost()){ $val = ...

  4. rodert单排学习redis进阶【白银一】

    redis之白银一 说些题外话,最近帝都疫情又严重,大家都身处时代洪流中,这不是个别人能左右的,希望你能保护好自己,天天开心. 前言 1.Redis 客户端 1.1.Redis Desktop Man ...

  5. 入门大数据---Hbase容灾与备份

    一.前言 本文主要介绍 Hbase 常用的三种简单的容灾备份方案,即CopyTable.Export/Import.Snapshot.分别介绍如下: 二.CopyTable 2.1 简介 CopyTa ...

  6. git和github入门指南(3.3)

    3.4.开源项目的协作方式 开源项目通常是没有写入的权限的,我们需要换一种协作方式参与到这些开源项目中 为了演示方便,我们把git-demo这个项目中nd-00002这个合作者的权限取消 接下来nd- ...

  7. 玩转SpringBoot之捣鼓 Redis

    我们都知道,把首页数据放到Redis里,能够加快首页数据的访问速度.但是我们要如何准确又快速的将 Redis 整合到自己的 SpringBoot2.x 项目中呢?今天阿淼就带大家爬一爬其中的门门道道. ...

  8. 【秒懂Java】【第1章_初识Java】04_学习资料

    为了学到更多的新知识,我们经常会去网上搜索各种学习资料.或者,在学习.工作过程中遇到了解决不了的问题,我们也会去网上搜索答案(比如百度.谷歌一下).这篇文章,主要想跟大家聊聊关于学习资料的选择. 建议 ...

  9. java方法中开启一个线程

    很多业务场景下需要你在一个方法中去开启一个线程,去跑一些处理时间较长的代码,这样调用方就不必经过长时间的等待了.好了 话不多说  先上代码: package test; public class Th ...

  10. 学习前端的时候,突然想起了Sharepoint母版页里的占位符,算知识的融会不?

    今天看到这个段话,我就想起来当时学习Sharepoint的时候,总是搞不明白我们老师讲的那个母版页里的占位符到底是干啥的.现在看到了类似的东西,让我想起来了之前一直搞不懂的东西,很感慨. (完)