BZOJ1026: [SCOI2009]windy数
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数的更多相关文章
- BZOJ1026 SCOI2009 windy数 【数位DP】
BZOJ1026 SCOI2009 windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B ...
- BZOJ1026: [SCOI2009]windy数[数位DP]
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6346 Solved: 2831[Submit][Sta ...
- 【数位DP】bzoj1026: [SCOI2009]windy数
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4163 Solved: 1864[Submit][Sta ...
- bzoj1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8203 Solved: 3687[Submit][Sta ...
- 2018.06.30 BZOJ1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两 ...
- bzoj千题计划117:bzoj1026: [SCOI2009]windy数
http://www.lydsy.com/JudgeOnline/problem.php?id=1026 数位DP 如果前一位填的是0, 0是前导0,下一位可以随便填 0不是前导0,下一位不能填1 为 ...
- bzoj1026: [SCOI2009]windy数(传说你是数位DP)
1026: [SCOI2009]windy数 题目:传送门 题解: 其实之前年少无知的时候好像A过...表示当时并不知道什么数位DP 今天回来深造一发... 其实如果对这个算法稍有了解...看到这题的 ...
- [bzoj1026][SCOI2009]windy数_数位dp
windy数 bzoj-1026 题目大意:求一段区间中的windy数个数. 注释:如果一个数任意相邻两位的差的绝对值都不小于2,这个数就是windy数,没有前导0.$区间边界<=2\cdot ...
- [BZOJ1026][SCOI2009]windy数 解题报告|数位dp
Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 一直 ...
随机推荐
- Sqoop 结合多种系统的具体应用
Sqoop与HDFS结合 下面我们结合 HDFS,介绍 Sqoop 从关系型数据库的导入和导出. Sqoop import 它的功能是将数据从关系型数据库导入 HDFS 中,其流程图如下所示. 我们来 ...
- stl之截取:以一段字符串截取字符串
string dforder = line.substr(0,line.find("\t")).c_str(); 解析: line为传进来的string类型 substr查找第0位 ...
- CSS3动画事件
CSS3 的动画效果强大,在移动端使用广泛,动画执行开始和结束都可以使用JS来监听其事件. animationstart animationend 以下是一个示例 <!DOCTYPE html& ...
- java中执行系统命令
java程序中执行系统命令猛击下面的链接看看你就知道怎么用了 http://blog.csdn.net/a19881029/article/details/8063758 http://wuhongy ...
- Google的Java常用类库 Guava资料
java的人应该都知道Apache commons的java常用类库吧,这个Guava和commons一样,封装出一套比jdk本身提供的常用类库强大.既然有了这个这么强大的类库,我们就没必要重复造轮子 ...
- IP分片重组的分析和常见碎片攻击 v0.2
IP分片重组的分析和常见碎片攻击 v0.2http://www.nsfocus.net/index.php?act=magazine&do=view&mid=584 作者:yawl ( ...
- linux下的守护进程daemon
什么是守护进程?其实感觉守护进程并没有什么明确的定义,只是守护进程有一些特征,这是它需要遵循的. 守护进程的第一个特征是长时间在后台运行的程序,并且主要是为了提供某种服务,而为了能够让服务尽可能随时都 ...
- J2EE基础之EJB
J2EE基础之EJB 1.什么是EJB? EJB(Enterprise Java Beans),是JavaEE中的商业应用组件技术,是JavaEE三大组件(Servlet,JSP,EJB) ...
- 关于selenium的CI、框架……
这段时间除了项目测试外,主要在做web自动化的事情,大致总结一下吧,总体的设计模式pageobject+pagefactory+testng的数据驱动,项目用maven来构建,使用jenkins集成, ...
- 输入url到页面返回的过程
输入url后,你看到了百度的首页,那么这一切是如何发生的呢? 这个问题之前.最近.我想以后肯定还会被问到,或者问到这样的题目,如果在百度框里输入查询的字符串开始,是怎么返回你需要的东西呢. 那这什么个 ...