二分题目,难在对细节的把握,改起来很容易烦躁,不想改了,重在坚持,边界问题改起来确实麻烦,注意一下就可以
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define int int64_t
using namespace std;
signed main() {ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);int t; cin >> t;while (t--) {int k; cin >> k;int l = 0, r = 5,ans;if (k < 6) {while (l <= r) {int mid = l + r >> 1;if (2 * mid * mid + 3 * mid + 1 <= k) ans = mid, l = mid + 1;else r = mid - 1;}}else {l = 1, r = 1e12;while (l <= r) {int mid = l + r >> 1;if (2 * mid + 3 <= (k - 1) / mid) ans = mid, l = mid + 1;else r = mid - 1;}}k -= 2 * ans * ans + 3 * ans + 1;if (!k) { cout << k << endl; continue; }ans++;if (k <= ans + 1) {cout << k - 1 << endl;}else if(k <= 3 * ans + 1){ k -= ans;cout << ans - k + 1 << endl;}else {k -= 3 * ans;cout << -ans + k - 1 << endl;}}return 0;
}