题意:优等数是非0数字的数目小于等于3的数字,给一个范围问你有多少优等数。
思路:时间3秒,考虑直接dfs把所有优等数全部求出,最后发现总共数目只有1万多,存入vector中,sort一下,直接用二分查找数目,相减即可。
这道题3个月之前做过一次,当时没做出来,看了题解,当时掌握了之后,现在重新打还是wa了2发。
我一开始用set存储,发现set不支持迭代器运算,就不能直接找到对应数目 - _ -!!!
网上查了一下,并不是所有stl容器都支持迭代器运算
能进行算术运算的迭代器只有随即访问迭代器,要求容器元素存储在连续内存空间里,vector,string,deque的迭代器是有加减法的,但是map,set,multimap,multiset的迭代器是没有加减法的,list也不可以
将set换成vector排序之后,要注意最后还有一个上界1e18 就可以直接用迭代器运算。
#include<bits/stdc++.h>
#define fi first
#define se second
#define FOR(a) for(int i=0;i<a;i++)
#define sc(a) scanf("%d",&a)
#define show(a) cout<<a<<endl;
#define show2(a,b) cout<<a<<" "<<b<<endl;
#define show3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl;
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
typedef pair<P, int> LP;
const ll inf = 1e17 + 10;
const int N = 1e6 + 10;
const ll mod = 1000000007;
const int base=131;
map<string, int>ml;
ll b[N], vis[N], po[N],num[N], t, n, m, x, y, k, a[N];
ll ex, ey, cnt, ans, sum, flag;
ll hs[N];
ll dp[N];
vector<ll> v;
map<int,int> mp;
priority_queue<P> q;
priority_queue<P> tq;
string s;
set<ll> se;
void dfs(ll step,ll x,ll k)
{
if(step>18||k>3) return ;
else
{
v.push_back(x);
if(k<3)
{
for(ll i=0;i<=9;i++)
{
dfs(step+1,x*10+i,k+(i!=0));
}
}
else if(k==3) dfs(step+1,x*10,k);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
for(int i=1;i<=9;i++)
{
dfs(1,i,1);
}
//show(se.size())
v.push_back(1e18);
sort(v.begin(),v.end());
cin>>t;
while(t--)
{
cin>>x>>y;
cout<<upper_bound(v.begin(),v.end(),y)-lower_bound(v.begin(),v.end(),x)<<endl;
}
}