首页 > 其他分享 >[ARC149D] 的题解

[ARC149D] 的题解

时间:2024-05-15 22:52:49浏览次数:20  
标签:ch 数轴 半轴 题解 查集 ARC149D 对称 define

思路很巧妙,首先,很明显,数轴上关于原点对称的一个点对,不论移动了多少次,都任然是对称的。

再看眼数据范围,发现其实点分布的比较紧,考虑直接将所有点看做一个整体(数轴上一个线段),然后依次移动。

关键的是,若这个整体横跨了原点的话,那么在原点的点就有答案了,对于剩下的部分,设在正半轴、负半轴的部分长度为 \(len1,len2\),若 \(len1>len2\),则将负半轴的部分对称到正半轴,他之后的位置相当于对称后的位置的相反数。

反之同理。

而这个不断对称的过程,我们可以用并查集解决,每个节点就表示初始所在的位置。由于要判断相反数,所以用带权并查集即可。

由于有负半轴,所以记得要把数轴上的位置转化到并查集上,细节较多。

#include<bits/stdc++.h>
#define int long long
#define m_p make_pair
#define p_b push_back
#define num first
#define color second
using namespace std;
inline int rd(){
	int x=0,f=1; char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if (ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
	return x*f;
}
const int N=3e5+5,M=1e6;
int a[N],D[N],n,m;
int fa[M*2+5],val[M*2+5];//0:一样,1:变化
int find(int x){
	if(fa[x]==x) return x;
	int dad=fa[x];
	fa[x]=find(fa[x]);
	val[x]^=val[dad];
	return fa[x];
}
int ans[M*2+5];
signed main(){
	n=rd(),m=rd();
	for(int i=1;i<=n;i++) a[i]=rd();
	for(int i=1;i<=m;i++) D[i]=rd();
	int l=a[1],r=a[n];//在数轴上的范围,并查集的范围
	for(int i=0;i<=(M<<1);i++) fa[i]=i;
	int x,fx;
	for(int i=1;i<=m;i++){
		if(l>0) l-=D[i],r-=D[i];
		else l+=D[i],r+=D[i];
		if(l<=0&&0<=r){//横跨了远点
			x=M;fx=find(x);
			ans[fx]=i;
			if(-l<r){//移动往正半轴
				for(int i=1;i<=-l;i++){
					fa[M-i]=M+i;
					val[M-i]^=1;
				}
				l=1;
			}
			else{
				for(int i=1;i<=r;i++){
					fa[M+i]=M-i;
					val[M+i]^=1;
				}
				r=-1;
			}
		}
	}
	int now;
	for(int i=1;i<=n;i++){
		x=find(a[i]+M);
		if(ans[x]) printf("Yes %lld\n",ans[x]);
		else{
			now=x-M;
			if(val[a[i]+M])now*=-1;
			printf("No %lld\n",now);
		}
	}
	return 0;
}

标签:ch,数轴,半轴,题解,查集,ARC149D,对称,define
From: https://www.cnblogs.com/123456xwd/p/18194878

相关文章

  • Codeforces 1004B Sonya and Exhibition 题解
    题目简述让你构造一个长度为$n$的$01$字符串。一个区间的价值为其中$0$的数量乘以$1$的数量,给出$m$个区间,最大化它们的价值之和。题目分析设区间$[l,r]$中$1$有$x$个,$0$有$y$个,当$x$和$y$最接近的时候,$x\timesy$最大,此结论可以用二次函数进行证明。......
  • AT_arc042_c的题解
    (一)非常妙的DP题,可惜被翻译毁了。题意:你有一堆零食,每个零食有两个值\(a_i\)和\(b_i\)。要求选出集合\(S\),使\(\sum_{i\inS}a_i-\min_{i\inS}a_i\lep\),求最大的\(\sum_{i\inS}b_i\)。一眼DP。先将\(a_i\)从小到大排序,每次循环更新\(dp_0\)的值为\(\max......
  • P10447 最短 Hamilton 路径 题解
    P10447最短Hamilton路径题解题目传送门题意:给定一张有向带权图(\(n\le20\))求点\(0\)到点\(n-1\)的最短哈密顿路径。这是一道状压DP模板题。在状态压缩DP中,我们将一个集合压成一个二进制数。设\(f_{u,i}\)为已经走了集合\(u\)中的节点,且现在在点\(i\)的最短......
  • CF1886E 题解
    CF1886E思路观察发现每个项目只与程序员数量和最小值有关,所以每个项目对应能力值连续的程序员最优。项目数\(m\le20\),状压。设\(dp_{i,s}\)为前\(i\)个程序员匹配的项目状态为\(s\)是否可行,无法接受。交换维度,改为\(dp_s\)表示状态\(s\)能与前缀\([1,i]\)匹配的......
  • 旅行 题解
    题目链接。题意简述给定一张有向图,求从点\(A\)走到点\(B\)的一条路径,这条路径满足:经过的边的权值总和是\(P\)的倍数。在满足条件\(1\)的情况下,经过的边的权值总和最小。题目分析本题可以使用分层图最短路来解决。仿照动态规划的思想,定义\(f_{x,y}\)表示从节点......
  • echarts图由于容器隐藏导致图表不显示问题解决办法
    开发过程中常常会遇到echarts图由于容器隐藏导致图表不显示问题,最简单的办法就是给容器元素加上宽度和高度容器加上固定的宽度和高度<divid="res"style="height:450px;width:1200px"></div>然而在实际开发中某些场景下,要求图表宽度100%显示,而计算容器的宽度有时又会十分的麻......
  • CF1965D Missing Subarray Sum题解
    题目链接点击打开链接题目解法感觉一点都不好想\fn因为最后的序列\(a\)是回文的,所以只有以中心点对称的子段和出现次数为奇数,其他都为偶数考虑有没有什么知道所有子段和的做法,可以方便推出缺失一个的答案令\(g_{l,r}\)为\(l\)到\(r\)的子段和知道\(g_{1,n}\)删......
  • P9175 [COCI2022-2023#4] Mreža 题解
    P9175[COCI2022-2023#4]Mreža题解前言我发现,有整体二分与主席树的地方总有莫队(不是那个莫队,是那个莫队)。知识点(树上)倍增,(树上)莫队,树状数组(“树”含量满满),分块。题意分析给定一棵树,每条边有一个权值\(v\),以及可以用一个花费\(c\)将它变成更大的权值\(s\)。再给定一......
  • Little Pony and Lord Tirek 题解
    LittlePonyandLordTirek题解\(\texttt{ProblemLink}\)题目大意给定长度为\(n\)的序列,第\(i\)个数有三个值:\(s_i,m_i,r_i\),每秒对于每个数执行\(s_i\leftarrow\min\{s_i+r_i,m_i\}\)。有\(m\)个查询,每次查询三个值:\(t,l,r\)查询时刻\(t\),\([l,......
  • [H&NCTF] maybe_xor题解
    maybe_xor感觉这道逆向题与其说是考逆向水平,倒不如说是考编写脚本的能力首先题目给了个远程地址,nc连接会回显ELF:接一串base64编码的东东,解码后发现是ELF文件。用IDA打开发现是从数据段读取24个字节到栈上并进行异或,每个字节异或的值都不同,但异或后的结果不会写回栈程序的目......