补题链接 (这场是几何专题,但其实只是打着这个幌子,而大部分是思维之类的)
A. Draw a Square
思路:签到题,只要判断四个点是否一致就行了。
void solve()
{
vector<int> a(4);
int flag = 0;
for (int i = 0; i < 4; i++){
cin >> a[i];
if (i>0){
if (a[i] != a[i-1]) flag = 1;
}
}
if (flag) cout << "No" << endl;
else cout << "Yes" << endl;
}
B. The Third Side
思路:贪心,选的顺序不重要,比如选a,b就可以自己设定第三边为(a+b-1),因此就可以贪心的一次计算完,总和减去(n-1)就行了。
void solve()
{
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
if (n == 1) {
cout << a[0] << endl;
return ;
}
int sum = accumulate(a.begin(), a.end(), 0)-n+1;
cout << sum << endl;
}
C. XOR and Triangle
思路:这题我的话主要是靠观察和guess一下,实现观察,实现将其转换成二进制,发现不能只有一个1,和不能没有0,然后对于第一个1取1,对于第二个1取0,因为y要小于x,对于0取1.
vector<int> a;
bool cal(int x){
int r1 = 0, r0 = 0;
a.clear();
ans = 0;
while(x){
int num = x%2;
a.push_back(num);
(num&1)? r1++ : r0++;
x /= 2;
}
if (r1 == 1 || r0 == 0) return false;
else return true;
}
void solve()
{
int n, m, k;
cin >> n;
int f1 = 0, f0 = 0;
ans = 0;
if (!cal(n)){
cout << -1 << endl;
return ;
}
else {
reverse(a.begin(), a.end());
for (auto num : a){
if (num&1) {
// cout << ans << endl;
if (!f1){
f1 = 1;
ans = ans*2;
}
else{
ans = ans*2+1;
}
}
else {
ans = ans*2+1;
}
}
cout << ans << endl;
}
}
D. Counting Points
思路:从每个圆的左端点枚举到右端点,根据勾股定理算它出的高H(即可取范围)存在map里取最大值,再统计一下:
struct node{
int x, r;
};
void solve()
{
int n, m;
cin >> n >> m;
vector<node> a(n);
for (int i = 0; i < n; i++) cin >> a[i].x;
for (int i = 0; i < n; i++) cin >> a[i].r;
map<int, int> ma;
for (auto [x, r]:a){
for (int pos = x-r; pos<=x+r; pos++){
int h = sqrt(r*r-(pos-x)*(pos-x));
ma[pos] = max(ma[pos], h);
}
}
int ans = 0;
for (auto [x, h]:ma){
ans += (2*(r+1)-1);
}
cout << ans << endl;
}
E. Empty Triangle
思路:不会交互题
每次往里问一个三角形会能弄出很多空间,因为这道题没有hack所以很多人用随机数都能过。
void answer(int x, int y, int z) {
cout << "! " << x << " " << y << " " << z << endl << flush;
}
int ask(int x, int y, int z) {
cout << "? " << x << " " << y << " " << z << endl << flush;
int r;
cin >> r;
if (r == 0) answer(x, y, z);
return r;
}
void go() {
int n;
cin >> n;
if (n == 3) {
answer(1, 2, 3);
return;
}
vector<int> a={1, 2, 3};
while (true) {
int r = ask(a[0], a[1], a[2]);
if (r == 0) return;
int x = 0, y = 1, z = 2;
int r1 = ask(r, a[x], a[y]);
if (r1 == 0) return;
int r2 = ask(r, a[x], a[z]);
if (r2 == 0) return;
a = {r, r1, r2};
}
}