首页 > 代码库 > 弱校连萌 10.5
弱校连萌 10.5
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 }
J.Just Convolution
-----------------------昏割线---------------------
只会一道数位dp...算沈阳 ol 那道的简化版叭
斐波那契 那题感觉真的是数学题没做过,降幂公式都不知道(还没瞅明白正解)
A题是没有思路
J看过了好多,然而题意还是没读懂..
别的也都没看了...
好菜啊....不过又可以学到好多啦>w<
弱校连萌 10.5
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。