JZOJ573820190706锁屏杀

Posted paul-guderian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZOJ573820190706锁屏杀相关的知识,希望对你有一定的参考价值。

题目

技术图片

技术图片

技术图片

$n \\le 2000 $

题解

  • \\(B\\)的数字可以对1440取模,对三个图分别进行\\(dp\\)即可
  • 时间复杂度\\(O(n\\times 1440 \\times 10)\\)

Code

#include<bits/stdc++.h>
#define il inline 
using namespace std;
const int N=2100,P=1440;
int n,cnt[128],F[P],G1[P],G2[P],mp[N],a[N][10];
char S[7][N];
int num[10][5]=
    127,65,65,127,0,
    0,0,0,127,0,
    121,73,73,79,0,
    73,73,73,127,0,
    15,8,8,127,0,
    79,73,73,121,0,
    127,73,73,121,0,
    1,1,1,127,0,
    127,73,73,127,0,
    79,73,73,127,0
;
il void upd(int&x,int y)if(x>y)x=y;
il int get(int x,int y)
    int re=0;
    for(int i=0;i<5;++i)re+=cnt[mp[x+i]^num[y][i]];
    return re;

void init()
    scanf("%d",&n);
    for(int i=6;~i;--i)scanf("%s",S[i]+1);
    
    for(int i=1,x;i<=n;mp[i++]=x)
    for(int j=x=0;j<7;++j)
        x=x<<1|(S[j][i]=='X');
    mp[n+1]=0;

    memset(a,1,sizeof(a));
    for(int i=1;i<=n-3;++i)
    for(int j=0;j<10;++j)
        a[i][j]=get(i,j);

void solve2(int *re)
    static int f[N][P],g[N],s[N];
    memset(f,1,sizeof(f));
    memset(g,1,sizeof(g));
    memset(s,1,sizeof(s));
    init();
    
    s[0]=0;
    for(int i=0;i<=n;++i)
        int t=cnt[mp[i+1]];
        s[i+1]=s[i]+t;
        
        upd(g[i+1],g[i]+t);
        upd(g[i+5],s[i]+a[i+1][0]);
        for(int j=1;j<10;++j)
            upd(f[i+5][j],s[i]+a[i+1][j]);
           
        for(int j=0;j<P;++j)
            upd(f[i+1][j],f[i][j]+t);
            for(int k=0;k<10;++k)
                upd(f[i+5][(j*10+k)%P],f[i][j]+a[i+1][k]);
            
        

    
    
    for(int i=1;i<P;++i)re[i]=f[n+1][i];
    re[0]=g[n+1];

void solve1(int *re)
    static int l[N][3],L[N][24],r[N][10],R[N][60],s[N];
    init();
    memset(l,1,sizeof(l));
    memset(r,1,sizeof(r));
    memset(L,1,sizeof(L));
    memset(R,1,sizeof(R));
    memset(s,1,sizeof(s));
        
    s[0]=0;
    for(int i=0;i<=n;++i)
        int t=cnt[mp[i+1]];
        s[i+1]=s[i]+t;
        for(int j=0;j<3;++j)
            upd(l[i+1][j],l[i][j]+t);
            upd(l[i+5][j],s[i]+a[i+1][j]);
        
        for(int j=0;j<10;++j)
            upd(L[i+1][j],L[i][j]+t);
            upd(L[i+1][10+j],L[i][10+j]+t);
            upd(L[i+5][j],l[i][0]+a[i+1][j]);
            upd(L[i+5][10+j],l[i][1]+a[i+1][j]);
        
        for(int j=0;j<4;++j)
            upd(L[i+1][20+j],L[i][20+j]+t);
            upd(L[i+5][20+j],l[i][2]+a[i+1][j]);
        
    
    
    s[n+1]=s[n+2]=0;
    for(int i=n;i;--i)
        int t=cnt[mp[i]];
        s[i]=s[i+1]+t;
        for(int j=0;j<10;++j)
            upd(r[i][j],r[i+1][j]+t);
            upd(r[i][j],a[i][j]+s[i+5]);
        
        for(int j=0;j<6;++j)
        for(int k=0;k<10;++k)
            int x=10*j+k;
            upd(R[i][x],R[i+1][x]+t);
            upd(R[i][x],a[i][j]+r[i+5][k]);
        
    

    for(int i=0;i<24;++i)
    for(int j=0;j<60;++j)
        int t=0x3f3f3f3f;
        for(int k=1;k<=n+1;++k)
            upd(t,L[k-1][i]+R[k+2][j]+cnt[mp[k]^20]+cnt[mp[k+1]]);
        re[i*60+j]=t;
    

void getans()
    int re=0x3f3f3f3f;
    for(int i=0;i<P;++i)
    for(int j=0;j<P;++j)
        int t=j-i;if(t<0)t+=P;
        upd(re,G1[i]+G2[j]+F[t]);
    
    cout<<re<<endl;

int main()
    freopen("joke.in","r",stdin);
    freopen("joke.out","w",stdout);
    for(int i=1;i<128;++i)cnt[i]=cnt[i>>1]+(i&1);
    solve1(G1);
    solve2(F);
    solve1(G2);
    getans();
    return 0;

以上是关于JZOJ573820190706锁屏杀的主要内容,如果未能解决你的问题,请参考以下文章

为啥win10锁屏壁纸会自动变成Windows聚焦?

android怎么代码实现锁屏

android锁屏开发难题,系统锁出现后如何自动取消的问题

windowsserver2012r2电脑怎么锁屏

android开发 怎样锁屏并设置解锁密码

iOS开发 锁屏后后台无法继续录音