T2 Clockwork
快乐题!
就我一个正解😁
两个序列 a i , b i a_i,b_i ai,bi,模4意义下对 a l , r a_{l,r} al,r加某数,对答案贡献为该数,最小化使两序列相同的答案
显然需要相减
(
m
o
d
4
)
\pmod 4
(mod4)
区间操作考虑差分
目标使差分数组全0
于是统计正数/负数之和(两个和都一样),即
∑
[
d
i
>
0
]
d
i
\sum[d_i>0]d_i
∑[di>0]di
显然这样不是最优的,于是考虑下表:
l
r
+
1
→
l
r
+
1
a
n
s
1
−
3
3
∣
1
−
1
−
2
2
−
3
2
∣
1
−
2
−
1
3
−
3
1
∣
1
−
3
4
−
2
3
∣
2
−
1
−
1
5
−
2
2
∣
2
−
2
6
−
2
1
∣
2
−
3
7
−
1
3
∣
3
−
1
8
−
1
2
∣
3
−
2
9
−
1
1
∣
3
−
3
\begin{matrix} &&l &r+1 &\to &l &r+1&ans\\ &1&-3&3&|&1&-1&-2\\ &2&-3&2&|&1&-2&-1\\ &3&-3&1&|&1&-3&\\ &4&-2&3&|&2&-1&-1\\ &5&-2&2&|&2&-2&\\ &6&-2&1&|&2&-3&\\ &7&-1&3&|&3&-1&\\ &8&-1&2&|&3&-2&\\ &9&-1&1&|&3&-3&\\ \end{matrix}
123456789l−3−3−3−2−2−2−1−1−1r+1321321321→∣∣∣∣∣∣∣∣∣l111222333r+1−1−2−3−1−2−3−1−2−3ans−2−1−1
那么第一排,第二排,第四排的转化方案就更优
并且第一排的最优,于是打一个tag优先选择第一排的方案
考完了被冯巨hack了😭,但同时又很高兴
如果差分数组长这样:
−
3...2...3
-3...2...3
−3...2...3
需要
−
3
,
3
-3,3
−3,3配对(见上),于是再来一个cnt
具体实现见代码
#include<bits/stdc++.h>
using namespace std;
#define in Read()
int in{
int i=0,f=1;char ch=0;
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') f=-1,ch=getchar();
while(isdigit(ch)) i=(i<<1)+(i<<3)+ch-48,ch=getchar();
return i*f;
}
const int N=1e5+5;
int n,a[N],b[N],d[N],ans,cnt1,cnt2,cnt3;
int main(){
freopen("1.in","r",stdin);
// freopen("clockwork.out","w",stdout);
n=in;
for(int i=1;i<=n;++i) a[i]=in;
for(int i=1;i<=n;++i) b[i]=in;
for(int i=1;i<=n;++i) a[i]=(b[i]>=a[i]?b[i]-a[i]:b[i]-a[i]+4);
for(int i=1;i<=n+1;++i) d[i]=a[i]-a[i-1];
for(int i=1;i<=n+1;++i) if(d[i]>0) ans+=d[i];
for(int i=1;i<=n+1;++i){
bool flag=true;
if(d[i]==-3) ++cnt1;
if(d[i]==3&&cnt1) --cnt1,ans-=2,flag=false;
if(d[i]==3&&cnt3&&flag) --cnt3,ans-=1,flag=false;
if(d[i]==2&&cnt1) --cnt1,ans-=1,++cnt3;
if(d[i]==-2) ++cnt2;
if(d[i]==3&&cnt2&&flag) --cnt2,ans-=1;
}
printf("%d\n",ans);
return 0;
}