专题:数列信息传递问题转化为图论合点问题(ybtoj-数列询问+序列破解)

文章目录

  • 前言:
  • 一、数列询问(取模)
    • 解析
    • 代码
  • 二、序列破解(奇偶性)
    • 解析
    • 代码
  • thanks for reading!

前言:

在一个数列a中,对于一个大区间A和组成它的两个小区间a,b;
可以借其中两个区间的信息推导出第三个区间的信息
不妨称这样的问题叫做数列的信息传递问题
(具体来说就是:给出[l1,r1]的信息与[r1,r2]的信息(这里也可能是[r1+1,r2],只是在连点的细节上略有不同),那么就可以求出[l1,r2]的信息)

看一个例子:

若分别已知区间[1,4][5,7][8,10][11,15]的总和的奇偶性
那么显然可以推出[1,15]的总和的奇偶性

从上面可以看出:这种信息推导具有传递性
那么对于这样的问题,我们可以将其转化为点的合并问题
本文所举的具有这样性质的信息有两个,一个是加和奇偶性,一个是取模
那么我们开始吧:

一、数列询问(取模)

在这里插入图片描述

解析

这道题提供了并查集一种新的用处:
合并过程中的状态转移
从前缀和来看:
每次的询问相当于
(sum[r]-sum[l-1])%p=k
我们把l-1合并到r上
fa[i]表示第i个数的父亲结点
num[i]表示 (sum[ fa[i] ] - sum[i])%p的结果
再加上一些奇奇怪怪的状态转移(读者不妨自己推导一下)与判断就ok了~

代码

#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=1e6+100;
const int M=10;
const int mod=100;
int m,n,t,p;
ll ans;
int a,b,c,d;
int num[N],fa[N];
int find(int x){if(fa[x]==x) return x;int ex=fa[x];fa[x]=find(fa[x]);num[x]=(num[ex]+num[x])%p;return fa[x];
}
void merge(int x,int y,int z){int xx=fa[x],yy=fa[y];fa[xx]=yy;num[xx]=(num[y]-num[x]-z+2*p)%p;return;
}
int main(){scanf("%d%d%d",&n,&m,&p);for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);a--;int aa=find(a),bb=find(b);if(aa==bb){if((num[a]-num[b]+p)%p==c) continue;
//			else if(num[a]==0&&num[b]==c) continue;
//			else if(num[b]==0&&num[a]==c) continue;else{printf("%d",i-1);return 0;}}else{merge(a,b,c);}}printf("%d",m);return 0;
}
/*
10 5 2
1 2 0
3 4 1
5 6 0
1 6 0
7 10 1
*/

二、序列破解(奇偶性)

在这里插入图片描述

解析

要想知道点k的值,我们必须通过一组[l,k-1]与[l,k]的信息求得;
那么是不是意味着每次对于[l,r]的询问就意味着把点l与点r合并呢?
不是的!
经过推导不难发现:
我们已知[l,r1]和[r1+1,r2]的奇偶性时,才能获得[l,r2]的信息;
而按照刚才的做法,显然是错误的!
所以需要一些微妙的调整
我们发现:
若每次对于[l,r]的询问,把点l-1与r合并,就能使这个问题得到很好的解决
(把点l与r+1合并也可以,是一个道理)
那么我们就只需要保证每个点都与前一个点联通即可
那么显然最后所有的点都会联通
问题就转化为了最小生成树问题

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
const int N=4e6+100;
int n,m;
int fa[N];
int find(int x){if(fa[x]==x) return x;return fa[x]=find(fa[x]);
}
struct node{int x,y;ll v;bool operator < (const node y)const{return v<y.v;}
}p[N];
int num;
ll ans;
ll a,b,c;
int main(){scanf("%d",&n);for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=n;i++){for(int j=i;j<=n;j++){scanf("%lld",&a);p[++num]=(node){i-1,j,a};	}}sort(p+1,p+1+num);for(int i=1;i<=num&&m<n;i++){int xx=find(p[i].x),yy=find(p[i].y);if(xx==yy) continue;fa[xx]=yy;m++;ans+=p[i].v;}printf("%lld",ans);return 0;
}

thanks for reading!

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

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

相关文章

CF786C-Till I Collapse【树状数组倍增,优先队列】

正题 题目链接:https://www.luogu.com.cn/problem/CF786C 题目大意 给出一个长度为nnn的序列。 对于每个k∈[1,n]k\in[1,n]k∈[1,n]求将nnn分成最少的段使得每段的长度不同。 1≤ai≤n≤1051\leq a_i\leq n\leq 10^51≤ai​≤n≤105 解题思路 考虑对于一个kkk我们的做法显然…

Docker最全教程——从理论到实战(五)

在笔者参加腾讯容器服务技术交流会时&#xff0c;我们了解到了藏区牧民的目前的生活艰辛状况&#xff0c;因此除了在同事朋友之间推荐其土特产之外&#xff0c;我们也在此进行初步分享&#xff0c;希望略尽绵薄之力&#xff0c;能够帮助到他们&#xff1a;货真价实、确保都是37…

2021牛客暑期多校训练营6 J-Defend Your Country(无向图点双+思维)

无向图联通分量 点u是割点&#xff0c;当且仅当 特判树根&#xff1a;u为树根&#xff0c;且u有多于1棵子树u不为树根&#xff0c;在递归树上u存在子节点v&#xff0c;满足&#xff1a;dfnu≤lowv\text{dfn}_u\leq \text{low}_vdfnu​≤lowv​ 如上图&#xff0c;v想走到u的组…

牛客题霸 [比较版本号] C++题解/答案

牛客题霸 [比较版本号] C题解/答案 题目描述 如果version1 > version2 返回1&#xff0c;如果 version1 < version2 返回-1&#xff0c;不然返回0. 输入的version字符串非空&#xff0c;只包含数字和字符.。.字符不代表通常意义上的小数点&#xff0c;只是用来区分数字…

不止代码:循环比赛(分治)

循环比赛日程表&#xff08;match&#xff09; 【问题描述】 解析 dfs或分治 分治可以不断递归4个小正方形 左上右下为前一半&#xff0c;左下右上后一半 dfs就很无脑了 代码 #include<cstdio> #include<cstring> #include<algorithm> #include<cmath…

P4983-忘情【wqs二分,斜率优化】

正题 题目链接:https://www.luogu.com.cn/problem/P4983 题目大意 给出长度为nnn的序列xxx&#xff0c;记平均数为xˉ\bar{x}xˉ&#xff0c;要求将序列分成mmm段。 每一段[l,r][l,r][l,r]的值为 ((∑ilrxixˉ)xˉ)2xˉ2\frac{((\sum_{il}^rx_i\times \bar x)\bar x)^2}{\bar…

前瞻科技,引领未来!Microsoft Connect(); 2018即将重磅来袭!

怎么用一句话点燃全球的开发者&#xff1f;——Microsoft Connect(); 2018即将重磅来袭&#xff01;每一个观点都能引发科技狂潮&#xff0c;每一项技术都将提速技术进程&#xff0c;由微软举办的 Microsoft Connect(); 2018 即将在太平洋时间12月4日8:30拉开帷幕&#xff01;大…

2021“MINIEYE杯”中国大学生算法设计超级联赛(7)Yiwen with Formula(任意模数FFT)

Yiwen with Formula 溢流眼泪题解 生成函数化成n个多项式乘积&#xff0c;然后分治把他们依次相乘&#xff0c;需要由于指数需要modϕ(998244353)998244353−1\bmod \phi(998244353)998244353-1modϕ(998244353)998244353−1&#xff0c;因此需要任意模数的FFT。。。 常数贼大…

牛客题霸 [ 孩子们的游戏] C++题解/答案

牛客题霸 [ 孩子们的游戏] C题解/答案 题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开…

4.1模拟报告

总结 做的很坎坷。。。 一些细节上的玄学bug &#xff08;上次也一样。。。&#xff09; 还是要加强基础&#xff01;&#xff01;&#xff01; T1 x的实根 不贴了&#xff0c;就是水题。。。 T2 二分查找 就是lowerbound T3逆序对 1.树状数组 2.归并排序 注意&#xff…

P5048-[Ynoi2019 模拟赛]Yuno loves sqrt technology III【分块】

正题 题目链接:https://www.luogu.com.cn/problem/P5048 题目大意 就是这个 【QA】区间众数&#xff0c;但空间很小 长度为nnn的序列&#xff0c;要求支持查找区间众数出现次数。 强制在线 1≤n,m≤51051\leq n,m\leq 5\times 10^51≤n,m≤5105 解题思路 空间小就不能用蒲公…

2021牛客暑期多校训练营7 J-xay loves Floyd(最短路+bitset优化集合交)

J-xay loves Floyd ANJHZ题解 abcdhhhh_题解 如果di,jwi,j\text d_{i,j}\text w_{i,j}di,j​wi,j​,那么按照题意中的算法仍然能得到正确的结果。此时记cani,j1\text{can}_{i,j}1cani,j​1。 如果存在vvv&#xff0c;使得①cani,v1\text{can}_{i,v}1cani,v​1②canv,j1\text{…

通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)

前言读完上篇《通俗易懂&#xff0c;C#如何安全、高效地玩转任何种类的内存之Span(一)》&#xff0c;相信大家对span的本质应该非常清楚了。含着金钥匙出生的它&#xff0c;从小就被寄予厚望要成为.NET下编写高性能应用程序的重要积木&#xff0c;而且很多老前辈为了接纳它&…

4.6模拟 宽度优先搜索

总结 bfs除了代码能力没有任何算法。。。 有些细节是值得注意的 T1 面积(area) bfs被我写成了dfs。。。 &#xff08;不过我觉得这么写挺不戳&#xff09; 核心思路就是用一个flag记录当前跑得这些点有没有效 恶心之处在于本题默认mn10&#xff01;&#xff01;&#xff01;…

牛客题霸 [ 有重复项数字的所有排列] C++题解/答案

牛客题霸 [ 有重复项数字的所有排列] C题解/答案 题目描述 给出一组可能包含重复项的数字&#xff0c;返回该组数字的所有排列。 题解&#xff1a; 很多人应该都是用的递归方式来做&#xff0c;这里介绍一个stl的next_permutation 在头文件里&#xff0c;可以产生全排列 ne…

2021牛客暑期多校训练营7 F-xay loves trees(线段树+滑动窗口)

F-xay loves trees 考虑在树1中满足条件的一些点&#xff0c;首先不难想到一定是一条链&#xff0c;其次如果点uuu被选择那么在树2以uuu为根的子树的点就禁止被选&#xff0c;于是只需区间&#xff0c;然后查询区间最值是否存在>1也就是树2中覆盖次数超过2的节点即可。 首…

微软开发者大会:VS 2019 Preview 发布;Windows UX 主要技术开源

美国当地时间12月4日&#xff0c;微软正式举行 Microsoft Connect(); 2018 开发者大会&#xff0c;本次大会的 slogan 是"Build the apps of tomorrow, today."。在今年的大会上&#xff0c;看得出来微软不是憋了一个 —— 而是憋了一波大招。不妨先看一下这次大会微…

不止代码:迷宫问题(bfs)

题目描述 如下图所示&#xff0c;给出一个N*M的迷宫图和一个入口、一个出口。 编一个程序&#xff0c;打印一条从迷宫入口到出口的路径。这里黑色方块的单元表示走不通&#xff08;用-1表示&#xff09;&#xff0c;白色方块的单元表示可以走&#xff08;用0表示&#xff09;。…

asp.net core sdk runtime 镜像[已更新至2.2.0]

在官方镜像的脚本上&#xff0c;增加了System.Drawing相关的依赖库以北京时间为默认的时间2.2.0Windows SDK地址:官方: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/2.2.100/dotnet-sdk-2.2.100-win-x64.exe自己的加速地址: http://file.niusys.com/dotnet-sdk-2.2.10…

P7726-天体探测仪(Astral Detector)【构造】

正题 题目链接:https://www.luogu.com.cn/problem/P7726 题目大意 一个长度为nnn的排列&#xff0c;给出nnn个可重集SiS_iSi​表示所有长度为iii的区间的最小值构成的集合。 求构造这个排列。 1≤n≤8001\leq n\leq 8001≤n≤800 解题思路 对于一个数字&#xff0c;如果在S…