代码+注释

  1 //我感觉这道题最扯的就是我因为输入而TLE了半天,懵逼死了,想破脑袋也没想到因为输入TLE了半天
2 //题意:求区间内数字满足“奇数各数出现偶数次,偶数各数出现奇数次”的数字的个数。
3 //题解:
4 //dp[x][y]表示长度为x的时候0~9各出现的状态情况,因为可能有未出现的情况,如果这个y用二进制
5 //保存的话那么未出现的偶数可能会因为0而出现误判,所以应该多一个状态,就用三进制。0表示未出现,
6 //1表示出现了奇数次,2表示出现了偶数次。
7 //就是一道状压+数位dp,和XHXJ's LIS HDU - 4352 很相似
8 //XHXJ's LIS HDU - 4352(这个是状压成二进制+dp):https://www.cnblogs.com/kongbursi-2292702937/p/11934243.html
9
10 #include<stdio.h>
11 #include<string.h>
12 #include<algorithm>
13 #include<iostream>
14 using namespace std;
15 const int maxn=20;
16 const int N=1<<10;
17 typedef long long ll;
18 ll v[maxn],dp[maxn][60000],w[15];
19 //ll mul(ll x, ll y) {
20 // ll ret = 1;
21 // while(y) {
22 // if(y & 1) ret *= x;
23 // x *= x;
24 // y >>= 1;
25 // }
26 // return ret;
27 //}
28 //ll update(ll i,ll s) {
29 // ll ts = s, ti = i;
30 // while(ti--) ts /= 3;
31 // ll bit = ts % 3;
32 // if(bit < 2) return s + mul(3, i);
33 // return s - mul(3, i);
34 //}
35 ll update(ll x,ll y) //更新我们压缩的状态
36 {
37 ll ans[maxn],len=0;
38 memset(ans,0,sizeof(ans));
39 while(y)
40 {
41 ans[len]=y%3;
42 len++;
43 y/=3;
44 }
45 if(ans[x]==0)
46 {
47 ans[x]=1;
48 }
49 else if(ans[x]==1)
50 ans[x]=2;
51 else ans[x]=1;
52 len=max(x+1,len);
53
54 y=0;
55 x=1;
56 for(ll i=0; i<len; ++i)
57 {
58 y+=ans[i]*x;
59 x*=3;
60 }
61 return y;
62 }
63 bool get_num(ll x)
64 {
65 ll ans[maxn],len=0;
66 memset(ans,0,sizeof(ans));
67 while(x)
68 {
69 ans[len]=x%3;
70 len++;
71 x/=3;
72 }
73 bool flag=0;
74 for(ll i=0; i<len; ++i)
75 {
76 if(i==0 || i%2==0)
77 {
78 if(ans[i]!=0 && ans[i]!=1)
79 {
80 flag=1;
81 break;
82 }
83
84 }
85 else
86 {
87 if(ans[i]!=0 && ans[i]!=2)
88 {
89 flag=1;
90 break;
91 }
92
93 }
94 }
95 return flag;
96 }
97 ll dfs(ll pos,ll sta,bool limit,bool lead)
98 {
99 if(pos==-1)
100 {
101 if(!get_num(sta))
102 return 1;
103 else return 0;
104 }
105 if(!limit && dp[pos][sta]!=-1) return dp[pos][sta];
106 ll up=limit?v[pos]:9;
107 ll tmp=0;
108 for(ll i=0; i<=up; ++i)
109 {
110 if(lead && i==0)
111 {
112 tmp+=dfs(pos-1,0,limit && i==v[pos],1);
113
114 }
115 else
116 {
117
118 tmp+=dfs(pos-1,update(i,sta),limit && i==v[pos],0);
119
120 }
121 }
122 if(!limit) dp[pos][sta]=tmp;
123 return tmp;
124 }
125 ll solve(ll ans)
126 {
127 ll pos=0;
128 while(ans)
129 {
130 v[pos++]=ans%10;
131 ans/=10;
132 }
133 return dfs(pos-1,0,true,1);
134 }
135 int main()
136 {
137 int t;
138 ll l,r;
139 cin>>t;
140 memset(dp,-1,sizeof(dp));
141 while(t--)
142 {
143 cin >> l >> r;
144 cout << solve(r) - solve(l-1) << endl;
145 }
146 return 0;
147 }

Balanced Numbers SPOJ - BALNUM的更多相关文章

  1. SPOJ BALNUM - Balanced Numbers - [数位DP][状态压缩]

    题目链接:http://www.spoj.com/problems/BALNUM/en/ Time limit: 0.123s Source limit: 50000B Memory limit: 1 ...

  2. SPOJ - BALNUM Balanced Numbers(数位dp+三进制状压)

    Balanced Numbers Balanced numbers have been used by mathematicians for centuries. A positive integer ...

  3. SPOJ - BALNUM - Balanced Numbers(数位DP)

    链接: https://vjudge.net/problem/SPOJ-BALNUM 题意: Balanced numbers have been used by mathematicians for ...

  4. BALNUM - Balanced Numbers

    BALNUM - Balanced Numbers Time limit:123 ms Memory limit:1572864 kB Balanced numbers have been used ...

  5. spoj Balanced Numbers(数位dp)

    一个数字是Balanced Numbers,当且仅当组成这个数字的数,奇数出现偶数次,偶数出现奇数次 一下子就相到了三进制状压,数组开小了,一直wa,都不报re, 使用记忆化搜索,dp[i][s] 表 ...

  6. SPOJ10606 BALNUM - Balanced Numbers(数位DP+状压)

    Balanced numbers have been used by mathematicians for centuries. A positive integer is considered a ...

  7. Balanced Numbers (数位dp+三进制)

    SPOJ - BALNUM 题意: Balanced Numbers:数位上的偶数出现奇数次,数位上的奇数出现偶数次(比如2334, 2出现1次,4出现1次,3出现两次,所以2334是 Balance ...

  8. Balanced Numbers (数位DP)

    Balanced Numbers https://vjudge.net/contest/287810#problem/K Balanced numbers have been used by math ...

  9. Balanced Numbers(数位dp)

    Description Balanced numbers have been used by mathematicians for centuries. A positive integer is c ...

随机推荐

  1. 【排序基础】5、插入排序法 - Insertion Sort

    插入排序法 - Insertion Sort 文章目录 插入排序法 - Insertion Sort 插入排序设计思想 插入排序代码实现 操作:插入排序与选择排序的比较 简单记录-bobo老师的玩转算 ...

  2. 安装percona-toolkit

    http://www.percona.com/software/percona-toolkityum -y install perl-DBIyum -y install perl-DBD-mysqly ...

  3. element el-table表格的vue组件二次封装(附表格高度自适应)

    基于vue的el-table表格二次封装组件方法 前言 在公司实习使用vue+element-ui框架进行前端开发,使用表格el-table较为多,有些业务逻辑比较相似,有些地方使用的重复性高,如果多 ...

  4. 【Oracle】迁移表到其他的表空间

    有些时候需要将表迁移到其他的表空间,在将表空间做相关的操作 下面是命令如何迁移表空间 SQL> alter table 表名 move tablespace 表空间名; 如果有很多的表想要迁移的 ...

  5. [Usaco2008 Mar]River Crossing渡河问题

    题目描述 Farmer John以及他的N(1 <= N <= 2,500)头奶牛打算过一条河,但他们所有的渡河工具,仅仅是一个木筏. 由于奶牛不会划船,在整个渡河过程中,FJ必须始终在木 ...

  6. Ajax中的同源政策

    Ajax中的同源政策 Ajax请求限制 Ajax只能向自己的服务器发送请求.比如现在有一个A网站.有一个B网站,A网站中的HTML文件只能向A网站服务器中发送Ajax请求,B网站中的HTML文件只能向 ...

  7. 手把手做一个基于vue-cli的组件库(上篇)

    基于vue-cli4的ui组件库,先贴个最终效果吧,步骤有点多,准备分上下篇,上篇:如何做一个初步的组件.下篇:编写说明文档及页面优化.开工. GitHub源码地址:https://github.co ...

  8. Unix Socket 代理服务 unix域套接字

    基于Unix Socket的可靠Node.js HTTP代理实现(支持WebSocket协议) - royalrover - 博客园 https://www.cnblogs.com/accordion ...

  9. 8.3 Customizing Git - Git Hooks 钩子 自动拉取 自动部署 提交工作流钩子,电子邮件工作流钩子和其他钩子

    https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks https://github.com/git/git/blob/master/temp ...

  10. 在不同情况下connect失败和ping不通的数据分析