互达的集合(线段树)

problem

给定数组 l,rl,rl,r。求有多少个非空集合 SSS,满足 ∀i,j∈Sli≤j≤ri\forall_{i,j\in S}\ l_i\le j\le r_ii,jS lijri

集合内对于任意一个点而言,其余点均能被自己的范围覆盖到。

n≤2e5n\le 2e5n2e5

solution

分享一下考场心路历程:考试是分了五个部分分的。

第一个部分分直接 2n2^n2n 暴枚,很快拿下。

第二个部分分 n≤2000n\le 2000n2000,一看就是 n2n^2n2 算法,我就想到了固定集合选取点的最左最右点,然后看有多少个点满足 li≤L∧R≤ri∧L≤i≤Rl_i\le L\wedge R\le r_i\wedge L\le i\le RliLRriLiR,天哪太多的偏序关系了,我直接抡 KD-tree\text{KD-tree}KD-tree,好家伙大样例虽然对了却要跑 6s6s6s,试问谁遭得住?

第三个部分分 ri−li≤10r_i-l_i\le 10rili10。我就只枚举最左点,然后暴搜/Hash\text{Hash}Hash 集合个数,不超过 2102^{10}210,算出来大约 2e82e82e8 但肯定跑不满。一看样例全过。(测评最后结果 wa\text{wa}wa 了,但这不重要了)

第四个部分分,5e45e45e4 可能是分块吧。对我没有太多帮助。

第五个部分分,就是最大的范围了。

由第二个部分的枚举 l,rl,rl,r 我突然想到了前不久狂做 LCT\text{LCT}LCT 的一类连通性题。全都是枚举了右端点然后用线段树上的节点做左端点,并用线段树维护答案个数。

这里我想类比做法:蒋所有 [li,ri][l_i,r_i][li,ri] 全挂到 rir_iri 点下。

枚举 iii 做右端点,然后线段树上的节点做左端点。

新右端点会对 [li,i][l_i,i][li,i] 都提供 111 的个数(答案是 2cnt2^\text{cnt}2cnt,每个数选或不选)

iii 右移一位的时候,就要去掉所有 rj=ir_j=irj=ijjj 曾经的贡献。

然后,然后,我发现强制左右端点后虽然不会算重,但是应该算的是 2cnt−22^{cnt-2}2cnt2(去掉左右端点选和不选的考虑)

结果这样又会影响我线段树的标记下放,那我的线段树不是废了?!!

最后不管是在线段树上维护个数还是直接维护贡献都无法正确避免 −2-22 带来的影响,在主函数内我也无法去掉。我就直接开始摆烂了。。。

结果下午过来,给小同志讲了一遍后没讲懂,被她质疑的我就仔细想了一下,突然想到了貌似大概也许可以这么来,重构一遍直接过!心中草泥马奔腾。。。

从左到右枚举集合的右端点 rrr(最大的点)。

然后线段树上的节点 lll 强制是集合的左端点,且维护的信息是 l,rl,rl,r 做左右端点时的答案。

考虑统计右端点为 iii 的答案。

首先要激活线段树上的 iii 节点,初始化为 111,代表 [i,i][i,i][i,i] 集合。

然后统计线段树上 [li,i][l_i,i][li,i] 区间的答案。

接下来 iii 要右移 +1+1+1,我们需要重新修改维护线段树上的信息。

  • 对区间 [li,i−1][l_i,i-1][li,i1] 进行区间 ×2\times 2×2

    表示当这些区间中的节点为集合左端点时,iii 是合法互达备选点,存在选和不选的方案考虑。

    但不能对 iii 也进行 ×2\times 2×2,理由在心路历程后面提到,它是被强制了的。

  • 对所有 rj=ir_j=irj=ijjj,从 i+1i+1i+1 开始当右端点后,jjj 就不可能再到达集合的右端点了,再也不能成为合法互达备选点,所以要把 jjj 之前提供的贡献全都去掉。

    要进行 [lj,j−1][l_j,j-1][lj,j1] 区间 /2/2/2,以及节点 jjj 的直接赋 000。(这样 jjj 就在也不可能成为集合左端点被纳入贡献了)

时间复杂度 O(nlog⁡n)O(n\log n)O(nlogn)

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
#define int long long
#define mod 998244353namespace SGT {struct node { int cnt, tag; }t[maxn << 2];#define lson now << 1#define rson now << 1 | 1#define mid  (l + r >> 1)void build( int now, int l, int r ) {t[now].tag = 1;if( l == r ) return;build( lson, l, mid );build( rson, mid + 1, r );}void pushdown( int now ) {if( t[now].tag == 1 ) return;( t[lson].tag *= t[now].tag ) %= mod;( t[rson].tag *= t[now].tag ) %= mod;( t[lson].cnt *= t[now].tag ) %= mod;( t[rson].cnt *= t[now].tag ) %= mod;t[now].tag = 1;}void modify( int now, int l, int r, int p, int x ) {if( l == r ) { t[now].cnt = x ? 1 : 0; return; }pushdown( now );if( p <= mid ) modify( lson, l, mid, p, x );else modify( rson, mid + 1, r, p, x );t[now].cnt = ( t[lson].cnt + t[rson].cnt ) % mod;}void modify( int now, int l, int r, int L, int R, int x ) {if( R < l or r < L ) return;if( L <= l and r <= R ) { ( t[now].cnt *= x ) %= mod;( t[now].tag *= x ) %= mod;return;}pushdown( now );modify( lson, l, mid, L, R, x );modify( rson, mid + 1, r, L, R, x );t[now].cnt = ( t[lson].cnt + t[rson].cnt ) % mod;}int query( int now, int l, int r, int L, int R ) {if( R < l or r < L ) return 0;if( L <= l and r <= R ) return t[now].cnt;pushdown( now );return query( lson, l, mid, L, R ) + query( rson, mid + 1, r, L, R );}
}int n;
int l[maxn], r[maxn];
vector < int > G[maxn];
signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &l[i] );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &r[i] );for( int i = 1;i <= n;i ++ ) G[r[i]].push_back( i );SGT :: build( 1, 1, n ); //线段树上强制节点为选取集合最小值int ans = 0;int inv = mod + 1 >> 1;for( int i = 1;i <= n;i ++ ) { //强制选取的集合最大值SGT :: modify( 1, 1, n, i, 1 ); //把i激活 初始化1( ans += SGT :: query( 1, 1, n, l[i], i ) ) %= mod;SGT :: modify( 1, 1, n, l[i], i - 1, 2 ); //对于最小值属于[l[i],i-1]的点 会有一个新的i可以互达for( int j : G[i] ) {SGT :: modify( 1, 1, n, l[j], j - 1, inv );SGT :: modify( 1, 1, n, j, 0 );}}printf( "%lld\n", ans );return 0;
}

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

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

相关文章

【学习笔记】线性规划与对偶问题和LP对偶费用流([ZJOI2013]防守战线题解)

线性规划与对偶问题 原问题&#xff1a; min⁡{7x1x25x3}s.t.{x1−x23x3≥105x12x2−x3≥6xi≥0\min\{7x_1x_25x_3\} \\ s.t.\begin{cases} x_1-x_23x_3\ge 10\\ 5x_12x_2-x_3\ge 6\\ x_i\ge 0\end{cases} min{7x1​x2​5x3​}s.t.⎩⎪⎨⎪⎧​x1​−x2​3x3​≥105x1​2x2​−…

【学习笔记】DAG / 一般有向图的支配树 / 灭绝树

定义与声明 一个有向图 GGG。给定一个起点 sss&#xff0c;假设 sss 能到达所有点。 若去掉某个点 iii 后&#xff0c;sss 无法到达 jjj&#xff0c;则称 iii 为 jjj 的支配点。 显然支配点存在传递关系。 以 sss 为根&#xff0c;使得对于任意节点 iii&#xff0c;其树上祖…

[ZJOI2014] 星系调查(树上差分 + 数学推式子)

problem luogu-P3340 题面写得那么长&#xff0c;其实说白了就是求一条直线&#xff0c;使得若干个点到这条直线的距离平方的和最小&#xff0c;求这个最小值。 solution 我超爱数学&#xff0c;数学就是我的命&#xff0c;我一天不学数学我就难受&#xff01; 假设拟合出…

[ZJOI2014] 璀璨光华(bfs建图 + dfs搜索)

problem luogu-P3342 solution 你感觉这道题没考什么&#xff0c;又感觉考了什么 通过样例以及题面&#xff0c;我们并未获取到『立方体每个小方块的编号是按一定规则命名』的信息。 也就是说&#xff0c;我们需要通过输入的每个小方块相邻的编号的信息来建出这个立方体的…

cf1523A. Game of Life

cf1523A. Game of Life 题意&#xff1a; 包含n个元素的数组&#xff0c;数值为1或0&#xff0c;如果一个元素为0&#xff0c;并且其周围正好只有一个为1的元素&#xff0c;那么下一刻本元素也会变成1. 给你一个数值&#xff0c;问你m次时刻后数组的状态 题解&#xff1a; …

SignalR 中丰富多彩的消息推送方式

在上一篇 SignalR 文章中&#xff0c;演示了如何通过 SignalR 实现了简单的聊天室功能&#xff1b;本着简洁就是美的原则&#xff0c;这一篇我们也来聊聊在 SignalR 中的用户和组的概念&#xff0c;理解这些基础知识有助于更好的开发基于 SignalR 的应用&#xff0c;通过对用户…

Visual Studio 2019 使用 Live Share

一.前言Visual Studio 2019 在今天发布&#xff08;北京时间&#xff09;了&#xff0c;这次带来了一个比较有趣的 Live Share 功能&#xff0c;使用它可以进行更好的协作开发。主要功能&#xff1a;更多资料可看官方介绍&#xff1a;Visual Studio 实时共享什么是Visual Studi…

cf1523B. Lord of the Values

cf1523B. Lord of the Values 题意&#xff1a; 给你一个数组&#xff0c;有n个数&#xff0c;n为偶数&#xff0c;a1&#xff0c;a2…an 现在有两个操作&#xff1a; 对于i<j 操作1&#xff1a;aiaiaj 操作2&#xff1a;ajaj-ai 把原数组转换为-a1,-a2,-a3… 题解&#…

Asp.Net Core WebAPI使用Swagger时API隐藏与分组

1、前言为什么我们要隐藏部分接口&#xff1f;因为我们在用swagger代替接口的时候&#xff0c;难免有些接口会直观的暴露出来&#xff0c;比如我们结合Consul一起使用的时候&#xff0c;会将健康检查接口以及报警通知接口暴露出来&#xff0c;这些接口有时候会出于方便考虑&…

cf1526E. Oolimry and Suffix Array(未解决)

E. Oolimry and Suffix Array 题意&#xff1a; 给定n&#xff0c;k和长度为n的后缀数组si(0<si<n-1),求长度为n的由k种字母构成的字符串种&#xff0c;后缀数组为si的有多少种 题解&#xff1a; 题解看懂了一半。。。等会了再更新 代码&#xff1a;

P2572 [SCOI2010]序列操作

P2572 [SCOI2010]序列操作 题意&#xff1a; 一个长度为n的01序列&#xff0c;下标从0开始&#xff0c;现在有五种变换操作和询问操作&#xff1a; 0 l r 把[l,r]区间内的所有数全变成01 l r 把[l,r]区间内的所有数全变成12 l r把[l,]区间内所有数全部取反3 l r询问[l,r]区间…

为您的机器配置开发环境

软件准备在本期视频中&#xff0c;我们将安装所序言的软件&#xff0c;并为我们的电脑配置.NET Core开发环境。我们需要安装如下2个软件&#xff1a;一个编辑器.NET Core SDK&#xff08;Software Development Kit&#xff09;下载并安装.NET Core 开发编辑器我的是Windows操作…

[CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)

problem luogu-P3160 solution 这么小的数据范围&#xff0c;非暴力不状压。暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了。 我们不妨从小到大填数字&#xff0c;这样如果局部极小值点还没有填的话&#xff0c;周围的九宫格就一定不能被填。 设 dp(s,i):dp(s,i):dp(s,i): 局…

基于Kubernetes 构建.NET Core 的技术体系

很多公司技术支持岗位的工作&#xff0c;如配置域名&#xff0c;部署环境&#xff0c;修改复位配置&#xff0c;服务重启&#xff0c;扩容缩容&#xff0c;梳理和完善监控&#xff0c;根据开发的需要查找日志等工作&#xff0c;需要和开发进行大量的沟通&#xff0c;如什么是外…

P4062 [Code+#1]Yazid 的新生舞会(分治做法)

P4062 [Code#1]Yazid 的新生舞会 题意&#xff1a; 给出一个序列&#xff0c;求有多少个子区间满足众数的出现次数大于区间长度的一半。 出现次数大于区间长度的一般我们称之为绝对众数 题解&#xff1a; 分治做法 对于一个区间[l,r]&#xff0c;设mid⌊lr2⌋\lfloor \frac…

[CQOI2014] 危桥(网络流)

problem luogu-P3163 solution 这是一道网络流好题&#xff0c;看的着摸不着吃不着。 初读完题&#xff0c;就知道这是一道“脱光了”的最大流。 建图基础版本&#xff1a; 建立额外源汇点。 无向边相同于两条有向边&#xff0c;直接建不影响&#xff0c;危桥流量设成 22…

那些优秀的开发者----汪宇杰:从重视细节,到成就技术专家

汪宇杰&#xff08;Edi Wang&#xff09;&#xff0c;.NET及Windows开发者&#xff0c;2018-2019年度微软最有价值专家&#xff08;Windows Development方向&#xff09;。现担任某金融科技企业的网站开发工程师。他对微软技术有鉴定的信念和不灭的热情&#xff0c;曾在Windows…

P4062 [Code+#1]Yazid 的新生舞会(线段树做法)

P4062 [Code#1]Yazid 的新生舞会&#xff08;线段树做法&#xff09; 题意&#xff1a; 给你一个序列a[1…n]​&#xff0c;求存在绝对众数的子区间个数。 绝对众数指&#xff1a;区间中出现次数最多的那个数&#xff0c;出现次数严格大于区间长度的一半。 题解&#xff1a…

《从零开始学ASP.NET CORE MVC》课程介绍

大家好&#xff0c;欢迎来到52ABP学院&#xff0c;收看我们的 《从零开始学ASP.NET CORE MVC》。ASP.NET Core 简介从2015年开始随时互联网成长&#xff0c;云计算和AI、大数据的爆发&#xff0c;大家从谈论项目信息化到数字化的转型&#xff0c;从ToC产业到ToB产业的转型&…

[ZJOI2015] 地震后的幻想乡(状压dp + 期望)

problem luogu-P3343 solution dp(i):dp(i):dp(i): 当恰好加入第 iii 小边时候&#xff0c;所有点联通的方案数。 则 ans∑idpi(mi)im1ans\sum_i \frac{dp_i}{\binom mi}\frac{i}{m1}ans∑i​(im​)dpi​​m1i​ 。 重点是如何计算出 dp(i)dp(i)dp(i)。 这个恰好的限制不好…