其实刚开始我想到了需要考虑o点和p点同时包含在a圆或者b圆中的情况;也考虑到了相切的情况
但是后来看题解后发现,在相切的时候,还需要满足o点和p点能够被包含在a圆或者b圆中
#include
#include
#include
#include
using namespace std;
const int N = 1e6 + 10;
#define de(x) cout << x << " ";
// int n, m, ans;
double px, py, ax, ay, bx, by;
double dis(double x1, double y1, double x2, double y2) {
return sqrt(1.0 * (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
void solve() {
cin >> px >> py >> ax >> ay >> bx >> by;
double ao = dis(0, 0, ax, ay);
double bo = dis(0, 0, bx, by);
double ap = dis(px, py, ax, ay);
double bp = dis(px, py, bx, by);
double ab = dis(ax, ay, bx, by);
double ans = 1e9;
ans = min(ans, max(ao, ap)); // 表示o点和p点在a圆中
ans = min(ans, max(bo, bp)); // 表示o点和p点在b圆中
// 表示o点和p点分别在a圆或者b圆中,此时还需要满足相切的条件
ans = min(ans, max(ab / 2, max(ap, bo)));
ans = min(ans, max(ab / 2, max(ao, bp)));
printf("%.10lf\n", ans);
}
int main() {
int T;
cin >> T;
while (T--) {
solve();
}
return 0;
}
看了官方题解才写出来,很巧妙
思路见代码注释
#include
using namespace std;
#define ll long long
#define sf(x) scanf("%d", &x);
#define de(x) cout << x << " ";
#define Pu puts("");
const int N = 2e4 + 9, mod = 1e9 + 7;
// int n, m;
string s;
ll pos;
ll len;
stack<char> q;
void solve() {
cin >> s >> pos;
pos--; // 注意下标是从0开始的
len = s.size();
while (!q.empty())
q.pop();
bool ok = (pos < len);
s += '$'; // 很小的ascll码
for (auto c : s) {
while (!ok && !q.empty() && q.top() > c) {
pos -= len; // 核心,使用线性的复杂度
// 我们只需要动一个就已经处理了当前长度len下的字符串
// 而且前面已经在栈中的我们不需要动,因为下一个len-1长度下
// 需要在栈中已有元素的基础上进行
len--;
q.pop();
if (pos < len)
ok = true; // 如果
}
q.push(c);
}
string tmp = "";
while (!q.empty())
tmp += q.top(), q.pop();
reverse(tmp.begin(), tmp.end()); // 注意这里需要翻转
// 因为我们得到的字符串是从后往前的
cout << tmp[pos];
}
int main() {
int T;
cin >> T;
while (T--) {
solve();
}
return 0;
}