首页 > 其他分享 >ABC254F 题解

ABC254F 题解

时间:2023-05-14 10:14:10浏览次数:50  
标签:gcd limits color 题解 int ABC254F Big normalsize

前言

题目传送门!

更好的阅读体验?

这题 trick 就是更相减损术:\(\gcd\{a_1, a_2, a_3, \cdots, a_n\} = \gcd\{a_1, a_2 - a_1, a_3 - a_2, \cdots, a_n - a_{n-1}\}\)。

思路

有了这个 trick 之后这题就好做了。并不需要其他题解一样画表格,化简式子就行,过程并没有难点。

\[\begin{aligned} \text{answer} & = \gcd\limits_{i=x1}^{x2}\Big(\normalsize\gcd\limits_{j=y_1}^{y_2} (a_i + b_j)\Big)\normalsize \\ & = \gcd\limits_{i=x1}^{x2}\Big(\gcd\{ a_i + b_{y_1}, a_i + b_{y_1+1}, a_i + b_{y_1+2}, \cdots, a_i + b_{y_2}\}\Big)\normalsize \\ & = \gcd\limits_{i=x1}^{x2}\Big(\gcd\{ a_i + b_{y_1}, \color{red}b_{y_1+1}-b_{y_1}, b_{y_1+2}-b_{y_1+1}, \cdots, b_{y_2}-b_{y_2-1}\color{black}\}\Big)\normalsize \\ & = \gcd\Big(\normalsize\color{red}b_{y_1+1}-b_{y_1}, b_{y_1+2}-b_{y_1+1}, \cdots, b_{y_2}-b_{y_2-1}\color{black}, \color{blue}\gcd\limits_{i=x_1}^{x_2}(a_i+b_{y_1})\color{black} \Big)\normalsize \\ & = \gcd\Big(\normalsize\color{red}\gcd\limits_{j=y_1+1}^{y_2} (b_j-b_{j-1})\color{black}, \color{blue}\gcd\{a_{x_1}+b_{y_1}, a_{y_1+1}-a_{y_1}, \cdots, a_{y_2}-a_{y_2-1}\} \color{black}\Big)\normalsize \\ & = \gcd\Big(\normalsize\color{red}\gcd\limits_{j=y_1+1}^{y_2} (b_j-b_{j-1})\color{black}, \color{blue}a_{x1}+b_{y1}, \gcd\limits_{i=x1+1}^{x2}(a_i-a_{i-1})\color{black}\Big)\normalsize \\ & = \gcd\Big(\normalsize a_{x1}+b_{y1}, \gcd\limits_{i=x1+1}^{x2}(a_i-a_{i-1}), \gcd\limits_{i=y_1+1}^{y_2} (b_i-b_{i-1})\Big)\normalsize \\ \end{aligned} \]

综上,只需维护两个 DS,分别支持求 \((a_i - a_{i-1})\) 与 \((b_i - b_{i-1})\) 的区间 gcd。掏一手 ST 表拿下。

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#define y1 zltAKIOI
using namespace std;
const int N = 2e5 + 5;
int n, q;
int gcd(int x, int y) {return y == 0 ? x : gcd(y, x % y);}
struct ST {
	int gc[N][20];
	void build(int a[])
	{
		for (int i = 1; i <= n; i++) gc[i][0] = abs(a[i] - a[i - 1]);
		for (int j = 1; j <= 18; j++)
			for (int i = 1; i + (1 << j) - 1 <= n; i++)
				gc[i][j] = gcd(gc[i][j - 1], gc[i + (1 << (j - 1))][j - 1]);
	}
	int query(int l, int r)
	{
		if (l > r) return 0;
		int len = log2(r - l + 1);
		return gcd(gc[l][len], gc[r - (1 << len) + 1][len]);
	}
} A, B;
int a[N], b[N];
int main()
{
	scanf("%d%d", &n, &q);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for (int i = 1; i <= n; i++) scanf("%d", &b[i]);
	A.build(a), B.build(b);
	while (q--)
	{
		int x1, x2, y1, y2;
		scanf("%d%d%d%d", &x1, &x2, &y1, &y2);
		printf("%d\n", gcd(gcd(A.query(x1 + 1, x2), B.query(y1 + 1, y2)), a[x1] + b[y1]));
	}
	return 0;
}

希望能帮助到大家!

标签:gcd,limits,color,题解,int,ABC254F,Big,normalsize
From: https://www.cnblogs.com/liangbowen/p/17398763.html

相关文章

  • UVA12096 题解
    这道题虽然被评黄,但个人感觉不止普及组难度,而且是一道很有价值的题目。题解区里全是\(O(n^2logn)\)的STL大法,我来发一篇\(O(n^2)\)哈希做法。目前0ms喜提最优解。这道题是codeforcesgym的题目,本质上就是模拟栈中集合插入,复制,相加,取交集,取并集的过程。注意,这些集合都是......
  • [AGC001E] BBQ Hard题解
    Problem[AGC001E]BBQHard计算:\[\sum_{i=1}^{n}\sum_{j=i+1}^n\binom{a_i+b_i+a_j+b_j}{a_i+a_j}\]其中\(n\leq2\times10^5\),\(a_i,b_i\leq2000\)Solution以\(a_i\)代\(a_i+b_i\)则等价于求\[\sum_{i=1}^{n}\sum_{j=i+1}^n\binom{a_i+a_j}{b_i+b_j}......
  • 【题解】Luogu[P3750] [六省联考 2017] 分手是祝愿
    Link→小清新dp题,纪念自己的700ac(一个点只有两个状态开和不开,且按两下相当于没按,我们可以从大到小有亮的就按一下,如果我们按到了不需要按的键,就需要再按一下使他变回来。设\(f_i\)表示\(i\)个正确选择变为\(i-1\)个的期望操作次数。则有\(\dfrac{i}{n}\)概率按到......
  • 【题解】Luogu[P4900] 食堂
    一到推柿子题。题意即求\(\sum\limits^{n}_{i=1}\sum\limits^{i}_{j=1}\left\{\frac{i}{j}\bmodP\right\}\)对于\(\frac{i}{j}\bmodP\)我们知道即为\(i\)乘上\(j\)的逆元,即为\(i\cdot\mathrm{inv}(j)\)故:\[\begin{aligned}\sum^{n}_{i=1}\sum^{i}_{j=1}\l......
  • 【题解】Luogu[P6003] USACO20JAN Loan Repayment S
    模拟赛第一题(9pts考虑暴力。枚举\(x\),对于每个\(x\),模拟\(k\)天,判断其是否合法,找出最大的\(x\)。时间复杂度:\(O(n^2)\)36pts考虑优化先前暴力算法。我们不难发现当\(x\)合法时,必然有合法\(x_1\),当且仅当\(x_1<x\)。故\(x\)具有单调性,考虑二分答案。对于\(x......
  • 【题解】Luogu[P8818] CSP-S 2022 策略游戏
    一道简单区间rmq分类讨论题,考场上最后5分钟想出来,没写出来,退役了……给定两个序列\(A_{1},\dots,A_{n}\);\(B_1,\dots,B_n\)规定\(C_{i,j}=A_i\timesB_i\)。题目说小L和小Q必定选择最优策略,而小L先选,小Q后选,小L要使得\(C_{i,j}\)尽可能大,小Q要使得\(C_{i,j}\)......
  • 【题解】Luogu[P1879] [USACO06NOV]Corn Fields G
    Link→状压dp典题,看数据范围就能多半猜到是状压。\(M\)行\(N\)列很不舒服,本篇题解规定为\(N\)行\(M\)列。因为说没有哪两块草地相连,我们不妨一行一行考虑,一行中每格只可能是\(0\)或\(1\),所以一行的总不同状态数是\(2^M\)。我们用二进制表示每一行的状态,对于每一行,暴......
  • 【题解】Luogu[P1967] NOIP2013 提高组 货车运输
    Link→很容易想到一个暴力做法,就是跑一遍Floyd,\(F_{i,j}\)表示\(i\)到\(j\)最大载重量,转移\(F_{i,j}=\max\{F_{i,j},\min\{F_{i,k},F_{k,j}\}\}\)。显然时间复杂度\(O(n^3)\)是过不了的。我们发现,因为是求两点路径中使得最小值最大,实际上有一些较小的路径是不会走......
  • CF1698F题解
    考虑一个函数\(f(a)\),它的返回值是一个二维数组\(b\),接受值是一个数组\(a\)。对于所有\(i=1\ton-1\)的\(i\),把\(b_{a_i}{a_{i+1}}++\),然后返回\(b\)。\(f(a)!=f(b)\)且\(a_1=b_1,a_n=b_n\)是无解的充要条件,因为显然对于数组的每次翻转操作它的\(f\)返回值都不会变。\(f(a)!=f(b......
  • CF1777D Score of a Tree 题解
    题目简述给你一个\(n\)个结点根为\(1\)的树。在\(t=0\)时,每个结点都有一个值,为\(0\)或\(1\)。在每一个\(t>0\)时,每个结点的值都会变成其子结点在\(t-1\)时的值的异或和。定义\(S(t)\)为\(t\)时所有结点值的和。定义\(F(A)\)为树在\(0\let\le10^......