【jzoj4788】【序列】

来源:互联网 发布:室内位置大数据 编辑:程序博客网 时间:2024/06/05 21:02

题目大意

这里写图片描述

解题思路

显然没有模的时候,后一个减前一个差分,正值加起来即为答案。考虑将一个区间加4,左端点的差分值加4,后端点的后一个的差分值减4,而只有正值对答案有贡献。将前面的差分值用桶存起来,枚举右端点,如果是正值则查找前面的差分值,看是否能通过操作使答案减少。

code

#include<set>#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#define LF double#define LL long long#define max(a,b) ((a>b)?a:b)#define min(a,b) ((a>b)?b:a)#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)using namespace std;int const maxn=100000,inf=2147483647;int t,n,a[maxn+10],b[maxn+10],c[10];int main(){    freopen("d.in","r",stdin);    freopen("d.out","w",stdout);    scanf("%d",&t);    fo(cas,1,t){        scanf("%d",&n);int ans=0;        fo(i,1,n)scanf("%d",&a[i]);        fo(i,1,n)scanf("%d",&b[i]);        fo(i,0,3)c[i]=0;        fo(i,1,n){            a[i]=(b[i]+4-a[i])%4;            b[i]=a[i]-a[i-1];            if(b[i]<=0)c[-b[i]]++;            else{                fd(j,3,0)                    if(c[j]&&(4-j<b[i])){                        ans+=4-j;                        c[j]--;                        b[i]=b[i]-4;                        c[-b[i]]++;                        break;                    }                if(b[i]>0)ans+=b[i];            }        }        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击