【NOIP2016提高A組模擬9.17】序列
阿新 • • 發佈:2018-05-17
log cstring 表示 inline space cst tdi n) sca
題目
分析
首先用\(a_i\)表示達到目標的步數\(B_i-A_i(mod 4)\)
根據粉刷柵欄,先不管mod 4的情況,答案就是\(\sum\max(a_i-a_{i+1},0)\)
那我們剛才做個差分\(a_i-=a_{i+1}\)
當我們給i增加高度,
那麽\(a_i-4,a_{i+1}+4\)
當我們給區間增加高度,那麽因為中間的+4-4抵消了,所以
\(a_l-4,a_r+4\)
那麽我們考慮
\(a_l\)為1、2、3的情況,
就讀者私下討論。
#include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> const int maxlongint=2147483647; const int mo=1000000007; const int N=100005; using namespace std; int a[N],n,q; int main() { scanf("%d",&q); while(q--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { int x; scanf("%d",&x); a[i]=(x-a[i]+4)%4; } int t2=0,t3=0,ans=0; for(int i=1;i<=n;i++) { a[i]-=a[i+1]; ans+=max(a[i],0); } for(int i=1;i<=n;i++) { if(a[i]==3) t3++; else if(a[i]==2) t2++; else if(a[i]==-2) { if(t3) { t3--; t2++; ans--; } } else if(a[i]==-3) { if(t3) { t3--; ans-=2; } else if(t2) { t2--; ans--; } } } cout<<ans<<endl; } }
【NOIP2016提高A組模擬9.17】序列