Classy Numbers

http://codeforces.com/group/w1oiqifZbS/contest/1036/problem/C

①先查找,存入vector(dfs)-->排序(sort)-->二分(lower_bound,upper_bound)

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<iostream>
 5 #include<stdlib.h>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<string>
10 #include<set>
11 #include<cctype>
12 #include<sstream>
13 #define mem(a) memset(a,0,sizeof(a))
14 #define LL long long
15 using namespace std;
16 const int N=1e6+5;
17 vector<LL> ve;
18 LL n,l,r,m;
19 void dfs(LL now,int sum,int len)
20 {
21     ve.push_back(now);
22     if(len==18)return;
23     dfs(now*10,sum,len+1); //十的倍数
24     if(sum<3)
25     {
26        for(int i=1;i<=9;i++)
27         dfs(now*10+i,sum+1,len+1);//其他,加一---非零
28     }
29 }
30 int main()
31 {
32     for(int i=1;i<=9;i++) //找到符合条件的数
33         dfs(i,1,1);
34     ve.push_back(1e18);//范围,不超过,且1e18符合
35     sort(ve.begin(),ve.end()); //lo,up要先排序
36     int t;
37     scanf("%d",&t);
38     while(t--)
39     {
40         scanf("%I64d%I64d",&l,&r);
41         /*二分查找*/
42         int L=lower_bound(ve.begin(),ve.end(),l)-ve.begin();//返回第一个大于等于元素的下标
43         int R=upper_bound(ve.begin(),ve.end(),r)-ve.begin();//返回第一个大于的元素的下标;
44         printf("%d\n",R-L); //因为是up-lo,所以不用+1,且两个都是lo的话+1会在lr相等时出错
45     }
46     return 0;
47 }
View Code

②查到发现还可以用数位DP mark一下

posted @ 2019-01-22 13:51  XXrl  阅读(147)  评论(0编辑  收藏  举报