リンク:https
://ac.nowcoder.com/acm/contest/5203/Cソース:Niuke.com
制限時間:C / C ++ 1秒、2秒言語、他の
スペースの制限:C / C ++ 131072K、他の言語262144K
64ビットIOフォーマット:LLDの%
スペースの制限:C / C ++ 131072K、他の言語262144K
64ビットIOフォーマット:LLDの%
タイトルの説明
[l、r]の範囲の完全な正方形の数を複数回クエリする
整数xを完全な二乗として定義するのは、y * y = xであるような整数yが見つかる場合に限ります。
説明を入力してください:
最初の行の数字nは、クエリ数
の後のクエリ数を示します。
出力の説明:
クエリごとに、答えを示す数値を出力します
例1
入力
5 1 3 1 4 2 4 4 4 1 1000000000
アウトプット
1 2 1 1 31622
備考:
n <= 100000
0 <= l <= r <= 1000000000
最初の前処理[0,1000000000] 合計のすべての完全な正方形31 623 番目(0 2〜31622 2)。
二分探索はl以上 の最初の完全な正方形の位置インデックスを見つけます。二分探索はrより大きい最初の完全な正方形の位置インデックスを見つけます。それを引くことが答えです。
それぞれlower_bound()とupper_bound()を使用できます
1 #include <bits / stdc ++。h> 2 typedef long long LL; 3 #define pb push_back 4 const int INF = 0x3f3f3f3f ; 5 const double eps = 1e- 8 ; 6 const int mod = 1e9 + 7 ; 7 const int maxn = 1e5 + 10 ; 8 名前空間std を使用 。 9 10 vector < int > vt; 11 12 整数 main() 13 { 14 #ifdef DEBUG 15 freopen(" sample.txt "、" r "、stdin); // freopen( "data.out"、 "w"、stdout); 16 #endif 17 18 for(int i = 0 ; i * i <= 1000000000 ; i ++ ) 19 vt.pb(i * i); 20 21 int T; 22 scanf(" %d "、&T); 23の 間(T-- ) 24 { 25 int l、r; 26 scanf(" %d%d "、&l、&r); 27 int pos1 = lower_bound(vt.begin()、vt.end()、l)-vt.begin(); 28 int pos2 = upper_bound(vt.begin()、vt.end()、r)-vt.begin(); 29 printf(" %d \ n "、pos2- pos1); 30 } 31 32 return 0 ; 33 }
-