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();
}
本文来自博客园,作者:wing_heart,转载请注明原文链接:https://www.cnblogs.com/wingheart/p/21635549

浙公网安备 33010602011771号