首页 > 其他分享 >P10217 [省选联考 2024] 季风题解

P10217 [省选联考 2024] 季风题解

时间:2024-03-09 12:35:00浏览次数:32  
标签:P10217 ans1 ll ans times 题解 c2 c1 联考

考场上没写出来,火大,实际上这题放校内%你赛我肯定写的出来,可惜这是省选。

实际上这题不难,主要是观察性质,接着拆柿子,然后就是有点难写,要写得好看有点考验代码构建能力和数学能力。

我们考虑原题的每对 \((x,y)\) 都要满足 \(|x|+|y|\le k\) 而我们可以知道后面应该填的 \((x,y)\) 如果超过了限制,那么可以将前面的 \((x,y)\) 变大来满足后面的需求,实际上就是因为考场上没有充分利用这个性质才没拆出来柿子。

那么我们现在开始推柿子。

\(|x^{'}_i|+|y^{'}_i|\le k\rightarrow \sum^{m-1}_{i=0}|x^{'}_{i}|+\sum^{m-1}_{i=0}|y^{'}_{i}|\le m\times k\)

\(\sum^{m-1}_{i=0}x^{'}_{i}=x-\sum^{m-1}_{i=0}x_{i}\)

\(y\) 同理。

那么可以推出:

\(|x-\sum^{m-1}_{i=0}x_{i \mod n} |+|y-\sum^{m-1}_{i=0}y_{i\mod n}|\le m\times k\)

绝对值里面的表示 \(x\) 或 \(y\) 的需求量,所以可以直接与 \(m\times k\) 比较。

看到 \(\mod n\) 就知道可以把这个拆开。

令 \(Sx_i,Sy_i\) 分别表示 \(x_i,y_i\) 的前 \(i\) 项和,\(m=t\times n +p\)。

\(|x-Sx_n\times t-Sx_p|+|y-Sy_n\times t-Sy_p|\le (t\times n +p)\times k\)

因为 \(p\in[0,n-1]\),所以可以直接枚举,那么就转化成了一个关于 \(t\) 的绝对值不等式,暴力拆成 \(4\) 种,再联立每种的条件不等式组成不等式组再找满足条件的最小值就可以开写了。

我们接着考虑优化代码结构。

上式可以统一形式为:

\(|c_1-k_1\times t|+|c_2-k_2\times t|\le k_3\times t+c_3\)

我们取直接去绝对值号产生的不等式为标准不等式。

\(c\le k\times t\)

其中 \(c=c_1+c_2-c_3,k=k_1+k_2+k_3\)。

而我们的条件不等式同样可以化为上面的形式,所以我们只要写一种解不等式方法再控制正负号就可以简化代码。

#include <bits/stdc++.h>
#include <bits/extc++.h>
#define ll long long
#define ull unsigned long long
#define m_p make_pair
#define m_t make_tuple
#define inf (0x7f7f7f7f7f7f7f7f)
#define N 100010
using namespace std;
using namespace __gnu_pbds;
ll val1[N], val2[N], sumx[N], sumy[N], n, k, X, Y, T;
pair<bool, ll> calc(ll c, ll k) // true is upper,false is lower
{
	if (!k)
		return m_p(1, inf * (c <= 0 ? 1 : -1));
	if (k < 0)
	{
		if (c > 0)
			return m_p(1, -inf);
		return m_p(1, c / k);
	}
	ll t = ceil(c * 1.0 / k * 1.0);
	return m_p(0, max(t, 0ll));
}
ll solveine(ll c1, ll c2, ll c3, ll k1, ll k2, ll k3)
{
	ll c = c1 + c2 - c3, k = k1 + k2 + k3, minx = inf, maxx = 0;
	pair<bool, ll> t[5];
	t[1] = calc(c, k);
	t[2] = calc(-c1, -k1);
	t[3] = calc(-c2, -k2);
	for (int i = 1; i <= 3; i++)
		if (t[i].first)
			minx = min(minx, t[i].second);
		else
			maxx = max(maxx, t[i].second);
	if (minx >= maxx)
		return maxx;
	else
		return -1;
}
ll solve(ll k1, ll k2, ll k3)
{
	ll c1, c2, c3, ans = -1, ans1;
	for (ll i = 0; i < n; i++)
	{
		c1 = X - sumx[i];
		c2 = Y - sumy[i];
		c3 = (i + 1) * k;
		ans1 = solveine(c1, c2, c3, k1, k2, k3);
		if (ans1 != -1)
			ans = (ans == -1) ? ans1 * n + i + 1 : min(ans, ans1 * n + i + 1);
		ans1 = solveine(-c1, c2, c3, -k1, k2, k3);
		if (ans1 != -1)
			ans = (ans == -1) ? ans1 * n + i + 1 : min(ans, ans1 * n + i + 1);
		ans1 = solveine(c1, -c2, c3, k1, -k2, k3);
		if (ans1 != -1)
			ans = (ans == -1) ? ans1 * n + i + 1 : min(ans, ans1 * n + i + 1);
		ans1 = solveine(-c1, -c2, c3, -k1, -k2, k3);
		if (ans1 != -1)
			ans = (ans == -1) ? ans1 * n + i + 1 : min(ans, ans1 * n + i + 1);
	}
	return ans;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	// int T;
	cin >> T;
	ll k1, k2, k3;
	while (T--)
	{
		cin >> n >> k >> X >> Y;
		for (int i = 0; i < n; i++)
			cin >> val1[i] >> val2[i];
		if (!X && !Y)
		{
			cout << "0\n";
			continue;
		}
		sumx[0] = val1[0];
		sumy[0] = val2[0];
		for (int i = 1; i < n; i++)
		{
			sumx[i] = sumx[i - 1] + val1[i];
			sumy[i] = sumy[i - 1] + val2[i];
		}
		k1 = sumx[n - 1];
		k2 = sumy[n - 1];
		k3 = n * k;
		cout << solve(k1, k2, k3) << "\n";
	}
	return 0;
}

完事。

标签:P10217,ans1,ll,ans,times,题解,c2,c1,联考
From: https://www.cnblogs.com/wryyy-233/p/18062521

相关文章

  • CF348A Mafia 题解
    由于题目具有十分明显的单调性(若\(x\)局能满足要求,则\(>x\)局一定能满足;若\(x\)局无法满足要求,则\(<x\)局也无法满足),因此我们考虑进行二分答案。二分所需要的局数\(x\),设所有人想玩的总局数为\(S\),由题意可得\(S=\sum^{n}_{i=1}a_i\)。因为每局都会有\(1\)人主持,\(n......
  • [ABC297F] Minimum Bounding Box 2 题解
    容斥真有趣。有一个性质:两个相同的子矩阵,对答案的贡献一定相同。所以就只需要枚举矩阵大小即可。我们设当前矩阵长\(i\)宽\(j\)(对应的,\(H\)为长,\(W\)为宽),假如要给答案做出贡献,矩阵的四条边一定都有点,发现可以容斥了。至少\(0\)条边上有点的方案数为\(a=C_{i\times......
  • P4139 上帝与集合的正确用法 题解
    传送门我觉得这题最有意思的其实是"最终会固定为一个数"这个结论。扩展欧拉定理:\(a^b\bmodp\),当\(b\ge\varphi(p)\)时,\(a^b\equiva^{b\bmod\varphi(p)+\varphi(p)}\pmodp\)。所以\(2^{2^{2^{\cdots}}}\)可以递归求解。边界条件\(p=1\)。复杂度如何保证?其实就是......
  • P4774 屠龙勇士 题解
    传送门显然每一只龙对应了唯一的一把剑。用multiset可以求出每一把剑。于是题目就变成了:\[\begin{cases}b_1x\equiva_1\pmod{m_1}\\b_2x\equiva_2\pmod{m_2}\\\dots\\b_nx\equiva_n\pmod{m_n}\end{cases}\]如果\(b_i=1\),直接EXCRT即可。现在\(b_i>1\),还是以EXCRT......
  • APatch常见问题解答
    常见问题解答什么是APatch?APatch是一种类似于Magisk或KernelSU的root解决方案,但APatch提供更多功能。APatch分别结合了Magisk方便易用的通过boot.img安装的方法,和KernelSU强大的内核修补能力。APatch与Magisk的区别?Magisk对启动映像中的ramdisk进行补丁,以修改init系统。而AP......
  • P6810 「MCOI-02」Convex Hull 凸包 题解
    分析推式子题。\[ans=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\tau(i)\tau(j)\tau(\gcd(i,j))\]对于\((i,j)\),若\(k\)是\((i,j)\)的因子,则\(k\)一定整除\(i,j\),所以有:\[\\\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\tau(i)\tau(j)\sum\limits......
  • CF1436E Complicated Computations 题解
    题目链接:CF或者洛谷关于\(mex\)问题是一个比较久远的问题,有很多经典的方法去解决。本题的\(mex\)是从正整数开始的,不要忽略掉。来讲讲常见的两种解决方案,首先回到题目所问,如果我们暴力地询问:\(1,2,3,4,.....mex\)是否都能由原数组构造出来,对于\(i\)如果它可以由原数组......
  • CF935D Fafa and Ancient Alphabet 题解
    讲一个很暴力的方法(为描述方便,下文\(a\)数组代表\(s1\),\(b\)数组代表\(s2\))。发现假如当前\(a_i\neb_i\),就不需要再向下枚举了,于是拥有了分类讨论的雏形。我们设\(inv\)代表进行到这一步的概率,可分为以下四种情况:\(a_i>0,b_i>0\)。此时假如\(a_i=b_i\),略过;若\(a_i>......
  • [HDU6647] Bracket Sequences on Tree 题解
    [HDU6647]BracketSequencesonTree题解一道纯靠自己推出来的换根\(dp+\)树哈希,写篇题解庆祝一下~~题意:给定一棵无根树,你可以任意选择根节点和遍历顺序,每次遍历时进入一个节点就标记一个(,离开一个节点就标记一个),问所有存在的括号序列有多少种,对998244353取模。先考虑根固......
  • CF contest 1935 Round 932 (Div. 2) A-D题解
    CodeforcesRound932(Div.2)A-D题解CodeforcesRound932(Div.2)绪言很菜,AB速度慢,卡在C,想DP,但是时间优化不下来,说服自己\(2\times10^3\)能过\(n^3\),D稍微简单,但是没看D,遂掉分。A.EntertainmentinMAC给你一个字符串\(s\)和一个偶整数\(n\)。你可以对它进行两种运......