码迷,mamicode.com
首页 > 其他好文 > 详细

弱校连萌 10.5

时间:2016-10-05 21:50:09      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

A.As Easy As Possible

B.Be Friends

C.Coprime Heaven

D.Drawing Hell

E.Easiest Game

F.Fibonacci of Fibonacci

G.Global Warming

H.Hash Collision

I.Increasing or Decreasing

询问[l,r] 区间 数位单调的数的个数

dp[pos][pre][zero] 

然后 搜三次,搜单增的,单减的,不变的

技术分享
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 using namespace std;
 7 
 8 typedef long long LL;
 9 const int maxn = 1e5+5;
10 LL dp[20][10][2],f[20][10][2],e[20][10][2];
11 int d[65];
12 
13 LL dfs(int pos,int pre,int zero,int limit){
14     if(pos == 0) return 1;
15     if(!limit && ~dp[pos][pre][zero]) return dp[pos][pre][zero];
16     int top = limit?d[pos]:9;
17     LL res = 0LL;
18     for(int i = 0;i <= top;i++){
19         if(zero == 1){
20             if(i == 0) res += dfs(pos-1,0,1,limit && i == top);
21             else res += dfs(pos-1,i,0,limit && i == top);
22         }
23         else{
24             if(i >= pre) res += dfs(pos-1,i,0,limit && i == top);
25         }
26     }
27     if(!limit) dp[pos][pre][zero] = res;
28     return res;
29 }
30 
31 LL Dfs(int pos,int pre,int zero,int limit){
32     if(pos == 0) return 1;
33     if(!limit && ~f[pos][pre][zero]) return f[pos][pre][zero];
34     int top = limit?d[pos]:9;
35     LL res = 0LL;
36     for(int i = 0;i <= top;i++){
37         if(zero == 1){
38             if(i == 0) res += Dfs(pos-1,0,1,limit && i == top);
39             else res += Dfs(pos-1,i,0,limit && i == top);
40         }
41         else{
42             if(i <= pre) res += Dfs(pos-1,i,0,limit && i == top);
43         }
44     }
45     if(!limit) f[pos][pre][zero] = res;
46     return res;
47 }
48 
49 LL DFS(int pos,int pre,int zero,int limit){
50     if(pos == 0) return 1;
51     if(!limit && ~e[pos][pre][zero]) return e[pos][pre][zero];
52     int top = limit?d[pos]:9;
53     LL res = 0LL;
54     for(int i = 0;i <= top;i++){
55         if(zero == 1){
56             if(i == 0) res += DFS(pos-1,0,1,limit && i == top);
57             else res += DFS(pos-1,i,0,limit && i == top);
58         }
59         else{
60             if(i == pre) res += DFS(pos-1,i,0,limit && i == top);
61         }
62     }
63     if(!limit) e[pos][pre][zero] = res;
64     return res;
65 }
66 
67 LL solve(LL x){
68     int len = 0;
69     //printf("x = %lld ",x);
70     
71      while(x){
72         d[++len] = x%10;
73         x = x/10;
74     }
75     LL l = dfs(len,0,1,1);
76     LL r = Dfs(len,0,1,1);
77     LL cnt = DFS(len,0,1,1);
78     LL res = l+r - cnt;
79    // printf("l = %lld r = %lld cnt = %lld res = %lld \n",l,r,cnt,res);
80     return res;
81 }
82 
83 int main(){
84     int T;
85     memset(e,-1,sizeof(e));
86     memset(dp,-1,sizeof(dp));
87     memset(f,-1,sizeof(f));
88     LL tmp = DFS(18,0,1,1);
89     LL l = dfs(18,0,1,1);
90     LL r = Dfs(18,0,1,1);
91     scanf("%d",&T);
92     while(T--){
93         LL L,R;
94         scanf("%lld %lld",&L,&R);
95         LL ans = solve(R) - solve(L-1);
96         printf("%lld\n",ans);
97     }
98     return 0;
99 }
View Code

 

J.Just Convolution

 

-----------------------昏割线---------------------

只会一道数位dp...算沈阳 ol 那道的简化版叭

斐波那契 那题感觉真的是数学题没做过,降幂公式都不知道(还没瞅明白正解)

A题是没有思路

J看过了好多,然而题意还是没读懂..

别的也都没看了...

 

好菜啊....不过又可以学到好多啦>w<

 

弱校连萌 10.5

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/5932706.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!