点这里

A A Xor B problrm

两个数异或为零,意思就是两个数相等,可以说自己和自己也是一个数对 如果是两层循环会超时,所以开个数组来计算每个数出现的次数,个数的平方就是这个数可以构成的数对,最后加一起就可以了。

#include<bits/stdc++.h>
#define ll long long

using namespace std;

const int N = 1000010;

ll cnt[N];

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++){
        int x;
        cin >> x;
        cnt[x]++;
    }
    ll sum = 0;
    for (int i = 0; i < N; i++)sum += cnt[i] * cnt[i];
    cout << sum << endl;
    return 0;
}

B 吃苹果

每天吃一个苹果,选择白天或晚上吃会获得不一样的价值,但必须k填在晚上吃,那我们就必须选择晚上价值相对较高,也就是和白天的价值相差较大的苹果,如果不这样的话,很有可能把白天价值和晚上价值都很高的苹果吃了,就不是最优解了,晚上的价值就是相对价值较大的,白天价值大的就是相对价值较小的,一相对价值排序,然后加起来就可以了。

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 100010;

struct S{
    int da,ni,sum;
}a[N];

bool cmp(S a,S b){
    return a.sum>b.sum;
}

int main() {
    int n, k;
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> a[i].da >> a[i].ni;
        a[i].sum = a[i].ni - a[i].da;
    }
    sort(a, a + n, cmp);
    int ans = 0;
    for (int i = 0; i < k; i++)ans += a[i].ni;
    int cnt = 0;
    for (int i = n - 1;; i--) {
        ans += a[i].da, cnt++;
        if (cnt == n - k)break;
    }
    cout << ans << endl;
    return 0;
}

C n皇后

这题可以用四个数组来存储每个位置所在行,列,两条对角线,0表示没有皇后,1表示有,注意,这题数据范围超i过一百万,用scanf和printf来输入输出,cin和cout会超时,血的教训,或者关闭同步也可以。

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 1000010;

int h[N], l[N], d[N], nd[N];

int main() {
    int n, T;
    cin >> n >> T;
    while (T--) {
        int x, y;
        cin >> x >> y;
        if (!h[x] && !l[y] && !d[y - x + N] && !nd[y + x + N]) {
            cout << "Yes" << endl;
            h[x] = l[y] = 1;
            d[y - x] = nd[y + x] = 1;
        } else cout << "No" << endl;
    }
    return 0;
}

D 苹果

题意就是一个坐标系内,有一些苹果,并且用两条直线把他们分成四部分,统计有多少苹果,不存在在直线上的苹果。就是简单的判断判断一下在两条线的上下方即可 也就是判断直线方程的值大于,并用数组记录,最后排序即可。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#define ll long long

using namespace std;

const int N=100010;

int n;
int a, b, c, d, e, f;
int cnt[N];

int main() {
    cin >> n;
    cin >> a >> b >> c >> d >> e >> f;
    while (n--) {
        int x, y;
        cin >> x >> y;
        ll res1 = a * x + b * y + c;
        ll res2 = d * x + e * y + f;
        if (res1 > 0 && res2 > 0)cnt[1]++;
        else if (res1 > 0 && res2 < 0)cnt[2]++;
        else if (res1 < 0 && res2 > 0)cnt[3]++;
        else if (res1 < 0 && res2 < 0)cnt[4]++;
    }
    sort(cnt + 1, cnt + 5);
    for (int i = 1; i <= 4; i++)cout << cnt[i] << ' ';
    return 0;
}