传送门

md直接wa了78次,身败名裂

没学过数位DP硬搞了一道数位DP的模板题,感觉非常的愉(sha)悦(cha)。

二分转化枚举思想。首先DP预处理出来$f[i][j]$表示有$i$位且第$i$位为$j$的windy数有多少个,然后搞个$g[i]$表示$i$位上可以有多少个windy数。然后二分出来最大的小于$A$和$B$的windy数。相减就好了。

//BZOJ 1026
//by Cydiater
//2016.10.24
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <iomanip>
#include <bitset>
using namespace std;
#define ll long long
#define up(i,j,n)       for(int i=j;i<=n;i++)
#define down(i,j,n)     for(int i=j;i>=n;i--)
const int oo=0x3f3f3f3f;
inline ll read(){
    char ch=getchar();ll x=0,f=1;
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
ll f[15][15],A,B,g[15],ten[15];
namespace solution{
    void init(){
        A=read();B=read();
        ll tmp=1;
        up(i,1,14){
            ten[i]=tmp;
            tmp*=10LL;
        }
    }
    ll col(ll pos,ll re,ll last){
        if(pos==0)return 0;
        if(last==-1){
			if(pos==1){
				if(re<=f[pos][0])return 0;
				re-=f[pos][0];
			}
            up(i,1,9){
                if(re<=f[pos][i])return  ten[pos]*i+col(pos-1,re,i);
                re-=f[pos][i];
            }
        }else{
			if(pos==1&&last-2>=0){
				if(re<=f[pos][0])return 0;
				re-=f[pos][0];
			}
            if(last-2>=0){
                ll sum=0;
                up(i,2,9)sum+=f[pos-1][i];
                if(re<=sum)      return col(pos-1,re,0);
                else            re-=sum;
            }
            up(i,1,9)if(abs(i-last)>=2){
                if(re<=f[pos][i])    return ten[pos]*i+col(pos-1,re,i);
                re-=f[pos][i];
            }
        }
    }
    ll check(ll id){
        ll last=-1,ans=0,high=0;
        down(i,11,1)if(g[i]<id){
            high=i;
            id-=g[i];
            break;
        }
        ans=col(high+1,id,-1);
        return ans;
    }
    ll get(ll num){
        ll leftt=0,rightt=10000000000LL,mid;
        while(leftt+1<rightt){
            mid=(leftt+rightt)>>1;
            if(check(mid)<=num)   leftt=mid;
            else                rightt=mid;
        }
        if(check(rightt)<=num)       return rightt;
        return leftt;
    }
    void slove(){
        memset(f,0,sizeof(f));
        up(i,0,9)f[1][i]=1;
        up(i,2,14)up(j,0,9){
            up(k,j+2,9)f[i][j]+=f[i-1][k];
            down(k,j-2,0)f[i][j]+=f[i-1][k];
        }
		if(A>B)swap(A,B);
        memset(g,0,sizeof(g));
        g[0]=1;
        up(i,1,14){
            g[i]+=g[i-1];
            up(j,1,9)g[i]+=f[i][j];
        }
        cout<<get(B)-get(A-1)<<endl;
    }
}
int main(){
	//freopen("input.in","r",stdin);
	//freopen("out1.out","w",stdout);
    using namespace solution;
    init();
    slove();
    return 0;
}

BZOJ1026: [SCOI2009]windy数的更多相关文章

  1. BZOJ1026 SCOI2009 windy数 【数位DP】

    BZOJ1026 SCOI2009 windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B ...

  2. BZOJ1026: [SCOI2009]windy数[数位DP]

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 6346  Solved: 2831[Submit][Sta ...

  3. 【数位DP】bzoj1026: [SCOI2009]windy数

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4163  Solved: 1864[Submit][Sta ...

  4. bzoj1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8203  Solved: 3687[Submit][Sta ...

  5. 2018.06.30 BZOJ1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两 ...

  6. bzoj千题计划117:bzoj1026: [SCOI2009]windy数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1026 数位DP 如果前一位填的是0, 0是前导0,下一位可以随便填 0不是前导0,下一位不能填1 为 ...

  7. bzoj1026: [SCOI2009]windy数(传说你是数位DP)

    1026: [SCOI2009]windy数 题目:传送门 题解: 其实之前年少无知的时候好像A过...表示当时并不知道什么数位DP 今天回来深造一发... 其实如果对这个算法稍有了解...看到这题的 ...

  8. [bzoj1026][SCOI2009]windy数_数位dp

    windy数 bzoj-1026 题目大意:求一段区间中的windy数个数. 注释:如果一个数任意相邻两位的差的绝对值都不小于2,这个数就是windy数,没有前导0.$区间边界<=2\cdot ...

  9. [BZOJ1026][SCOI2009]windy数 解题报告|数位dp

    Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 一直 ...

随机推荐

  1. 使用 Fiddler 上传微信公众账号 自定义菜单

    0.你必须有微信公众账号的服务号.成为开发者之后.... 1.得到你的 appid (xxxxxxoooo)和 secret (oooooooxxxxxxx) 2.用这个链接得到你的 access_t ...

  2. Linux备份ifcfg-eth0文件导致的网络故障问题

    今天在给一台操作系统为Oracle Linux Server release 5.7的服务器配置网络时,遇到了备份ifcfg-eth0配置文件,导致网卡无法绑定IP地址的情况.觉得是个有意思的案例,特 ...

  3. CREATE FILE encountered operating system error 5(Access is denied.)

    这篇博文主要演示"CREATE FILE encountered operating system error 5(Access is denied.)"错误如出现的原因(当然只是 ...

  4. asp.net signalR 专题—— 第四篇 模拟RPC模式的Hub操作

    在之前的文章中,我们使用的都是持久连接,但是使用持久连接的话,这种模拟socket的形式使用起来还是很不方便的,比如只有一个唯一的 OnReceived方法来处理业务逻辑,如下图: protected ...

  5. WinForm常用事件

    不定期更新... Load:加载窗体时引发: LocationChanged: KeyDown:一般用做快捷键例如CTRL+S,执行保存 FormClosed: 窗体关闭后,例如登陆窗体为启动窗体,关 ...

  6. [WPF系列]-基础系列 Property Trigger, DataTrigger & EventTrigger

    So far, we worked with styles by setting a static value for a specific property. However, using trig ...

  7. Java Generics and Collections-2.1

    2.1 子类化以及替换原理 为什么List<Integer> 不是List<Number> 的子类? 首先看下面的代码,这段代码是编译不过的 package java_gene ...

  8. NOIP2011选择客栈[递推]

    题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...

  9. Flash Builder 4.7 注册机完美激活方法

    Flash Builder 4.7 破解注册方法目前较为通用的三种方法: 第一种:三步修改配置文件方法,这种有开发者反应这种方法在升级和创建纯 AS 项目时会存在问题,但我懒的去试这种方法的主要原因是 ...

  10. MAVEN构建Spring +Spring mvc + Mybatis 项目(Maven配置部分(workshop))

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...