abc467E - Adjacent Sums (hard)

abc467E - Adjacent Sums (hard)

鲜花

闲着没事想打一场 abc。想着把 rating 下低一点,这样之后复健的时候就会更有兴趣打 abc?所以报了 rated。

拼尽全力(也许没有?)想不到 E 怎么做,然后不打算做了。然后发现我好像有机会上分?最后上了 31 分?这太好笑了!真的!本来没做出 E 题我是不是应该悲伤?但是上了 31 分?谁来救救我的笑点。

是因为 fg 比较难吗?(这有影响吗)

题意

给定 \(n,m\)。给你长度为 \(n\) 的序列 \(\{a_i\}\) 和长度为 \(n-1\) 的序列 \(\{b_i\}\)

你可以进行任意次操作:将任意 \(a_i\)\(1\)

问最小操作次数,使得 \(\forall i\in[1,n-1], a_i+a_{i+1} \equiv b_i \pmod{m}\)

\(n \le 2\times 10^5,m \le 10^9\)

思路

阅读官方题解。

令长度为 \(n-1\) 的序列 \(d_i = (b_i - (a_i+a_{i+1})) \bmod m\)

令序列 \(\{c_i\}\) 表示 \(a_i\) 加了 \(c_i\)

题目限制即为 \(c_i+c_{i+1} \equiv d_i \pmod{m}\)

先令 \(c_1=t\),然后从前往后依次给 \(c\) 赋值。

\(c_2 = d_1-t\\c_3 = d_2-d_1+t\\c_4 = d_3-d_2+d_1-t\\\cdots\)

(全部是模 \(m\) 意义下的)

所以我们令 \(f_i = (\sum_{x=1}^{i-1} (-1)^{[x \equiv i \pmod{2}]}d_x) \bmod m\)。即 \(c_i = f_i+t\)

发现很难直接找出最合适的 \(t\),不妨一个个试。只有 \(O(n)\)\(t\) 会使得某些 \(c_i\)(或者说 \(f_i\))减到 \(0\) 或者加到 \(m\),使得结果不太规律。

所以找出这些特殊的 \(t\),从小到大枚举即可。(显然没有涉及到加减 \(m\) 的时候,较小的 \(t\) 不会更劣:\(2\mid n\) 时不变,\(2\nmid n\) 时更优)

时间复杂度 \(O(n\log n)\)

code

有一点细节。

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace wing_heart {
	const int N=2e5+7;
	const ll inf=0x3f3f3f3f3f3f3f3f;
	int n,m;
	int a[N],b[N],d[N],f[N],t[N],id[N];
	ll s,ans;
	bool cmp(int x,int y) {
		return t[x]<t[y];
	}
    void main() {
		sf("%d%d",&n,&m);
		rep(i,1,n) sf("%d",&a[i]);
		rep(i,1,n-1) sf("%d",&b[i]);
		rep(i,1,n-1) d[i] = ((b[i]-a[i]-a[i+1])%m+m)%m;
		rep(i,2,n) f[i] = (-f[i-1] + d[i-1]+m)%m, s+=f[i], t[i] = i&1 ? m-f[i] : f[i];
		t[1]=m;
		ans = s;
		rep(i,1,n) id[i]=i;
		sort(id+1,id+n+1,cmp);
		int cnt=0;
		rep(i,1,n) {
			int p = id[i];
			if(t[p]==m) break;
			if(!t[p]) {
				s+=m;
				continue;
			}
			if(p&1) s-=m;
			else cnt++;
			if(t[id[i+1]]!=t[p]) ans = min(ans,s+(n&1 ? t[p] : 0)), s+=1ll*m*cnt, cnt=0;
		}
		pf("%lld\n",ans);
    }
}
int main() {
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("my.out","w",stdout);
    #endif
    wing_heart :: main();
}
posted @ 2026-07-19 15:18  wing_heart  阅读(38)  评论(0)    收藏  举报