USACO 2014 US Open Odometer /// 数位DP
题目大意:
给定区间 l r
求得区间中有多少个数 数的各个数位里出现最多次的数>=数的长度的一半 如2233 3334
枚举k在数中出现次数在一半以上 那么求出的所有方案数中应该减去 两个数各占一半的情况
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
#define gcd(i,j) __gcd(i,j);
const int N=;
const int mod=1e9+;
const double eps=1e-; LL dp[N][N][][];
// dp[i][j][b1][b2]
// i为数的第i位 j作为枚举的k出现次数的相对计数器
// b1=1当前位小于上界 =0则是等于上界
// b2=1到当前位之前全是前导0 =0则不是前导0
LL DP(char t[],int n,int k1,int k2) {
mem(dp,);
dp[][][][]=; // 初始设25 防止负数
inc(i,,n-) inc(j,,N-)
inc(b1,,) inc(b2,,) {
LL cur=dp[i][j][b1][b2];
inc(nxt,,) { // 枚举下一位
if(k2!=-) { // 说明枚举的是2233这种被两个数各占一半的情况
if(b2== || nxt!=) // 下一位不是前导0
if(nxt!=k1 && nxt!=k2) continue; // 但又不是这两种数
}
if(b1== && nxt>t[i]-'') continue;
// 当前位已经是上界 那么下一位不能超过上界
bool nb2= b2&(nxt==); // 当前位是0b2为1 下一位为0nxt==0为1 则nb2为1
int nj=j;
if(nb2==) { // 下一位不是前导0
if(nxt==k1) nj--;
else nj++;
} // 是k1就+ 不是就- 最后j=25说明k1刚好一半 如果j<25说明k1超过半数
bool nb1= b1|(nxt<t[i]-''); // 当前位之前均为上界b1=0 下一位为上界nxt<t[i]-'0'=0 则nb1为0
dp[i+][nj][nb1][nb2]+=cur;
}
}
LL res=dp[n][][][]+dp[n][][][];
if(k2==-) inc(j,,)
res+=dp[n][j][][]+dp[n][j][][];
return res;
} LL ANS(char t[],int n) {
LL res=;
inc(k,,) res+=DP(t,n,k,-); // k出现次数超过一半 如2223
inc(k1,,) inc(k2,k1+,) // k1 k2各占一半的 如2323
res-=DP(t,n,k1,k2);
return res;
} int main()
{
LL ta,tb;
while(~scanf("%lld%lld",&ta,&tb)) {
ta--;
char a[],b[];
int lena=,lenb=;
while(ta) a[lena++]=ta%+'', ta/=;
while(tb) b[lenb++]=tb%+'', tb/=;
reverse(a,a+lena); reverse(b,b+lenb);
printf("%lld\n",ANS(b,lenb)-ANS(a,lena));
} return ;
}
USACO 2014 US Open Odometer /// 数位DP的更多相关文章
- USACO 2014 US Open Odometer /// 枚举
题目大意: 给定区间 l r 求区间包含多少个数 它们各个位的数只有一个不一样 注意 多个位但多个数为0单个数为x的情况 这种情况只有 x000 即把单个数放在首位才是正确的 同样注意 多个位但单个数 ...
- [Swust OJ 1097]--2014(数位dp)
题目链接:http://acm.swust.edu.cn/problem/1097/ Time limit(ms): 1000 Memory limit(kb): 32768 今年是2014年,所 ...
- bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...
- USACO翻译:USACO 2014 US Open 三题
USACO 2014 US Open 一.题目概览 中文题目名称 牧场装饰 里程表 牛像展览 英文题目名称 decorate odometer fairphoto 可执行文件名 decorate od ...
- 浅谈数位DP
在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...
- hdu----(5045)Contest(数位dp)
Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 以前刷过的数位dp
TOJ1688: Round Numbers Description The cows, as you know, have no fingers or thumbs and thus are una ...
- POJ3252 Round Numbers —— 数位DP
题目链接:http://poj.org/problem?id=3252 Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Su ...
- poj3252 Round Numbers(数位dp)
题目传送门 Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16439 Accepted: 6 ...
随机推荐
- python 异常处理【转载】
什么是异常?异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行.一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当Python脚本 ...
- hdu1214 圆桌会议
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1214 HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问 ...
- spring整合消息队列rabbitmq
ps:本文只是简单一个整合介绍,属于抛砖引玉,具体实现还需大家深入研究哈.. 1.首先是生产者配置 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
- Go 数组(1)
1.一旦声明,数组里存储的数据类型和数组长度就都不能改变了.如果需要存储更多的元素, 就需要先创建一个更长的数组,再把原来数组里的值复制到新数组里. 例如: ]int 2.使用数组字面量声明数组 // ...
- CentOS-7 开放80端口
转载声明:本文转载 原文:https://blog.csdn.net/u013310075/article/details/80983117 关闭与开启防火墙 systemctl stop firew ...
- [BZOJ4278] [ONTAK2015]Tasowanie 贪心+后缀数组
题目链接 最近做题目好像有点东一榔头西一棒.好吧其实订正模拟题的时候需要用到什么感觉不太熟的就写一下吧. 显然直接贪心,比较两个点后面的串的字典序,小就选谁就可以了. 可以把两个串接起来,加一个\(i ...
- kill命令的几种信号
1 HUP: hangup 2 INIT: 相当于 Ctrl + c 9 KILL 15 TERM: Terminate (kill 的默认信号) 18 CONT: Continue (从STOP信号 ...
- C#基础提升系列——C#任务同步
C#任务同步 如果需要共享数据,就必须使用同步技术,确保一次只有一个线程访问和改变共享状态.如果不注意同步,就会出现争用条件和死锁. 不同步导致的线程问题 如果两个或多个线程访问相同的对象,并且对共享 ...
- noteone
- pgsql SQL监控,查询SQL执行情况
SELECT procpid, START, now() - START AS lap, current_query FROM ( SELECT backendid, pg_stat_get_back ...