#KD-Tree#洛谷 3710 方方方的数据结构
题目
区间加,区间乘,单点查询,撤销修改
分析
由于可以离线,不妨把下标看成第一维,时间看成第二维,那么修改操作相当于在一个矩形上加或者乘,
不妨把查询的节点看作是二维平面上的点,这样实际上就可以用 KD-Tree 来实现
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int N=150011,mod=998244353;
int ran,n,m,Q,root,ans[N];
struct rec{
int p[2];
bool operator <(const rec &t)const{
return p[ran]<t.p[ran];
}
};
struct Rec{int l,r,z,opt,ed;}q[N];
int mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
void Min(int &x,int y){x=x<y?x:y;}
void Max(int &x,int y){x=x>y?x:y;}
struct KD_Tree{
int mn[N][2],mx[N][2],son[N][2],lazy[N],w[N],tag[N]; rec p[N];
void pup(int now){
mn[now][0]=mx[now][0]=p[now].p[0];
mn[now][1]=mx[now][1]=p[now].p[1];
if (son[now][0]){
Min(mn[now][0],mn[son[now][0]][0]);
Min(mn[now][1],mn[son[now][0]][1]);
Max(mx[now][0],mx[son[now][0]][0]);
Max(mx[now][1],mx[son[now][0]][1]);
}
if (son[now][1]){
Min(mn[now][0],mn[son[now][1]][0]);
Min(mn[now][1],mn[son[now][1]][1]);
Max(mx[now][0],mx[son[now][1]][0]);
Max(mx[now][1],mx[son[now][1]][1]);
}
}
int build(int l,int r,int Ran){
if (l>r) return 0;
int mid=(l+r)>>1;
ran=Ran,nth_element(p+l,p+mid,p+1+r);
son[mid][0]=build(l,mid-1,Ran^1);
son[mid][1]=build(mid+1,r,Ran^1);
tag[mid]=1,pup(mid);
return mid;
}
void ptag(int now,int Tag,int Lazy){
w[now]=mo(1ll*w[now]*Tag%mod,Lazy);
tag[now]=1ll*tag[now]*Tag%mod;
lazy[now]=mo(1ll*lazy[now]*Tag%mod,Lazy);
}
void pdown(int now){
if (son[now][0]) ptag(son[now][0],tag[now],lazy[now]);
if (son[now][1]) ptag(son[now][1],tag[now],lazy[now]);
tag[now]=1,lazy[now]=0;
}
void update(int now,int lx,int rx,int ly,int ry,int opt,int z){
if (mx[now][0]<lx||rx<mn[now][0]||mx[now][1]<ly||ry<mn[now][1]) return;
if (lx<=mn[now][0]&&mx[now][0]<=rx&&ly<=mn[now][1]&&mx[now][1]<=ry){
if (opt==1) ptag(now,1,z);
else ptag(now,z,0);
return;
}
if (lx<=p[now].p[0]&&p[now].p[0]<=rx&&ly<=p[now].p[1]&&p[now].p[1]<=ry){
if (opt==1) w[now]=mo(w[now],z);
else w[now]=1ll*w[now]*z%mod;
}
if (tag[now]!=1||lazy[now]) pdown(now);
if (son[now][0]) update(son[now][0],lx,rx,ly,ry,opt,z);
if (son[now][1]) update(son[now][1],lx,rx,ly,ry,opt,z);
}
void query(int now){
ans[p[now].p[1]]=w[now];
if (tag[now]!=1||lazy[now]) pdown(now);
if (son[now][0]) query(son[now][0]);
if (son[now][1]) query(son[now][1]);
}
}Tre;
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
int main(){
n=iut(),Q=iut();
for (int i=1;i<=Q;++i){
int opt=iut();
if (opt<3){
int l=iut(),r=iut(),z=iut();
if (z>=mod) z-=mod;
q[i]=(Rec){l,r,z,opt,Q};
}else{
int x=iut();
if (opt==3) Tre.p[++m].p[0]=x,Tre.p[m].p[1]=i;
else q[x].ed=i-1,q[i].opt=-1;
}
}
root=Tre.build(1,m,0);
for (int i=1;i<=Q;++i) if (q[i].opt>0)
Tre.update(root,q[i].l,q[i].r,i,q[i].ed,q[i].opt,q[i].z);
Tre.query(root);
for (int i=1;i<=Q;++i) if (!q[i].opt)
print(ans[i]),putchar(10);
return 0;
}
#KD-Tree#洛谷 3710 方方方的数据结构的更多相关文章
- 题解 洛谷 P3710 【方方方的数据结构】
因为有撤销操作,所以修改操作可能会只会存在一段时间,因此把时间看作一维,被修改的序列看作一维. 可以把操作都离线下来,对于每个修改操作,就是在二维平面上对一个矩形进行修改,询问操作,就是查询单点权值. ...
- AC日记——【模板】Link Cut Tree 洛谷 P3690
[模板]Link Cut Tree 思路: LCT模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 30 ...
- POJ1471 Tree/洛谷P4178 Tree
Tree P4178 Tree 点分治板子. 点分治就是直接找树的重心进行暴力计算,每次树的深度不会超过子树深度的\(\frac{1}{2}\),计算完就消除影响,找下一个重心. 所以伪代码: voi ...
- 洛谷试炼场 提高模板-nlogn数据结构
树状数组-区间求和 P3374 [模板]树状数组 1 /*by SilverN*/ #include<algorithm> #include<iostream> #includ ...
- 洛谷4月月赛R2
洛谷4月月赛R2 打酱油... A.koishi的数学题 线性筛约数和就可以\(O(N)\)了... #include <iostream> #include <cstdio> ...
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 洛谷SP16580 QTREE7 - Query on a tree VII(LCT,multiset)
洛谷题目传送门 思路分析 维护子树最值还是第一次写QwQ 因为子树的最值会变化,所以不能简单地把最值记下来,还要维护一个平衡树,把每个子树的最大值扔进去,来资磁插入.删除和查询最值. 然后我就懒得手写 ...
- 洛谷P2633 Count on a tree(主席树上树)
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...
随机推荐
- 小红书 x Hugging Face 邀请你一起晒「创意新春照」
不藏了,近期全网爆火的AI 写真项目 InstantID,正是来自小红书社区技术创作发布团队. 为了迎接龙年春节的到来,我们的InstantID全新推出「Spring Festival」新春风格!并与 ...
- [BUUCTF][WEB][ACTF2020 新生赛]Upload 1
打开靶机url,右键查看网页源代码 其中有一段代码 <div class="light"><span class="glow"> < ...
- C语言初学习——易错点合集(长篇)
转义字符 例题一 int main() { char s[] = "012xy\08s34f4w2"; int i, n = 0; for (i = 0; s[i] != 0; i ...
- 二: sql模式(sql_mode)
# sql_mode 1 介绍 sql_mode 会影响 MySQL支持的SQL语法以及它执行的数据验证检查.通过设置sql_mode,可以完成不同严格程度 的数据校验,有效地保障数据准确性. MyS ...
- Redis哨兵模式搭建
一:哨兵主要作用 监控:监控redis主库及从库运行状态: 通知:如果redis发生故障转移,可以通过邮件通知管理员: 自动故障转移:一旦发现主库宕机,则在从库中通过选举新的master进行故障转移. ...
- 冲击900亿美元估值!邀约路演、秘密交表的Shein上市有望
双十一的狂欢刚刚结束,Shein即将赴美上市的消息又在电商圈里投下一枚重磅炸弹. 继被媒体曝光其寻求900亿美金估值后,最新的消息称其已邀请投资人参与路演,且已秘密完成交表.这个神秘的中国独角兽,离敲 ...
- iOS使用Unity容器动态加载3D模型
项目背景 我们的APP是一个数字藏品平台,里面的很多藏品需要展示3D模型,3D模型里面可能会包含场景,动画,交互.而对应3D场景来说,考虑到要同时支持iOS端,安卓端,Unity是个天然的优秀方案. ...
- Codeforces Round 345 (Div. 1)A. Watchmen(容斥原理)
A. Watchmen 当欧几里得距离和曼哈顿距离相等时,\(x1==x2||y1==y2\) 这两个条件满足其一.这和容斥原理一样,至少选择一个的条件. 我们可以计算xi,以及小于i之前的这些,这样 ...
- WPF --- 重写圆角DataGrid样式
引言 因要符合UI设计, 需要一个圆角的 DataGrid 样式,其需要一个,所以需要重写DataGrid的样式, 代码 具体样式代码如下: <ResourceDictionary xmlns= ...
- 使用 Docker 部署 MrDoc 在线文档管理系统
1)MrDoc 介绍 MrDoc 简介 MrDoc 觅思文档:https://mrdoc.pro/ MrDoc 使用手册:https://doc.mrdoc.pro/p/user-guide/ MrD ...