【NOIP2016提高A组模拟9.17】序列

来源:互联网 发布:淘宝店库存软件 编辑:程序博客网 时间:2024/05/18 11:27

题目

这里写图片描述

分析

首先用ai表示达到目标的步数BiAi(mod4)
根据粉刷栅栏,先不管mod 4的情况,答案就是max(aiai+1,0)
那我们刚才做个差分ai=ai+1
当我们给i增加高度,
那么ai4ai+1+4
当我们给区间增加高度,那么因为中间的+4-4抵消了,所以
al4ar+4
那么我们考虑
al为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;    }}
1 0
原创粉丝点击