本博文代码打包下载
C++二分查找
[JOIG 20
24] たくさんの数字 / Many Digits
题目形貌
JOI 高中的 Aoi 决定在 N × N N\times N N×N 的表格中写下 N 2 N^2 N2 个非负整数。具体地,给定两个长度为 N N N 的序列 A , B A,B A,B,她会在第 i i i 行第 j j j 列的格子上写下 A i + B j A_i+B_j Ai+Bj。
Aoi 想知道写出这些数必要多少个字符。也就是说,你必要求出写出的 N 2 N^2 N2 个整数在十进制下的位数的和。
输入格式
第一行输入一个整数 N N N。
第二行输入 N N N 个整数 A 1 , A 2 , … , A N A_1,A_2,\ldots,A_N A1,A2,…,AN。
第三行输入 N N N 个整数 B 1 , B 2 , … , B N B_1,B_2,\ldots,B_N B1,B2,…,BN。
输特殊式
( 22 22 22 分) 1 0 8 ≤ A i ( 1 ≤ i ≤ N ) 10
^8\le A_i(1\le i\le N) 10
8≤Ai(1≤i≤N), 1 0 8 ≤ B j ( 1 ≤ j ≤ N ) 10
^8\le B_j(1\le j\le N) 10
8≤Bj(1≤j≤N);
( 12 12 12 分) A i ≤ 1.5 × 1 0 5 ( 1 ≤ i ≤ N ) A_i\le 1.5\times 10
^5(1\le i\le N) Ai≤1.5×10
5(1≤i≤N), B j = j ( 1 ≤ j ≤ N ) B_j = j(1\le j\le N) Bj=j(1≤j≤N);
( 13 13 13 分) B j = j ( 1 ≤ j ≤ N ) B_j=j(1\le j\le N) Bj=j(1≤j≤N);
( 14 14 14 分)无附加限定。
二分查找
对a,排序。
通过ib 罗列b。
和ib组成的项,i位数及以下的数目c:
{ a . l o w e r ( 1 0 i − i b ) a . b e g i n ( ) i ∈ [ 1 , 9 ] 0 i = = 0 a . s i z e ( ) i = = 10
\begin{cases} a.lower(10
^i-ib)_a.begin() & i \in[1,9] \\ 0 & i == 0 \\ a.size() & i == 10
\\ \end{cases} ⎩ ⎨ ⎧a.lower(10
i−ib)a.begin()0a.size()i∈[1,9]i==0i==10
代码
焦点代码
#include <iostream>#include <sstream>#include <vector>#include<map>#include<unordered_map>#include<set>#include<unordered_set>#include<string>#include<algorithm>#include<functional>#include<queue>#include <stack>#include<iomanip>#include<numeric>#include <math.h>#include <climits>#include<assert.h>#include<cstring>#include <bitset>using namespace std;template<class T = int>vector<T> Read(int n,const char* pFormat = "%d") { vector<T> ret(n); for(int i=0;i<n;i++) { scanf(pFormat, &ret[i]); } return ret;}template<class T = int>vector<T> Read( const char* pFormat = "%d") { int n; scanf("%d", &n); vector<T> ret; T d; while (n--) { scanf(pFormat, &d); ret.emplace_back(d); } return ret;}string ReadChar(int n) { string str; char ch; while (n--) { do { scanf("%c", &ch); } while (('\n' == ch)); str += ch; } return str;}template<class T1,class T2>void ReadTo(pair<T1, T2>& pr) { cin >> pr.first >> pr.second;}template<class INDEX_TYPE>class CBinarySearch{public: CBinarySearch(INDEX_TYPE iMinIndex, INDEX_TYPE iMaxIndex, INDEX_TYPE tol = 1) :m_iMin(iMinIndex), m_iMax(iMaxIndex), m_iTol(tol) {} template<class _Pr> INDEX_TYPE FindFrist(_Pr pr) { auto left = m_iMin - m_iTol; auto rightInclue = m_iMax; while (rightInclue - left > m_iTol) { const auto mid = left + (rightInclue - left) / 2; if (pr(mid)) { rightInclue = mid; } else { left = mid; } } return rightInclue; } template<class _Pr> INDEX_TYPE FindEnd(_Pr pr) { INDEX_TYPE leftInclude = m_iMin; INDEX_TYPE right = m_iMax + m_iTol; while (right - leftInclude > m_iTol) { const auto mid = leftInclude + (right - leftInclude) / 2; if (pr(mid)) { leftInclude = mid; } else { right = mid; } } return leftInclude; }protected: const INDEX_TYPE m_iMin, m_iMax, m_iTol;};class Solution {public: long long Ans(vector<int>& a, vector<int>& b) { const int N = a.size(); sort(a.begin(), a.end()); long long ans = 0; for (const auto& ib : b) { int cnt[11] = { 0 }; cnt[10
] = a.size(); int mul = 1; for (int i = 1; i < 10
; i++) { mul *= 10
; cnt[i] = lower_bound(a.begin(), a.end(), mul - ib) - a.begin(); } for (long long i = 1; i <= 10
; i++) { ans += (cnt[i] - cnt[i - 1]) * i; } } return ans; }};int main() {#ifdef _DEBUG freopen("a.in", "r", stdin);#endif // DEBUG int n; cin >> n ; auto a = Read<int>(n); auto b = Read<int>(n); #ifdef _DEBUG Out(a, "a="); Out(b, ",b=");#endif auto res = Solution().Ans(a,b); cout << res << endl; return 0;}
复制代码
单位测试
TEST_METHOD(TestMethod11) { a = { 97,79,7 }, b = { 20
,2,21 }; auto res = Solution().Ans(a,b); AssertEx(20
LL, res); } TEST_METHOD(TestMethod12) { a = { 8,97,996,9995 }, b = { 1,2,3,4 }; auto res = Solution().Ans(a, b); AssertEx(46
LL, res); } TEST_METHOD(TestMethod13) { a = { 500000000 }, b = { 500000000 }; auto res = Solution().Ans(a, b); AssertEx(10
LL, res); } TEST_METHOD(TestMethod14) { a = { 436981378,523812834,456708479,413571178,506402783,5982710
09,523936624 }, b = { 40120
310
4,501634329,506090236,527167431,485527116,439442403,568364549 }; auto res = Solution().Ans(a, b); AssertEx(46