P8441 旭日东升(二维数点经典套路)

P8441 旭日东升

维护一个不可重集合的序列 \(a\),长度为 \(n\)。支持以下两种操作:

  • l r x 对于每个 \(l\le i\le r\),将 \(x\) 并入 \(a_i\)
  • l r\(S\) 把每个 \(l\le i\le r\)\(a_i\) 并在一起的集合,输出 \(S\) 中所有元素的和。

\(n,m,x\le 10^5,1\le l\le r\le n\)

\(\color{yellow}{\bigstar\texttt{Trick}}\):连续的不可重集合 \(\rightarrow\) 含有每种颜色的地方以不重叠的区间形式存在,考虑用 ODT 维护区间中是否有这个数。如果我们能在每次操作之后,都将 \([1,n]\) 的区间划分不存在连续的 \(0\) 区间的若干段,那么不含有这个数的区间一定是被完全包含在 \(0\) 区间中

为了实现对区间端点的限制,两位神仙为我们指引了方向!!

\(\texttt{p}\color{red}{\texttt{igstd}}\):这个问题可以转化为矩形加、单点求值,之后想方法实现。

\(\texttt{B}\color{red}{\texttt{uttercake}}\):矩形加、单点求值可以将询问和修改离线按照左端点排序,将操作存储在左端点并用树状数组维护,但常数很小。(update:即将矩形差分后离线处理)

于是你就做完了!!!

此题代码
#define Maxn 100005
int n,m;
ll ans[Maxn];
struct BIT
{ll tree[Maxn];inline void add(int x,ll k){ while(x<=n) tree[x]+=k,x+=x&(-x); }inline ll query(int x){ ll ret=0; while(x) ret+=tree[x],x-=x&(-x); return ret; }
}T;
struct ODT
{int l,r,val;ODT(int L=0,int R=0,int Val=0):l(L),r(R),val(Val){}bool friend operator < (ODT x,ODT y) { return x.l<y.l; }
};
set<ODT> s[Maxn];
struct Operation
{int opt,l,r,val,num;Operation(int Opt=0,int L=0,int R=0,int Val=0,int Num=0):opt(Opt),l(L),r(R),val(Val),num(Num){}bool friend operator < (Operation x,Operation y) { return x.l<y.l; }
};
vector<Operation> op;
inline void add(int l,int r,int val)
{op.emplace_back(0,l,l,val,0);op.emplace_back(0,l,r+1,-val,0);op.emplace_back(0,r+1,l,-val,0);op.emplace_back(0,r+1,r+1,val,0);
}
inline auto split(int opt,int x)
{if(!s[opt].size()) s[opt].emplace(1,n+1,0);auto it=s[opt].lower_bound(ODT(x,0,0));if(it!=s[opt].end() && it->l==x) return it;it--;int l=it->l,r=it->r,val=it->val;if(it->val==0) add(l,r,opt),add(l,x-1,-opt),add(x,r,-opt);s[opt].erase(it);s[opt].emplace(l,x-1,val);return s[opt].emplace(x,r,val).fi;
}
inline void assign(int opt,int l,int r)
{if(!s[opt].size()) s[opt].emplace(1,n+1,0);auto itr=split(opt,r+1),itl=split(opt,l);for(auto it=itl;it!=itr;it++)if(it->val==0) add(it->l,it->r,opt);s[opt].erase(itl,itr);s[opt].emplace(l,r,1);
}
void solve(int ql,int qr)
{if(ql==qr) return;int mid=(ql+qr)>>1;solve(ql,mid),solve(mid+1,qr);int nl=ql;for(int nr=mid+1;nr<=qr;nr++) if(op[nr].opt){while(nl<=mid && op[nl].l<=op[nr].l){ if(op[nl].opt==0) T.add(op[nl].r,op[nl].val); nl++; }ans[op[nr].num]+=T.query(op[nr].r);}for(int i=ql;i<nl;i++) if(op[i].opt==0) T.add(op[i].r,-op[i].val);inplace_merge(op.begin()+ql,op.begin()+mid+1,op.begin()+qr+1);
}
int main()
{n=rd(),m=rd();for(int i=1,opt,l,r,x;i<=m;i++){opt=rd(),l=rd(),r=rd();if(opt==1) x=rd(),assign(x,l,r),ans[i]=-1;else op.emplace_back(1,l,r,0,i),ans[i]=0;}solve(0,op.size()-1);for(int i=1;i<=m;i++) if(ans[i]!=-1) printf("%lld\n",ans[i]);return 0;
}

于是,你已经对二维数点的基本原理有了一定的了解,就让我们来看一看下面这个简单的例子,来吧我们刚刚学到的知识运用到时间中吧。

试试看!(bushi

CF848C Goodbye Souvenir

修改一个元素其实就是删除一个元素后增加一个元素,分别考虑他们的贡献是多好:

设当前下标为 \(x\),上一个这种元素为 \(p\),下一个元素为 \(s\),则:

  • 加入一个元素:
    • \(l\in[1,p],r\in[x,s)\) 区间加上 \(x-p\)
    • \(l\in(p,x],r\in[s,n]\) 区间加上 \(s-x\)
  • 删除一个元素:将加法的权值倒过来即可。

我们需要查询的是区间和,即变为了一个矩形加、单点查询问题,离线解决即可。

P4690 [Ynoi2016] 镜中的昆虫

维护一个长为 \(n\) 的序列 \(a_i\),有 \(m\) 次操作。

  • 1 l r x 将区间 \([l,r]\) 的值修改为 \(x\)
  • 2 l r 询问区间 \([l,r]\) 出现了多少种不同的数,也就是说同一个数出现多次只算一个。

\(1\le n,m\le 10^5,1\le a_i\le 10^9\)

和上一题不能说差不多,只能说十分相似(bushi

用一个 ODT 维护全局颜色端,对每个颜色再分别维护颜色端。

用矩形加、单点查的套路做,分治解决即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深搜、广搜、搜索剪枝

搜索与回溯讲解 文章目录深搜方向向量&#xff1a;DFS代码&#xff1a;题目讲解&#xff1a;八皇后问题字符序列自然数的拆分广搜BFS代码&#xff1a;题目讲解&#xff1a;瓷砖关系网络bfs与dfs的用途与区别搜索剪枝可行性剪枝最优性剪枝记忆化搜索搜索顺序剪枝题目&#xff1a…

使用logdashboard查看可视化日志

logdashboard日志面板是我在Github写的一个开源项目&#xff0c;旨在让查看日志变的方便快捷。在线预览现在功能有日志检索、趋势图、异常堆栈快速查看、日志详情等logdashboard支持自定义日志模型可以记录更多自定义的属性。logdashboard支持的日志来源有以下两种&#xff0c;…

数论分块专题复习(余数求和+模积和+Ice Rain+The Fool)

文章目录前提知识复习T1&#xff1a;余数求和titlesolutioncodeT2&#xff1a;Ice RaintitlesolutioncodeT3&#xff1a;The FooltitlesolutioncodeT4&#xff1a;模积和titlesolutioncode前提知识复习 整除分块是用于快速处理形似下列式子的方法&#xff0c;是解决莫比乌斯反…

领域驱动设计,让程序员心中有码(六)

领域驱动设计-聚合&#xff0c;一种极简的思维模式引言作为IT技术产业飞速发展的产物&#xff0c;软件工程学已经成为当今时代非常重要的一个学科。作为一名资深的软件开发从业者&#xff0c;我们需要学习的东西实际上已经远远超出了原本在大学教育阶段所接受的知识深度和广度&…

hdu 5094 Maze

题意&#xff1a; n*m大的迷宫 &#xff0c;有p种钥匙。钥匙最多有10种。 然后一个k&#xff0c;然后k行表示 (x1,y1),(x2,y2)直接有门或者墙。 如果g0 &#xff0c;就是有墙&#xff0c; 如果g>0 表示有门&#xff0c;且门需要第g把钥匙才能开。 然后下来一个s&#xff…

数论分块练习([CF830 C]Bamboo Partition + [hdu 6395]Sequence )

文章目录T1&#xff1a;SequencetitlesolutionT2&#xff1a;Bamboo PartitiontitlesolutioncodeT1&#xff1a;Sequence title 传送 solution 一眼就是很裸的矩阵加速 ⌊pl⌋\lfloor\frac{p}{l}\rfloor⌊lp​⌋分块矩阵加速就可以了 [BA1][DC⌊pl⌋010001]\begin{bmatrix}…

YBTOJ:染颜色(KDtree)

文章目录题目描述数据范围解析代码题目描述 数据范围 n≤105,T≤5n\le10^5,T\le5n≤105,T≤5 解析 关键是对问题的转化 考虑一次修改&#xff0c;一个点需要满足哪些条件才可以满足 1.与x的距离不超过lll 2.在x的子树内 这两个条件可以转化为对深度的限制和对dfs序的限制 这样…

Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群

Kubernetes简介Kubernetes是Google基于Borg开源的容器编排调度引擎&#xff0c;作为CNCF&#xff08;Cloud Native Computing Foundation&#xff09;最重要的组件之一&#xff0c;它的目标不仅仅是一个编排系统&#xff0c;而是提供一个规范&#xff0c;可以让你来描述集群的架…

01分数规划

参考文章 01分数规划 什么是01分数规划&#xff1a; 给定n个a[i]和b[i]&#xff0c;a[i]和b[i]绑定在一起要选同时选&#xff0c;求sum(a[i]) 除以 sum(b[i]) 的最大值&#xff0c;sum为求和函数 对于这种问题我们可以多定义一个数组x[1…n]&#xff0c;x为bool型只取0或者1,…

CF1156D 0-1-Tree(换根DP)

牛犇犇titlesolutioncodetitle 戳一戳 solution 直接设dp[i][k]dp[i][k]dp[i][k]表示以iii为根时&#xff0c;子树内&#xff0c;边权为kkk时的答案 &#xff08;定义写得好复杂&#xff0c;可略过&#xff09; 考虑对于点uuu&#xff0c;vvv是他的一个儿子&#xff0c;两点…

Entity Framework 6.3 和 EF Core 3.0 路线图

尽管脱离了 .NET Core 发布循环&#xff0c;但是 EF Core 正在开发其 3.0 路线图。除此之外&#xff0c;还对原来的 Entity Framework 进行了一些重要的变更。更多服务器端的查询将 LINQ 查询转换为对应的 SQL 查询通常是比较困难的&#xff0c;甚至是不可能的。许多 QRM 只能在…

EFCore+Mysql仓储层建设(分页、多字段排序、部分字段更新)

前沿园子里已有挺多博文介绍了EFCoreMysql/MSSql如何进行使用&#xff0c;但实际开发不会把EF层放在Web层混合起来&#xff0c;需要多个项目配合结构清晰的进行分层工作&#xff0c;本文根据个人实践经验总结将各个项目进行分层&#xff0c;仅供想自己搭建,包含数据仓储以及分页…

[FWT] 时隔一年再回首FWT(快速沃尔什变换),我终于不再是个门外汉

时隔一年再回首FWT&#xff0c;我似乎有了新理解&#xff1f;&#xff1f; 添加了原理的推导&#xff0c;以前就只有模板… 文章目录引入or&#xff08;或&#xff09;卷积原理FWT_or正变换FWT_or逆变换模板and&#xff08;与&#xff09;卷积原理FWT_and正变换FWT_and逆变换模…

Loj #149. 01 分数规划(01分数规划模板题)

链接 题意&#xff1a; 题解&#xff1a; 详细解法看这里 这里说个点&#xff0c;eps一定要开足够小&#xff0c;我一开始开的1e-5&#xff0c;结果就过了90%的数据&#xff0c;开到1e-7就足够了 代码&#xff1a; #include<bits/stdc.h> typedef long long ll; usin…

如何测试 ASP.NET Core Web API

在本文中&#xff0c;我们将研究如何测试你的 ASP .NET Core 2.0 Web API 解决方案。我们将了解使用单元测试进行内部测试&#xff0c;使用全新的 ASP .NET Core 的集成测试框架来进行外部测试。本文要点正确理解并使用单元测试和你的 ASP .NET Core Web API 解决方案一样重要。…

[帝皇杯day 1] [NOIP2018模拟赛]小P的loI(暴力+素筛),【NOIP模拟赛】创世纪(贪心),无聊的数对(线段树)

文章目录T1&#xff1a;小P的loltitlesolutioncodeT2&#xff1a;创世纪titlesolutioncodeT3&#xff1a;无聊的数对titlesolutioncodeT1&#xff1a;小P的lol title solution 此题非常水… 先用素数筛&#xff0c;筛出[1,n][1,n][1,n]中的质数 质数越小&#xff0c;倍数的分…

[2-sat专练]poj 3683,hdu 1814,hdu 1824,hdu 3622,hdu 4115,hdu 4421

文章目录Priest Johns Busiest DaycodePeaceful CommissioncodeLets go homecodeBomb GamecodeEliminate the ConflictcodeBit MagiccodePriest John’s Busiest Day 题目 司仪必须在婚礼开始或结束时出现&#xff0c;考虑把第iii场婚礼拆成两个点 iii&#xff1a;表示司仪在婚…

.NET Core中的一个接口多种实现的依赖注入与动态选择

最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式&#xff0c;为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中&#xff0c;但是在服务调用的时候总是获取到最后注入的那个方法的实现&#xff0c;这时候就在想能不能实现动态的选…

Sightseeing Cows POJ - 3621

题意&#xff1a; L个点&#xff0c;P边的点边带权的有向图&#xff0c;求一个环点权和与边权和比值的最大值。 题解&#xff1a; 01分数规划判负环 详细看这里 还是套用01分数规划模型&#xff0c;点权为value[i],边权为cost[u],一个环为C&#xff0c;问题要求最大化 最…

C# Memory Cache 踩坑记录

背景前些天公司服务器数据库访问量偏高,运维人员收到告警推送,安排我团队小伙伴排查原因.我们发现原来系统定期会跑一个回归测试,该测运行的任务较多,每处理一条任务都会到数据库中取相关数据,高速地回归测试也带来了高频率的数据库读取.解决方案1我们认为每个任务要取的数据大…