华为ak
A.cpp
#include <bits/stdc++.h>
using namespace std;

int n;
typedef long long ll;
inline bool ok(ll i, ll j, ll k) {
    ll a = i*i+j*j;
    ll b = k*k;
    return a == b;
}


int main() {
    while (cin >> n) {
        // cout << ok(20, 48, 52) <<endl;
        int cnt = 0;
        for(int i=1; i<=n/3; i++) {
            for(int j=i; i+j+j<=n; j++) {
                int k = n-i-j;
                if(i+j > k && ok(i,j,k)) {
                    cnt++;
                    //cout << i <<" " << j <<" " << k<<endl;
                }
            }
        }
        printf("%d\n", cnt);
    }
    return 0;
}

B.cpp
#include <bits/stdc++.h>
using namespace std;

int mp[10][10];
int s[10];

int fa[100];
void init() {
    for(int i=0; i<60; i++)
        fa[i] = i;
}

int _fi(int x) {
    return fa[x] == x ? x : fa[x] = _fi(fa[x]);
}

void _merge(int u, int v) {
    int fu = _fi(u);
    int fv = _fi(v);
    fa[fu] = fv;
    return ;
}

bool ok(int u, int v) {
    if(u -1 == v || u + 1 == v || u-10 == v || u+10 == v)
        return true;
    return false;
}

int main() {
    while(~scanf("%d %d %d %d %d %d", &s[1], &s[2], &s[3], &s[4], &s[5], &s[6])) {
        init();
        for(int i=1; i<=6; i++) {
            for(int j=i+1; j<=6; j++) {
                int u = s[i], v = s[j];
                if(ok(u,v)) {
                    // cout << u <<" " << v <<endl;
                    _merge(i, j);
                }
            }
        }
        bool f = true;
        for(int i=2; i<=6; i++) {
            if(_fi(i) != _fi(i-1)) {
                f = false;
                break;
            }
        }
        if(f) puts("1");
        else puts("0");
    }
    return 0;
}
C.cpp 就是个LIS变形把
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
const int INF = 0x3f3f3f3f;

int n;
int s1[N], s2[N];
int pos[N];

unordered_map<int, int> mp1, mp2;
int dp[N];

int main() {
    while(~scanf("%d", &n)) {
        mp1.clear();
        mp2.clear();
        memset(pos, 0, sizeof(pos));
        for(int i=1; i<=n; i++) {
            scanf("%d", &s1[i]);
            mp1[s1[i]] = i;
        }
        for(int i=1; i<=n; i++) {
            scanf("%d", &s2[i]);
            mp2[s2[i]] = i;
        }
        for(int i=1; i<=n; i++) {
            pos[i] = mp2[s1[i]];
        }
        fill(dp, dp+n, INF);
        // pos[i] lis
        for(int i=1; i<=n; i++) {
            *lower_bound(dp, dp+n, pos[i]) = pos[i];
        }
        printf("%d\n", n - (lower_bound(dp, dp+n, INF) - dp));
    }
    return 0;
}